gpt4 book ai didi

c# - 在 C# 中预分配文件空间?

转载 作者:可可西里 更新时间:2023-11-01 03:05:58 25 4
gpt4 key购买 nike

我正在创建一个下载应用程序,我希望在实际下载文件之前在硬盘驱动器上为这些文件预分配空间,因为它们可能相当大,而且没有人喜欢看到“此驱动器已满,请删除一些文件和再试一次。”因此,鉴于此,我写了这篇文章。

// Quick, and very dirty
System.IO.File.WriteAllBytes(filename, new byte[f.Length]);

至少在您下载一个数百 MB 或什至 GB 的文件并且如果不完全清除页面文件并完全杀死您的系统内存,您就会让 Windows 陷入狂热的狂潮之前,它是有效的。糟糕。

因此,有了更多启发,我开始使用以下算法。

using (FileStream outFile = System.IO.File.Create(filename))
{
// 4194304 = 4MB; loops from 1 block in so that we leave the loop one
// block short
byte[] buff = new byte[4194304];
for (int i = buff.Length; i < f.Length; i += buff.Length)
{
outFile.Write(buff, 0, buff.Length);
}
outFile.Write(buff, 0, f.Length % buff.Length);
}

这甚至可以正常工作,并且不会遇到上一个解决方案的严重内存问题。不过它仍然很慢,尤其是在较旧的硬件上,因为它会将(可能是 GB 的)数据写出到磁盘。

问题是:有没有更好的方法来完成同样的事情?有没有办法告诉 Windows 创建一个 x 大小的文件并简单地在文件系统上分配空间而不是实际写出大量数据。我根本不关心初始化文件中的数据(我正在使用的协议(protocol) - bittorrent - 为它发送的文件提供哈希值,因此随机未初始化数据的最坏情况是我得到一个幸运的巧合和文件的一部分是正确的)。

最佳答案

FileStream.SetLength是你想要的。语法:

public override void SetLength(
long value
)

关于c# - 在 C# 中预分配文件空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/98774/

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