我有一个代码,可以获取目录中的所有文件,压缩每个文件并创建一个.zip文件。 我正在使用System.IO.Compression命名空间中的.NET Framework ZipArchive类和扩展方法CreateEntryFromFile。 这很好用,除非处理大文件(约1GB或更大),否则会抛出System.IO.Stream异常“流太大”。
在MSDN的扩展方法参考文档{{link1:中}}中,它指出:
当ZipArchiveMode.Update存在时,条目的大小限制为Int32.MaxValue。这个限制是因为更新模式在内部使用MemoryStream来允许更新存档时所需的查找,并且MemoryStream的最大值等于int的大小。
所以这解释了我得到的异常,但没有进一步说明如何克服这种限制。我该如何允许大文件处理?
这是我的代码,它是一个类的一部分,以防万一,
在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);
}
ZipArchiveMode.Create
。 - Julo