Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 更新zip时出现内存不足异常_C#_.net_Out Of Memory - Fatal编程技术网

C# 更新zip时出现内存不足异常

C# 更新zip时出现内存不足异常,c#,.net,out-of-memory,C#,.net,Out Of Memory,在尝试将文件添加到.zip文件时,我遇到了OutofMemoryException。我使用32位体系结构来构建和运行应用程序 string[]filepath=Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)+“\\capture\\capture”); System.IO.Compression.ZipArchive zip=ZipFile.Open(file

在尝试将文件添加到.zip文件时,我遇到了
OutofMemoryException
。我使用32位体系结构来构建和运行应用程序

string[]filepath=Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)+“\\capture\\capture”);
System.IO.Compression.ZipArchive zip=ZipFile.Open(filePaths1[c],ZipArchiveMode.Update);
foreach(文件路径中的字符串文件路径)
{
字符串nm=Path.GetFileName(filePath);
CreateEntryFromFile(文件路径,“capture/”+nm,CompressionLevel.Optimal);
}
zip.Dispose();
zip=null;

我无法理解其背后的原因。

确切的原因取决于各种因素,但很可能您只是在档案中添加了太多内容。尝试使用
ZipArchiveMode.Create
选项,该选项将存档直接写入磁盘,而不将其缓存在内存中

如果您确实在尝试更新现有存档,您仍然可以使用
ZipArchiveMode.Create
。但它需要打开现有的归档文件,将其所有内容复制到新的归档文件(使用
Create
),然后添加新内容

如果没有异常,就不可能确定异常来自何处,更不用说如何修复它

编辑:

以下是我所说的“…打开现有存档,将其所有内容复制到新存档(使用
Create
),然后添加新内容”:


或者类似的。由于缺少一个好的、最少的、完整的代码示例,我只是在浏览器中编写了上面的代码。我没有试图编译它,更不用说测试它了。您可能需要调整一些细节(例如临时文件的处理)。但希望你能明白。原因很简单。OutOfMemoryException表示内存不足,无法执行

压缩会消耗大量内存。不能保证改变逻辑就能解决问题。但是你可以考虑用不同的方法来减轻它。

一,。 因为您的主程序必须是32位,所以您可以考虑启动另一个64位进程来进行压缩(使用<代码>系统。64位进程完成任务并退出后,32位主程序可以继续。您可以简单地使用系统上已经安装的工具,或者自己编写一个简单的程序

二,。 另一种方法是在每次添加条目时进行处理。
ZipArchive.Dispose
保存文件。每次迭代后,可以释放为
ZipArchive
分配的内存

foreach (String filePath in filePaths)
{
    System.IO.Compression.ZipArchive zip = ZipFile.Open(filePaths1[c], ZipArchiveMode.Update);
    string nm = Path.GetFileName(filePath);
    zip.CreateEntryFromFile(filePath, "capture/" + nm, CompressionLevel.Optimal);
    zip.Dispose();
}

这种方法并不简单,也可能不如第一种方法有效。

编译为64位可能会解决您的问题。或者,使用
CompressionLevel.faster
CompressionLevel.NoCompression
值得一试。我无法编译为64位,因为我的项目中使用了一些32位的库。请您给我举一个使用ZipArchiveMode更新zip的例子。Create如前所述,关于更新/创建选项,状态:将模式设置为“更新”时,基础文件或流必须支持读取、写入和查找。整个存档的内容保存在内存中,在处置存档之前,不会将任何数据写入底层文件或流。“只需将其添加到此处,即可轻松找到正式信息。若要添加,您需要复制条目写入时间,以保留条目文件日期。例如,在初始化entryTo后的行上:
entryTo.LastWriteTime=entryFrom.LastWriteTime有趣,添加了压缩级别。最佳
神奇地修复了我的
OutOfMemory
问题!
foreach (String filePath in filePaths)
{
    System.IO.Compression.ZipArchive zip = ZipFile.Open(filePaths1[c], ZipArchiveMode.Update);
    string nm = Path.GetFileName(filePath);
    zip.CreateEntryFromFile(filePath, "capture/" + nm, CompressionLevel.Optimal);
    zip.Dispose();
}