C# .net 4.5 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))

我正在用C#构建一个很好的软件。目标版本:.net 4.5。其中一项核心工作是构建一个文件列表(包含在根文件夹中的各个目录和子目录中),然后一次压缩一个文件

我正在使用System.IO.Compression中包含的ZipArchive

代码如下:

 // 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等。