2013-09-24 55 views
1

我需要從App_Data文件夾中打開文件,並且發現此代碼段,只是想知道這段代碼是否已優化。從App_data文件夾中讀取文件的代碼優化

我的文件可以是類型的.docx,文檔,.PDF

try 
     { 
      string path = Server.MapPath("~/App_Data/File.txt"); 


      //string = Server.MapPath(strRequest); 
      System.IO.FileInfo file = new System.IO.FileInfo(path); 
      if (file.Exists) 
      { 
       Response.Clear(); 
       Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 
       Response.AddHeader("Content-Length", file.Length.ToString()); 
       Response.ContentType = "application/...."; 
       Response.WriteFile(file.FullName); 
       Response.End(); 
      } 
      else 
      { 
       Response.Write("This file does not exist."); 
      } 
     } 


     catch (Exception rt) 
     { 
      // Response.Write(rt.Message); 
     } 

或使用該代碼段

FileStream MyFileStream;long FileSize; 
string path = Server.MapPath("~/App_Data/aspnetmvc-nerdinner_v1.pdf"); 
MyFileStream = new FileStream(path, FileMode.Open); 
FileSize = MyFileStream.Length; 
byte[] Buffer = new byte[(int)FileSize + 1]; 
MyFileStream.Read(Buffer, 0, (int)MyFileStream.Length); 
MyFileStream.Close(); 
Response.ContentType = "application/pdf"; 
Response.AddHeader("content-disposition", "attachment; filename=MyReport.PDF"); 
Response.BinaryWrite(Buffer); 

請推薦哪種方法我應該使用。我想要的簡單就是用戶點擊鏈接打開文檔。這個鏈接通過電子郵件發送給用戶。

UPDATE

其實我是想知道,如果使用的對象是否正確關閉,如果這個代碼在一個適當的方式處置這裏

+1

你有沒有考慮過使用'StopWatch'類來定時每個代碼片段? http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx –

+0

@JasonEvans,我會研究一下。 – Learning

+0

@JasonEvans,我實際上想知道如果使用的對象是正確關閉的,並且如果這個代碼在正確處理 – Learning

回答

0

兩個點,我們需要比較的是HttpResponse.WriteFile與代碼

FileSize = MyFileStream.Length; 
byte[] Buffer = new byte[(int)FileSize + 1]; 
MyFileStream.Read(Buffer, 0, (int)MyFileStream.Length); 
MyFileStream.Close(); 
Response.BinaryWrite(Buffer); 

我會建議HttpResponse.WriteFile因爲這樣做完全一樣的事情,但有一些更多的檢查是必要。上面的代碼也將文件放在內存中,這可能是大文件的問題。

這裏是HttpResponse.WriteFile

public void WriteFile(string filename, bool readIntoMemory) 
{ 
    if (filename == null) 
    { 
     throw new ArgumentNullException("filename"); 
    } 
    filename = this.GetNormalizedFilename(filename); 
    FileStream f = null; 
    try 
    { 
     f = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read); 
     if (this.UsingHttpWriter) 
     { 
      long length = f.Length; 
      if (length > 0L) 
      { 
       // this is false if you call the 
       // HttpResponse.WriteFile(string fileName) 
       if (readIntoMemory) 
       { 
        byte[] buffer = new byte[(int) length]; 
        int count = f.Read(buffer, 0, (int) length); 
        this._httpWriter.WriteBytes(buffer, 0, count); 
       } 
       else 
       { 
        f.Close(); 
        f = null; 
        this._httpWriter.WriteFile(filename, 0L, length); 
       } 
      } 
     } 
     else 
     { 
      this.WriteStreamAsText(f, 0L, -1L); 
     } 
    } 
    finally 
    { 
     if (f != null) 
     { 
      f.Close(); 
     } 
    } 
} 

裏面的代碼也使用HttpResponse.WriteFile是發送文件,而無需首先將存儲器上的完整文件,因爲你避免額外的內存填補,這是非常好的。

現在,如果我要去做相同的代碼,我會通過在有限的緩衝區部分中斷它來發送文件。

+0

這似乎是提前的事情。我願意接受任何更專業的方法。完整的代碼示例會很棒。 – Learning

+0

@KnowledgeSeeker用一個詞,用'Response.WriteFile'去吧 – Aristos

+0

這聽起來不錯。 – Learning