我试图将整个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);
我假设您已经尝试下载其中一个zip文件并打开它,对吧?
如果是这种情况,我建议的一件事是完全消除中间fileBytes数组。使用fileBytes作为fileStream的缓冲区,然后从fileStream读取到fileBytes可能是罪魁祸首。另一方面,你从偏移0开始并且无论如何都写到fileBytes的开头,所以它可能正常工作。
无论如何,更有效的解决方案是;您可以调用PutNextEntry,然后通过传入zip流本身来调用blob对象的DownloadToStream方法。这样就可以直接将整个blob复制到zip流中,而无需管理中间缓冲区。
当它开始选择.zip文件时,我将BlobReference添加到.zip文件中,这就解决了这个问题
dBlob = blobClient.GetBlobReference(entryName.EndsWith(".zip") ? file.Uri.ToString() : xyzblob);
zipOutputStream.PutNextEntry(entryName);
dBlob.DownloadToStream(zipOutputStream);