2

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

在MSDN上的扩展方法参考中,它指出:

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

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

这是我的代码,它是类的一部分,以防万一,GetDatabaseBackupFiles()and 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);
}
4

1 回答 1

3

当您只创建一个 zip 文件时,请将ZipArchiveMode.Update.ZipArchiveMode.Create

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

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

于 2018-10-25T03:06:19.790 回答