Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#中的大文件?_C#_Out Of Memory_Iso - Fatal编程技术网

如何使用C#中的大文件?

如何使用C#中的大文件?,c#,out-of-memory,iso,C#,Out Of Memory,Iso,我想用C#处理一个大的.ISO文件。我想操纵它,从中添加和删除文件,并从中创建一个新的iso。我试过DiscUtils图书馆,但似乎无法使用。当我加载它(使用标准C#函数)时,我总是得到一个OutOfMemoryException。这是一个600MB的ISO(或多或少),我有2GB的RAM 我目前正在这样做: FileStream fs = new FileStream(FileDialog.FileName, FileMode.Open, FileAccess.

我想用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中删除/添加内容时,我可以将其加载到各个部分,还是必须将其加载到整个文件中

更新1:我使用以下方法限制缓冲区:

FileStream fs = new FileStream(FileDialog.FileName, FileMode.Open, FileAccess.Read,FileShare.Read,4096);
但还是什么都没有


我如何处理这个问题?

在C#中处理大文件的通常方法是使用一个函数,一次处理小文件块。但这取决于您的库是否能够处理文件流(如果您可以使用它或不使用它)。

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

以较小的块。您通常不需要同时使用内存中的所有数据。您是希望在
字节[]
中有一个大文件,还是希望读取.ISO文件的内容?您可能会因为一次读取的字节太多而导致内存异常。使用FileStream,您应该能够读取一个小数据块(例如4096字节),将其写入新文件,读取下一个数据块,依此类推。@dtb我了解到最好的方法是使用字节数组(字节[]),因此我将其加载到那个ErenErsönmez中。如何读取小数据块,但仍然检查MD5?如果您只想计算MD5,那么您根本不需要加载字节。只需将
传递给MD5实例即可。Nicolas Repiquet,我也读过这方面的内容并对其进行了测试,但我相信DiscUtils库无法使用它,因此这是不可能的。。。。