在 ASP.NET 上使用 .NET Framework ZipArchive class 压缩大文件
Compress large files using .NET Framework ZipArchive class on ASP.NET
我有一个代码可以获取目录中的所有文件,压缩每个文件并创建一个 .zip 文件。我在 System.IO.Compression 命名空间和扩展方法 CreateEntryFromFile 上使用 .NET Framework ZipArchive class。这很好用,除非在处理大文件(大约 1GB 及以上)时,它会抛出 System.IO.Stream Exception "Stream too large"
.
在 extension method reference on MSDN 上声明:
When ZipArchiveMode.Update is present, the size limit of an entry is limited to Int32.MaxValue. This limit is because update mode uses a MemoryStream internally to allow the seeking required when updating an archive, and MemoryStream has a maximum equal to the size of an int.
所以这解释了我得到的异常,但没有提供如何克服此限制的进一步方法。如何允许处理大文件?
这是我的代码,它是 class 的一部分,以防万一,GetDatabaseBackupFiles()
和 GetDatabaseCompressedBackupFiles()
函数 returns 我迭代的 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 文件。我在 System.IO.Compression 命名空间和扩展方法 CreateEntryFromFile 上使用 .NET Framework ZipArchive class。这很好用,除非在处理大文件(大约 1GB 及以上)时,它会抛出 System.IO.Stream Exception "Stream too large"
.
在 extension method reference on MSDN 上声明:
When ZipArchiveMode.Update is present, the size limit of an entry is limited to Int32.MaxValue. This limit is because update mode uses a MemoryStream internally to allow the seeking required when updating an archive, and MemoryStream has a maximum equal to the size of an int.
所以这解释了我得到的异常,但没有提供如何克服此限制的进一步方法。如何允许处理大文件?
这是我的代码,它是 class 的一部分,以防万一,GetDatabaseBackupFiles()
和 GetDatabaseCompressedBackupFiles()
函数 returns 我迭代的 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 文件都加载到内存中,大文件会占用大量内存。因此应尽可能避免这种模式。