通过循环将数组的字节写入文件,每字节字节

时间:2014-06-01 01:39:04

标签: c#

我总是使用File.WriteAllBytes,但如果文件大于我可用的RAM,它就无法正常工作。 是否可以在每个字节写入文件字节并在进度条中显示进度? 如果可能,我可以在FileStream中执行吗? 谢谢你。

4 个答案:

答案 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的较低层不可能一次写入一个字节。如果禁用缓冲,您将最终得到以下事件序列:

  • 读取磁盘扇区(如果它尚未存在于文件缓存中)
  • 更新一个字节
  • 将整个扇区写回磁盘

启用缓冲后,您仍然会进行一堆额外的内核调用来更新文件缓存。内核调用是程序执行的更昂贵的事情之一。其中一个远不如实际磁盘I / O昂贵,但是16000个。

相反,选择适合内存的块大小,是磁盘簇大小和虚拟成员页面大小的倍数,并且可以完成大量工作。对于单个请求,小于64kB的开销太大。超过4 MB几乎没有任何好处。还要考虑需要多少次更新进度条才能进行更新"平滑" (除了I / O请求之外,进度条宽度中的块数多于像素,并且除了I / O请求之外,还浪费了UI更新处理。)

然后,使用带有字节数组的FileStream.Write重载并写入全部或部分数据。

答案 3 :(得分:-1)