在C#中获取文件的文件大小

时间:2013-03-13 12:14:51

标签: c# asp.net

我想使用ASP.Net中的自定义处理程序将文件写回客户端,并想知道以最少的处理时间执行此操作的最佳方法是什么。目前我有2个不同版本的代码执行相同的操作,但由于处理程序将被大量使用,我想知道最有效的方法是什么。

将完整文件加载到字节数组并使用BinaryWrite写入文件:

string filePath = context.Server.MapPath(context.Request.Url.LocalPath);
Byte[] swfFile = File.ReadAllBytes(filePath);
context.Response.AppendHeader("content-length", Utils.MakeString(swfFile.Length));
context.Response.ContentType = Utils.GetMimeType(Path.GetExtension(filePath));
context.Response.BinaryWrite(swfFile);

使用FileInfo对象确定文件长度并TransmitFile写入文件:

string filePath = context.Server.MapPath(context.Request.Url.LocalPath);
FileInfo fileInfo = new FileInfo(filePath);
context.Response.AppendHeader("content-length", Utils.MakeString(fileInfo.Length));
context.Response.ContentType = Utils.GetMimeType(Path.GetExtension(filePath));
context.Response.TransmitFile(filePath);

我怀疑TransmitFile方法是最有效的,因为它在没有缓冲文件的情况下写入。那个FileInfo对象怎么样?它如何计算文件大小?并且FileInfo对象是最好的方法,还是有更好的方法?

1 个答案:

答案 0 :(得分:3)

FileInfo向文件系统询问文件大小信息(当然,它不需要读取所有内容)。这通常被认为是一种“昂贵”的操作(与操作内存中的内容和调用方法相比),因为它会击中磁盘。

然而,尽管减少磁盘访问确实是一件好事,但是当你准备阅读文件的全部内容时,这对于宏观方案来说并没有什么不同。所以FileInfo本身的表现就是你应该关注的。

这里的第一个性能问题是第一种方法将整个文件保留在内存中,只要客户端下载它 - 这可能是巨大问题,因为(取决于文件的大小和客户端连接的吞吐量),它有可能大大增加应用程序的内存使用量。如果这种增加的内存使用量导致交换(即击中磁盘),性能将立即显示。

所以你应该做的是使用TransmitFile - 不是因为它在转到磁盘时会更快(它可能会也可能不会),但因为它占用的内存较少。