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

4
我有一个代码,可以获取目录中的所有文件,压缩每个文件并创建一个.zip文件。 我正在使用System.IO.Compression命名空间中的.NET Framework ZipArchive类和扩展方法CreateEntryFromFile。 这很好用,除非处理大文件(约1GB或更大),否则会抛出System.IO.Stream异常“流太大”。
在MSDN的扩展方法参考文档{{link1:中}}中,它指出:
当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);
}

你是在创建一个新的压缩文件,还是在更新一个已有的压缩文件?如果你是在创建,为什么不使用创建模式呢?如果你是在更新一个已有的压缩文件,你需要重新设计流程来使用创建模式... - Julo
@Julo 我正在按照MSDN上的示例为目录中的每个现有文件创建一个新文件。到目前为止,它确实可以工作。 - David Ortega
然后使用 ZipArchiveMode.Create - Julo
@Julo,太好了!你能把它发布为答案,这样我就可以标记这个问题已解决吗? - David Ortega
1个回答

3

如果你只是创建一个zip文件,请将ZipArchiveMode.Update替换为ZipArchiveMode.Create

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

在更新模式下,整个zip文件会被加载到内存中,对于大文件而言,它会消耗大量的内存。因此,在可能的情况下应避免使用此模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接