从包含其他.zip文件的文件夹生成zipOutputstream

问题描述 投票:0回答:2

我试图将整个azure blob存储文件夹及其内容转换为zip文件。在此文件夹中,我有不同类型的文件,例如.txt,.mp3,.zip文件。但是一旦文件夹转换为zip文件我注意到所有.zip文件类型都已损坏,。如何防止我的zip文件损坏。我正在使用Ionic.Zip library生成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);

c# asp.net-mvc azure-storage-blobs zipfile dotnetzip
2个回答
0
投票

我假设您已经尝试下载其中一个zip文件并打开它,对吧?

如果是这种情况,我建议的一件事是完全消除中间fileBytes数组。使用fileBytes作为fileStream的缓冲区,然后从fileStream读取到fileBytes可能是罪魁祸首。另一方面,你从偏移0开始并且无论如何都写到fileBytes的开头,所以它可能正常工作。

无论如何,更有效的解决方案是;您可以调用PutNextEntry,然后通过传入zip流本身来调用blob对象的DownloadToStream方法。这样就可以直接将整个blob复制到zip流中,而无需管理中间缓冲区。


0
投票

当它开始选择.zip文件时,我将BlobReference添加到.zip文件中,这就解决了这个问题

dBlob = blobClient.GetBlobReference(entryName.EndsWith(".zip") ? file.Uri.ToString() : xyzblob);                    
zipOutputStream.PutNextEntry(entryName);
dBlob.DownloadToStream(zipOutputStream);
© www.soinside.com 2019 - 2024. All rights reserved.