0

我正在尝试将整个 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(); 

更多细节

我正在从 azure blob 下载一个文件夹 ."myFolder" 及其内容作为 zip 文件,例如 myfolders.zip。

这是“myFolder”/azure blob 中的文件结构

我的文件夹/mymusic/test.mp3

我的文件夹/mytext/newtext.txt

我的文件夹/MyZipfiles/myzip.zip

我在上面发布的代码将生成文件夹的所有内容以创建“MyFolder.zip”并自动下载。现在如果您解压缩“MyFolder.zip”文件,由于某种原因,myzip.zip 已损坏.如果我尝试打开 myzip.zip 文件,它会显示一条消息“windows 无法打开文件夹,压缩的压缩文件夹“myzip.zip”无效”

请帮我找到一个解决方案,这样 .zip 文件就不会被损坏

我尝试下载到流媒体,但结果相同。,内部 zip 文件已损坏。所有其他文件类型都处于良好状态。zipOutputStream.PutNextEntry(entryName); destBlob.DownloadToStream(zipOutputStream);

4

2 回答 2

0

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

dBlob = blobClient.GetBlobReference(entryName.EndsWith(".zip") ? file.Uri.ToString() : xyzblob);                    
zipOutputStream.PutNextEntry(entryName);
dBlob.DownloadToStream(zipOutputStream);
于 2013-10-06T17:30:10.880 回答
0

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

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

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

于 2013-10-05T04:02:18.580 回答