[英]Code optimisation for reading files from App_data folder
我需要從App_Data文件夾中打開文件,並且找到了此代碼段,只是想知道此代碼是否經過優化。
我的文件可以是.docx,doc,.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);
請建議我應該使用哪種方法。 我想簡單的是用戶單擊鏈接打開文檔。 並且此鏈接通過電子郵件發送給用戶。
更新
我實際上想知道用過的對象是否正確關閉,以及是否以正確的方式處理此代碼
這里需要比較的兩點是帶有代碼的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
發送文件時無需先在內存中添加完整文件,這非常好,因為避免了多余的內存填充。
現在,如果要編寫相同的代碼,我將通過在緩沖區有限的部分斷開文件來發送文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.