Сжатие больших файлов с помощью класса .NET Framework ZipArchive на ASP.NET - PullRequest
0 голосов
/ 25 октября 2018

У меня есть код, который получает все файлы в каталоге, сжимает каждый из них и создает файл .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);
}

1 Ответ

0 голосов
/ 25 октября 2018

Когда вы создаете только zip-файл, замените ZipArchiveMode.Update на ZipArchiveMode.Create.

. Режим обновления предназначен для случаев, когда вам нужно удалить файлы из существующего архива или добавить новые файлы.в существующий архив.

В режиме обновления весь zip-файл загружается в память, так как он занимает много памяти для больших файлов.Поэтому этого режима следует избегать, когда это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...