【问题标题】:How to write big files with BinaryWriter如何使用 BinaryWriter 写入大文件
【发布时间】:2012-07-18 12:59:05
【问题描述】:

我有一些编写大型二进制文件的程序。我遇到了这个问题:有时我的程序在文件写入时崩溃而没有抛出任何错误(块捕获不执行。我编写了一些测试控制台应用程序来查找并修复这个问题。像这样的东西:

static void Main(string[] args)
{
    for (int j = 0; j < 100; j++)
    {
        string fileName = @"D:\Users\nimci\Desktop\buf\"+j+".bin";
        using (var output =
            new BinaryWriter(File.Open(fileName, FileMode.Create, FileAccess.Write)))
        {
            for (int i = 0; i < 4000000; i++)
            {
                output.Write(i);
                //if(i%1000==0)   Thread.Sleep(1);
            }
        }
    }
}

我有这样的结果:有些文件的大小为 0。例如编号为 8、10、15、17、...的文件

在我家(功能较弱)的计算机上,所有文件都已正确写入,在我的工作计算机上,其中一些文件的大小为 0。如果我取消注释 Thread.Sleep(1); (或以其他方式减慢我的程序)所有文件在我的工作计算机上也是正确的,但是这样的“修复”在我的服务器计算机上不起作用。 谁能解释发生了什么错误,我该如何解决? 我尝试使用 try-cath-finally 代替使用,但 catch 块不会捕获此错误。

【问题讨论】:

  • 没关系,但你能确认 output.Close() 作为你 using 块的最后一行没有帮助吗?
  • 无法复制。 using 应该负责关闭和处理,所以我将其写为评论,但我会尝试在内部循环之后插入 output.Flush();
  • output.Flush();没有帮助。仍然是 0 大小的文件。

标签: c# binaryfiles binarywriter


【解决方案1】:

尝试添加 Flush:

        for (int i = 0; i < 4000000; i++)         
        {         
            output.Write(i);         
            //if(i%1000==0)   Thread.Sleep(1);         
        }  
        output.Flush(); 

【讨论】:

  • ReadAllBytes 和 WriteAllBytes 在网络上尤其是处理大文件时表现不佳,这绝对不值得。
  • 在我的程序中,我需要将数组保存在二进制文件中。二进制编写器具有 write(int) 方法。此方法处理来自 int 值的咬并将它们写入流。字节为什么我参加 0 大小的文件?
  • @hometoast - 是的,我也意识到了这一点。
  • 输出.Flush();没有帮助。仍然是 0 大小的文件。
  • 我能够重现该问题,但只有在我运行了一次测试之后。一些文件被报告为 0 字节文件,但实际上,所有数据都存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多