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