我无法确定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状态的以下信息:
知道如何实现这个目标吗?
答案 0 :(得分:0)
您是否特别想确定是否存在具有未提交块的Azure BlockBlob?
调用
Put Block List
后,阻止列表中指定的所有未提交的块都将作为新blob的一部分提交。未在Blob的阻止列表中指定的任何未提交的块将垃圾回收并从Blob服务中删除。如果在上一次成功Put Block
操作后的一周内,同一个blob上没有成功调用Put Block List
或Put Block
,则任何未提交的块也将垃圾回收 。如果在Blob上调用Put Blob,则任何未提交的块都将垃圾回收。
https://docs.microsoft.com/en-us/rest/api/storageservices/put-block