无论如何要确定是否存在具有未提交块的Azure BlockBlob?

时间:2017-11-18 16:47:56

标签: c# azure azure-storage-blobs

我无法确定BlockBlob是否完全不存在或包含未提交的块。

请检查以下代码:

private CloudBlobContainer _BlobContainer;

private async Task BlobExistTest()
{
    // Get a reference to a non-existing blob:
    CloudBlockBlob blob1 = _BlobContainer.GetBlockBlobReference("Blob1.txt");

    // Add a block:
    MemoryStream blockData = new MemoryStream(Encoding.UTF8.GetBytes("Block data."));
    string blockId = Convert.ToBase64String(BitConverter.GetBytes(0));
    await blob1.PutBlockAsync(blockId, blockData, null);

    // Exists?
    bool blob1Exists = await blob1.ExistsAsync();
    var blob1BlockCount =  (await blob1.DownloadBlockListAsync(BlockListingFilter.All, null, null, null)).Count();

    // Results:
    //   - blob1Exits: false
    //   - blob1BlockCount: 1


    // Get a reference to a second non-existing blob:
    CloudBlockBlob blob2 = _BlobContainer.GetBlockBlobReference("Blob2.txt");

    // Exists?
    bool blob2Exists = await blob2.ExistsAsync();
    var blob2BlockCount =  (await blob2.DownloadBlockListAsync(BlockListingFilter.All, null, null, null)).Count();

    // Results:
    //   - blob2Exits: false
    //   - Exception on blob2.DownloadBlockListAsync(): The remote server returned an error: (404) Not Found.
}

在这两种情况下CloudBlockBlob.Exists()都返回false。 DownloadBlockList()可用于确定“不存在的”Blob实际存在且具有未提交的块。我不喜欢这个解决方案,因为它效率低,并且依赖于异常。

我认为问题在于,由未提交的块组成的Blob处于某种僵尸状态,无论是现有的还是不存在的Azure Storage API!

理想情况下,我希望获得有关blob状态的以下信息:

  • 存在
  • 根本不存在
  • 不存在,包含未提交的块

知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

您是否特别想确定是否存在具有未提交块的Azure BlockBlob?

  

调用Put Block List后,阻止列表中指定的所有未提交的块都将作为新blob的一部分提交。未在Blob的阻止列表中指定的任何未提交的块将垃圾回收并从Blob服务中删除。如果在上一次成功Put Block操作后的一周内,同一个blob上没有成功调用Put Block ListPut Block,则任何未提交的块也将垃圾回收 。如果在Blob上调用Put Blob,则任何未提交的块都将垃圾回收

https://docs.microsoft.com/en-us/rest/api/storageservices/put-block