【发布时间】:2015-02-06 07:37:28
【问题描述】:
我正在尝试使用以下代码将大型视频文件(~500MB)添加到 ArchiveEntry:
using (var zipFile = ZipFile.Open(outputZipFile, ZipArchiveMode.Update))
{
var zipEntry = zipFile.CreateEntry("largeVideoFile.avi");
using (var writer = new BinaryWriter(zipEntry.Open()))
{
using (FileStream fs = File.Open(@"largeVideoFile.avi", FileMode.Open))
{
var buffer = new byte[16 * 1024];
using (var data = new BinaryReader(fs))
{
int read;
while ((read = data.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer, 0, read);
}
}
}
}
}
我收到了错误
System.OutOfMemoryException
当 writer.Write 被调用时,我以为我使用了一个中间缓冲区......
知道如何解决这个问题吗?
【问题讨论】:
-
您可以通过删除读取器/写入器并使用 stream.copyto 来简化代码。怀疑它解决了问题。
-
看看
AddEntry(name, stream)(在调用Save之前不要关闭流)和AddFile(name, nameInFileSystem) -
@CodesInChaos:你的意思是使用
zipFile.CreateEntryFromFile-> 仍然不起作用。我接受了将 CPU 架构更改为 X64 的答案,但是当指定ZipArchiveMode.Update时,ZipArchiveEntry 的低效率值得指出(这会导致将 zip 的全部内容加载到内存中)
标签: c# out-of-memory zipfile