C# .net 4.5 ZipArchive-我的软件或库中存在内存泄漏?
我正在用C#构建一个很好的软件。目标版本:.net 4.5。其中一项核心工作是构建一个文件列表(包含在根文件夹中的各个目录和子目录中),然后一次压缩一个文件 我正在使用System.IO.Compression中包含的ZipArchive类 代码如下:C# .net 4.5 ZipArchive-我的软件或库中存在内存泄漏?,c#,.net,wpf,memory-leaks,C#,.net,Wpf,Memory Leaks,我正在用C#构建一个很好的软件。目标版本:.net 4.5。其中一项核心工作是构建一个文件列表(包含在根文件夹中的各个目录和子目录中),然后一次压缩一个文件 我正在使用System.IO.Compression中包含的ZipArchive类 代码如下: // STEP 1 using (var fs = new FileStream(destination_path + "\\" + zipname + ".zip", FileMode.OpenOrCreate))
// STEP 1
using (var fs = new FileStream(destination_path + "\\" + zipname + ".zip", FileMode.OpenOrCreate))
{
using (var zip = new ZipArchive(fs, ZipArchiveMode.Update))
{
// Some non important thing
foreach (string single_file in list_file_tobackup)
{
// non important things
zip.CreateEntryFromFile(single_file, temp);
}
}
}
// STEP 2
这是我在网上找到的一段代码。重要的是要说明(也许)此代码包含在静态类中的方法中,并从WPF窗口调用。此代码中使用的所有列表都是在静态类本身中声明的静态私有列表,因此它们将保留在内存中
有什么问题吗
当软件开始时(步骤1),它对RAM的内存影响很小(就像所有普通的小软件一样)。在所有的文件都被压缩并最终到达末尾(步骤2)之后,软件占用了大量ram,并且从未释放它
如果我尝试压缩一个非常大的文件夹(大约400MB),软件会在RAM上获取并保留(即使方法完成)近1GB的内存!如果我尝试一些更大的文件夹,它会崩溃(System.OutOfMemoryException)
只有我用一个小文件夹再次运行该方法,软件才能释放内存
起初,我认为内存泄漏是由内存中保存的大量文件造成的。然后我使用VisualStudio内存测试工具,发现所有的大块内存都属于ZipArchive类,因此我无法进行更深入的调试
我做错了什么,或者只是ZipAchive库不够好,不适合我做什么
如果是最后一个:存在一些更好的.zip库免费使用,无需太多许可证限制?
将模式设置为更新时,基础文件或流必须支持读取、写入和查找。整个存档的内容保存在内存中,在处置存档之前,不会将任何数据写入底层文件或流
您是否尝试过使用ZipArchiveMode.Create
如果您需要对现有存档执行更新,您仍然可以使用“通过复制现有存档创建”并创建新条目。Zip update方法将保留可能导致内存泄漏的新旧文件。使用ZipArchiveMode。创建正在工作!所有文件都添加了,没有问题。不幸的是,现在这个软件已经完全崩溃了:我问题中的代码片段在foreach循环中,所以我第二次运行它时,它只会覆盖以前的zip文件。。。我没有听懂最后一句话,你能更好地解释一下吗?如何创建更多ZipArchiveMode.Create实例以“更新”zip文件,该文件末尾只有一个包含我所有内容的.zip文件?我认为这是不可能的…根据您的使用情况,每次创建一个新的存档并简单地覆盖以前的存档是一个选项,也是最简单的。如果您试图压缩一个包含大量文件的非常大的目录,我将尝试创建第二个归档文件(基本上是副本),如果文件没有更改,则尝试复制zip条目并添加新条目。但是,这需要您执行diff等。