【问题标题】:Generating a zipOutputstream from a folder having other .zip files in it从包含其他 .zip 文件的文件夹生成 zipOutputstream
【发布时间】:2013-10-10 23:45:22
【问题描述】:

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

更多细节

我正在从 azure blob 下载一个文件夹 ."myFolder" 及其内容作为 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-blob-storage zipfile dotnetzip


    【解决方案1】:

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

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

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

    【讨论】:

    • 我尝试了 PutNextEntry,然后通过传入 zip 流本身来调用 blob 对象的 DownloadToStream 方法,但没有运气。
    • 如果我手动打开 azure blob 文件夹,我的文件夹中的现有 zip 文件状态良好。但如果我以编程方式下载它们,它就会损坏
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多