我有一个代码可以获取目录中的所有文件,压缩每个文件并创建一个 .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);
}