在不下载整个blob的情况下检测多个GZip成员

时间:2017-01-15 21:30:31

标签: c# .net azure gzip azure-storage-blobs

  1. 我有一项服务,可以将blob从一个存储转换并传输到另一个存储。

  2. blob可以是gzip'或原始数据。

  3. 由于gzip框架.NET类的限制,我在单个gzip'ed blob中不允许多个成员。< / p>

  4. 我的目标是拒绝gzip中包含两个或更多 memebers O(1)个ed blob。

  5. O(1)我的意思是不读完整个blob或它的大部分内容。

  6. 我已经阅读了RFC,我有一种感觉:

    1. blob的大小

    2. 最后成员的ISIZE页脚

    3. 我们可以通过一些方法来确保假阳性的可能性非常低(即拒绝单个 memeber blob)和假阴性(即允许多个成员 blob)blob是单成员或多成员gzip。

      有没有人成功处理过这个问题? 感谢

1 个答案:

答案 0 :(得分:0)

我们可以使用内存流获取zip文件计数而无需将zip文件下载到本地目录。以下是我的测试示例演示,它适用于我。有关如何使用SDK操作Azure blob的更多详细信息,请参阅document。从系统dll添加System.IO.Compression.dll

CloudStorageAccount storageAccount = CloudStorageAccount.Parse("You connection string");

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

CloudBlobContainer container = blobClient.GetContainerReference("testcont"); //your container name

CloudBlockBlob blockBlob = container.GetBlockBlobReference("test.zip"); //blob name

using (var memoryStream = new MemoryStream())
{
      blockBlob.DownloadToStream(memoryStream);
      using (ZipArchive zip = new ZipArchive(memoryStream))
      {
          var count = zip.Entries.Count;
      }
      // Todo list   we can use CloudBlockBlob.StartCopy to copy blob to another storage  
}

enter image description here   有关CloudBlockBlob.StartCopy的更多信息,请参阅document

SDK信息请参考packages.config文件。

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Azure.KeyVault.Core" version="1.0.0" targetFramework="net452" />
  <package id="Microsoft.Data.Edm" version="5.7.0" targetFramework="net452" />
  <package id="Microsoft.Data.OData" version="5.7.0" targetFramework="net452" />
  <package id="Microsoft.Data.Services.Client" version="5.7.0" targetFramework="net452" />
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net452" />
  <package id="System.Spatial" version="5.7.0" targetFramework="net452" />
  <package id="WindowsAzure.Storage" version="8.0.1" targetFramework="net452" />
</packages>