我无法确定一个BlockBlob是否完全不存在,还是包含未提交的块。
请查看以下代码:
private CloudBlobContainer _blobContainer;
private async Task BlobExistTest()
{
// Get a reference to a brand new (non-existing) blob:
CloudBlockBlob blob = _blobContainer.GetBlockBlobReference("Test.txt");
// Query Azure about blob
bool blobExists = await blob.ExistsAsync();
try{ var blobBlockCount = (await blob.DownloadBlockListAsync(BlockListingFilter.All, null, null, null)).Count(); }catch(Exception e){;}
// Results: Says blob doesn't exist at all on Azure (expected)
// - blobExists: false
// - Exception on blob.DownloadBlockListAsync(): The remote server
// Add a block:
MemoryStream blockData = new MemoryStream(Encoding.UTF8.GetBytes("Sample data for block"));
string blockId = Convert.ToBase64String(BitConverter.GetBytes(0));
await blob.PutBlockAsync(blockId, blockData, null);
// Query Azure - Now what does Azure say?
blobExists = await blob.ExistsAsync();
blobBlockCount = (await blob.DownloadBlockListAsync(BlockListingFilter.All, null, null, null)).Count();
// Results:
// - blobExists : false
// - blobBlockCount : 1
}
CloudBlockBlob.Exists()
即使存在未提交的块数据,也会返回false。为了确定“不存在”的Blob实际上存在并且有未提交的块,请使用
DownloadBlockList()
。我不喜欢这个解决方案,因为它效率低下,并且依赖于异常。
我认为问题在于由未提交的块组成的Blob处于一种僵尸状态,在Azure Storage API方面既存在又不存在!
理想情况下,我想知道一个Blob:
- 根本不存在 - 有未提交的块 - 存在且块已提交
您有什么想法来实现这一点吗?