gpt4 book ai didi

c# - 在 C# 中使用 BinaryWriter 将文件添加到 zip 文件时内存不足

转载 作者:太空宇宙 更新时间:2023-11-03 17:50:10 25 4
gpt4 key购买 nike

我正在尝试将文件添加到 Zip 文件,同时保留目录。只要我没有几个 100 Mb 的文件要压缩,下面的代码基本上就可以工作。如果我只是压缩一个目录,其中包含 1 个大约 250 Mb 的文件(顺便说一句,在内存充足的系统上),我会在 write.Write() 行上遇到 OutOfMemory 异常。

我已经修改了代码以分块读取,因为当我读取/写入整个文件时它首先失败了。不知道为什么还是失败了?

    using (FileStream zipToOpen = new FileStream(cZipName, eFileMode)) 
ZipArchiveEntry readmeEntry = archive.CreateEntry(cFileToBackup

);

using (BinaryWriter writer = new BinaryWriter(readmeEntry.Open()))
{
FileStream fsData = null; // Load file into FileStream
fsData = new FileStream(cFileFull, FileMode.Open, FileAccess.Read);
{
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = fsData.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer,0,bytesRead); // here it fails
fsData.Flush(); // ->CHANGED THIS TO writer.Flush() SOLVED IT - nearly..
}
}
fsData.Close();
}

编辑:Arkadiusz K 是对的,我对读者而不是作者使用了冲洗。更改后,程序会先压缩 1 Gb 或更大的文件,然后停在 100 Mb 处。但是,当我尝试压缩时出现另一个异常,例如一个 6 Gb 的文件 - 它停止于:System.IO.IOException was unhandled Stream was too long Source=mscorlib堆栈跟踪:在 System.IO.MemoryStream.Write(Byte[] 缓冲区,Int32 偏移量,Int32 计数)(等)

有人知道为什么它仍然失败吗?我会说代码现在应该一次正确地读写 1 Kb?

最佳答案

首先,我真的很想格式化您的代码并使其尽可能简洁:

var readmeEntry = archive.CreateEntry(cFileToBackup);
using (var fsData = new FileStream(cFileFull, FileMode.Open, FileAccess.Read))
using (var writer = new BinaryWriter(readmeEntry.Open()))
{
var buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fsData.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer, 0, bytesRead); // here it fails
writer.Flush();
}
}

现在,解释它失败的原因:

BinaryWriter 是一个流写入器。当它必须将数据写入流时,它通常将其写入长度前缀并且:

Length-prefixed means that this method first writes the length of the string, in bytes, when encoded with the BinaryWriter instance's current encoding to the stream. This value is written as an unsigned integer. This method then writes that many bytes to the stream.

为了写入文件,在您的情况下,数据首先写入 MemoryStream。在这里,MemoryStream 是后备存储流。引用下图:

Streams in .NET

(图片取自:http://kcshadow.net/wpdeveloper/sites/default/files/streamd3.png)

因为,要么你的系统内存大约是 6-8GB,要么因为你的应用程序只分配了那么多内存,当你试图压缩一个 6GB 的文件时,后备存储流被扩展到最大可能,然后抛出异常继续。

关于c# - 在 C# 中使用 BinaryWriter 将文件添加到 zip 文件时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32535169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com