C# 在ASP.NET上使用.NET Framework ZipArchive类压缩大型文件

C# 在ASP.NET上使用.NET Framework ZipArchive类压缩大型文件,c#,asp.net,zip,system.io.compression,C#,Asp.net,Zip,System.io.compression,我有一个代码,可以获取目录中的所有文件,压缩每个文件并创建一个.zip文件。我正在System.IO.Compression命名空间上使用.NET Framework ZipArchive类和扩展方法CreateEntryFromFile。除了在处理大文件(大约1GB及以上)时,它会抛出一个System.IO.Stream异常“Stream too large”,否则它工作得很好 它在报告中说: 存在ZipArchiveMode.Update时,条目的大小限制限制为Int32.MaxValue。

我有一个代码,可以获取目录中的所有文件,压缩每个文件并创建一个.zip文件。我正在System.IO.Compression命名空间上使用.NET Framework ZipArchive类和扩展方法CreateEntryFromFile。除了在处理大文件(大约1GB及以上)时,它会抛出一个
System.IO.Stream异常“Stream too large”
,否则它工作得很好

它在报告中说:

存在ZipArchiveMode.Update时,条目的大小限制限制为Int32.MaxValue。此限制是因为更新模式在内部使用MemoryStream来允许在更新存档文件时进行所需的查找,并且MemoryStream的最大值等于int的大小

因此,这解释了我得到的异常,但没有提供如何克服此限制的进一步方法。如何允许大文件处理

这是我的代码,它是类的一部分,以防万一,
GetDatabaseBackupFiles()
GetDatabaseCompressedBackupFiles()
函数返回我迭代的FileInfo对象列表:

public void CompressBackupFiles()
{
    var originalFiles = GetDatabaseBackupFiles();
    var compressedFiles = GetDatabaseCompressedBackupFiles();
    var pendingFiles = originalFiles.Where(c => compressedFiles.All(d => Path.GetFileName(d.Name) != Path.GetFileName(c.Name)));
    foreach (var file in pendingFiles)
    {
        var zipPath = Path.Combine(_options.ZippedBackupFilesBasePath, Path.GetFileNameWithoutExtension(file.Name) + ".zip");
        using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Update))
        {
             archive.CreateEntryFromFile(file.FullName, Path.GetFileName(file.Name));
        }
    }
    DeleteFiles(originalFiles);
}

仅创建zip文件时,请将
ZipArchiveMode.Update
替换为
ZipArchiveMode.Create

更新模式适用于需要从现有存档中删除文件或向现有存档中添加新文件的情况


在更新模式下,整个zip文件被加载到内存中,这会为大文件消耗大量内存。因此,应尽可能避免此模式。

您是在创建新的zip文件,还是在更新现有的zip文件?创建时,为什么不使用创建模式?更新现有zip文件时,需要重新执行此过程以使用create…@Julo我正在为目录中的每个现有文件创建一个新文件,如MSDN上的示例所示。到目前为止,它确实有效。然后使用
ZipArchiveMode。创建有效的
@Julo!你能把它作为答案贴出来,这样我就可以标记这个问题已经解决了吗?