我总是使用File.WriteAllBytes,但如果文件大于我可用的RAM,它就无法正常工作。 是否可以在每个字节写入文件字节并在进度条中显示进度? 如果可能,我可以在FileStream中执行吗? 谢谢你。
答案 0 :(得分:1)
你绝对可以做到。
我希望以下信息可以帮助您。
http://msdn.microsoft.com/en-us/library/system.io.filestream.write(v=vs.110).aspx
如果你提供了一些很好的帮助你的代码。
感谢。
答案 1 :(得分:1)
您可以使用BinaryWriter
逐字节写入,或者更好地使用byte [] by byte [](可能更高效:在合理大小的块中截断字节流)
using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
{
bytes[] nextBytes = GetNextBytes() // your logic to get what to write;
writer.Write(nextBytes);
}
至于进度条,这是一个不同的问题,但您可以使用BackgroundWorker向GUI上的ProgressBar报告(how_many_bytes_you_wrote / total_bytes_to_write)。
答案 2 :(得分:0)
启用缓冲后,您仍然会进行一堆额外的内核调用来更新文件缓存。内核调用是程序执行的更昂贵的事情之一。其中一个远不如实际磁盘I / O昂贵,但是16000个。
相反,选择适合内存的块大小,是磁盘簇大小和虚拟成员页面大小的倍数,并且可以完成大量工作。对于单个请求,小于64kB的开销太大。超过4 MB几乎没有任何好处。还要考虑需要多少次更新进度条才能进行更新"平滑" (除了I / O请求之外,进度条宽度中的块数多于像素,并且除了I / O请求之外,还浪费了UI更新处理。)
然后,使用带有字节数组的FileStream.Write
重载并写入全部或部分数据。
答案 3 :(得分:-1)
尝试使用此BinaryWriter.Write
访问:http://msdn.microsoft.com/en-us/library/6tky7ax3%28v=vs.110%29.aspx