gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:19:46 24 4
gpt4 key购买 nike

我想使用 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 对象是执行此操作的最佳方法还是有更好的方法?

最佳答案

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

然而,虽然减少磁盘访问确实是一件好事,但当您准备读取文件的全部内容时,这不会对总体方案产生影响。所以 FileInfo 本身的性能才是你应该关注的。

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

所以您应该做的是使用 TransmitFile -- 不是因为它在访问磁盘时速度更快(可能会也可能不会),而是因为它使用的内存更少。

关于c# - 在C#中获取文件的文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15385032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com