【问题标题】:How can I work with a large file in C#?如何在 C# 中处理大文件?
【发布时间】:2012-11-14 08:49:08
【问题描述】:

我想在 C# 中处理一个大的 .ISO 文件。我想操作它,从中添加和删除文件,并从中创建一个新的 iso。我已经尝试过 DiscUtils 库,但似乎我无法让它工作。当我加载它(使用标准 C# 函数)时,我总是得到 OutOfMemoryException。这是一个 600MB 的 ISO(或多或少),我有 2GB 的 RAM。

我目前正在这样做:

                FileStream fs = new FileStream(FileDialog.FileName, FileMode.Open, FileAccess.Read);
                BinaryReader b = new BinaryReader(fs);


                byte[] buffer = b.ReadBytes((int)fs.Length);




                int count;                            // actual number of bytes read
                int sum = 0;
                while ((count = b.Read(buffer, (int)sum, (int)(buffer.Length - sum))) > 0)
                {
                    sum = sum + count;  // sum is a buffer offset for next reading
                }

它在“byte[] buffer = b.ReadBytes((int)fs.Length);”处抛出 OutOfMemoryException。当我在 ISO 中删除/添加内容时,我可以将其加载到部分中,还是必须是整个文件?

UPDATE1:我限制了缓冲区:

FileStream fs = new FileStream(FileDialog.FileName, FileMode.Open, FileAccess.Read,FileShare.Read,4096);

但还是一无所获。

我该如何处理?

【问题讨论】:

  • 小块。您通常不需要同时使用内存中的所有数据。
  • 您想要byte[] 中的大文件还是读取.ISO 文件的内容?
  • 您可能会遇到 OutOfMemoryException,因为您一次读取的字节太多。使用 FileStream,您应该能够读取一个小块(例如 4096 字节),将其写入新文件,读取下一个块,等等。
  • @dtb 我读到最好的方法是在一个字节数组(byte[])中,所以我将它加载到那个 ErenErsönmez 我怎样才能读取小块但仍然检查 MD5?
  • 如果您只想计算 MD5,那么您根本不需要加载字节。只需将 Stream 传递给 MD5 实例即可。

标签: c# out-of-memory iso


【解决方案1】:

在 C# 中处理大文件的常用方法是使用 FileStream 并一次处理小块。但它是否可以处理 FileStreams 取决于您的库是否可以使用它。

【讨论】:

    【解决方案2】:

    Memory-Mapped Files 是有效处理因太大而无法驻留在内存中的文件的方法。

    【讨论】:

    • Nicolas Repiquet,我也读到了这个并对其进行了测试,但我相信 DiscUtils 库不能使用它,所以这是不可能的......
    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 2014-05-22
    • 2015-08-19
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多