C# 从App_数据文件夹读取文件的代码优化
我需要打开App_数据文件夹中的文件,我找到了这个代码片段,只是想知道这个代码是否经过优化 I文件可以是.docx、doc、.pdf类型C# 从App_数据文件夹读取文件的代码优化,c#,asp.net,C#,Asp.net,我需要打开App_数据文件夹中的文件,我找到了这个代码片段,只是想知道这个代码是否经过优化 I文件可以是.docx、doc、.pdf类型 try { string path = Server.MapPath("~/App_Data/File.txt"); //string = Server.MapPath(strRequest); System.IO.FileInfo file = new System
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);
请推荐我应该使用的方法。我想要的是用户点击链接打开文档。此链接通过电子邮件发送给用户
更新
实际上,我想知道使用的对象是否正确关闭,以及此代码是否以正确的方式处理这里我们需要比较的两点是
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的内部代码
您还可以使用HttpResponse.WriteFile发送文件,而不首先在内存中添加完整的文件,这非常好,因为您可以避免额外的内存填充
现在,如果我要编写相同的代码,我将通过在有限缓冲区的部分中断来发送文件。您是否考虑过使用秒表类对每个代码段计时@JasonEvans,我将对此进行研究。@JasonEvans,我实际上想知道使用的对象是否正确关闭,以及这段代码是否以适当的方式处理,所以不是性能问题。好的,我再看一看。这似乎是一件很先进的事情。我愿意接受任何更专业的方法。完整的代码示例将非常好。@KnowledgeSeeker只需一个单词,就可以使用Response.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();
}
}
}