我有一个非常简单的问题(希望如此!)- 我想找出是否在特定容器中存在一个由我定义名称的 blob。 如果它存在,我将下载它,如果不存在,我将执行其他操作。
我在互联网上进行了一些搜索,显然曾经有一个名为 DoesExist 或类似名称的函数...但是就像许多 Azure API 一样,它似乎已经消失了(或者如果存在,那它有一个非常巧妙的伪装名称)。
我有一个非常简单的问题(希望如此!)- 我想找出是否在特定容器中存在一个由我定义名称的 blob。 如果它存在,我将下载它,如果不存在,我将执行其他操作。
我在互联网上进行了一些搜索,显然曾经有一个名为 DoesExist 或类似名称的函数...但是就像许多 Azure API 一样,它似乎已经消失了(或者如果存在,那它有一个非常巧妙的伪装名称)。
虽然这里的大多数答案在技术上是正确的,但大多数代码示例都是使用同步/阻塞调用的。除非您受到非常老的平台或代码库的限制,否则应该始终异步执行HTTP调用,并且在这种情况下,SDK完全支持它。只需使用ExistsAsync()
而不是Exists()
即可。
bool exists = await client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.ExistsAsync();
Exists()
是同步的,因为它会阻塞线程直到完成。 await ExistsAsync()
是异步的,因为它不会这样做。两者都遵循相同的“逻辑”流程,即下一行代码在前一行完成后才开始,但正是ExistsAsync
的非阻塞性使其成为异步。 - Todd Menier使用更新的SDK,一旦您拥有CloudBlobReference,就可以在引用上调用Exists()方法。
使用新的v12 SDK的Java版本
这使用共享密钥凭据授权(帐户访问密钥)
public void downloadBlobIfExists(String accountName, String accountKey, String containerName, String blobName) {
// create a storage client using creds
StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
String endpoint = String.format(Locale.ROOT, "https://%s.blob.core.windows.net", accountName);
BlobServiceClient storageClient = new BlobServiceClientBuilder().credential(credential).endpoint(endpoint).buildClient();
BlobContainerClient container = storageClient.getBlobContainerClient(containerName);
BlobClient blob = container.getBlobClient(blobName);
if (blob.exists()) {
// download blob
} else {
// do something else
}
}