Создание zipOutputstream из папки, содержащей другие файлы .zip

Я пытаюсь преобразовать всю папку хранилища Azure blob и ее содержимое в zip-файл. Внутри этой папки у меня есть файлы разных типов, например, .txt, .mp3, .zip. Но как только папка преобразуется в zip-файл Я заметил, что все типы файлов .zip были повреждены. Как я могу предотвратить повреждение моих zip-файлов. Я использую библиотеку Ionic.Zip для создания zip-файлов.

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

var allFiles = directory.ListBlobs(new BlobRequestOptions { UseFlatBlobListing = true }).Where(x => x.GetType() == typeof(CloudBlockBlob)).Cast<CloudBlob>();

string xyzblob = directory.Uri.ToString().TrimEnd('/');
var dBlob = blobClient.GetBlobReference(xyzblob);
byte[] fileBytes = null;
fileBytes = dBlob.DownloadByteArray();
foreach (var file in allFiles)
{
    using (var fileStream = new MemoryStream(fileBytes))
    {
        var entryName = file.Uri.ToString().Replace(directory.Uri.ToString(), "");
         zipOutputStream.PutNextEntry(entryName);
         fileStream.Seek(0, SeekOrigin.Begin);
         int count = fileStream.Read(fileBytes, 0, fileBytes.Length);
         while (count > 0)
         {
             zipOutputStream.Write(fileBytes, 0, count);

            count = fileStream.Read(fileBytes, 0, fileBytes.Length);
            if (!Response.IsClientConnected)
            {
                break;
            }
            Response.Flush();
        }
        fileStream.Close();
     }
}
zipOutputStream.Close(); 

Подробнее

Я загружаю папку "myFolder" и ее содержимое из Azure blob в виде zip-файла, например myfolders.zip.

Вот как файловая структура внутри "myFolder" / azure blob

MyFolder / mymusic / test.mp3

MyFolder / mytext / newtext.txt

MyFolder / MyZipfiles / myzip.zip

Мой код, который я разместил выше, сгенерирует zip все содержимое папки для создания «MyFolder.zip» и загрузится автоматически. Теперь, если вы разархивируете файл «MyFolder.zip», по какой-то причине myzip.zip будет поврежден .Если я пытаюсь открыть файл myzip.zip, отображается сообщение «Windows не может открыть папку, сжатая заархивированная папка« myzip.zip »недействительна»

Пожалуйста, помогите мне найти решение, чтобы файлы .zip не были повреждены

Я попытался загрузить в поток, но результаты те же., Внутренние zip-файлы повреждаются. Все остальные типы файлов в хорошем состоянии. zipOutputStream.PutNextEntry (entryName); destBlob.DownloadToStream (zipOutputStream);


person Millar    schedule 04.10.2013    source источник


Ответы (2)


Я предполагаю, что вы уже пытались загрузить один из этих zip-файлов и открыть его, верно?

В таком случае я бы предложил полностью исключить промежуточный массив fileBytes. Причиной может быть использование fileBytes в качестве буфера для fileStream и последующее чтение из fileStream в fileBytes. С другой стороны, вы начинаете со смещения 0 и все равно пишете в начало fileBytes, поэтому он может работать нормально.

В любом случае более эффективное решение; вы можете вызвать PutNextEntry, а затем вызвать метод DownloadToStream объекта большого двоичного объекта, передав сам zip-поток. Это просто скопировало бы весь blob прямо в zip-поток без необходимости управлять промежуточным буфером.

person Serdar Ozler    schedule 05.10.2013
comment
Я попробовал PutNextEntry, а затем вызвал метод DownloadToStream объекта blob, передав сам zip-поток, но безуспешно. - person Millar; 05.10.2013
comment
Если я вручную открою папку Azure blob, и существующий zip-файл внутри моей папки будет в хорошем состоянии. Но если я загружу их программно, он будет поврежден - person Millar; 05.10.2013

Когда он начинает выбирать файл .zip, я добавил BlobReference в файл .zip, и это решило проблему.

dBlob = blobClient.GetBlobReference(entryName.EndsWith(".zip") ? file.Uri.ToString() : xyzblob);                    
zipOutputStream.PutNextEntry(entryName);
dBlob.DownloadToStream(zipOutputStream);
person Millar    schedule 06.10.2013