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

时间:2013-10-04 04:45:48

标签: c# asp.net-mvc azure-storage-blobs zipfile dotnetzip

我正在尝试将整个azure blob存储文件夹及其内容转换为zip文件。在此文件夹中,我有不同类型的文件,例如.txt,.mp3,.zip文件。但是一旦文件夹被转换对于zip文件,我注意到所有.zip文件类型都已损坏,如何防止我的zip文件损坏。我正在使用Ionic.Zip library生成zip文件

以下是我正在使用的代码此处我可以使用所有其他文件类型 成功生成并下载zip文件,但内部zip文件除外/ em>的

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);

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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