У меня есть код, который получает все файлы в каталоге, сжимает каждый из них и создает файл .zip.Я использую класс .NET Framework ZipArchive в пространстве имен System.IO.Compression и метод расширения CreateEntryFromFile.Это работает хорошо, за исключением того, что при обработке больших файлов (приблизительно 1 ГБ и более) туда выдается System.IO.Stream Exception "Stream too large"
.
В ссылке на метод расширения в MSDN указано, что:
Когда ZipArchiveMode.Update присутствует, ограничение размера записи ограничено Int32.MaxValue.Это ограничение связано с тем, что в режиме обновления внутренне используется MemoryStream для разрешения поиска, необходимого при обновлении архива, а максимальный размер MemoryStream равен размеру целого.
Так что это объясняет полученное исключение,но не дает дальнейшего пути преодоления этого ограничения.Как я могу разрешить обработку больших файлов?
Вот мой код, его часть класса, на всякий случай, функции 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);
}