目标:删除特定目录中的所有文件,包括嵌套文件夹中的文件。
问题:删除目录本身不起作用,因为这会返回错误:
异常:指定的blob不存在
我的Azure blob存储结构可能如下所示:
AzureFileStorageAccount
AzureContainerName
/themes
/irrelevantstuff
/images
/a
1.jpg
/b
/thumb
1thumb.png
/c
4.jpg
6.jpg
9.jpg
10.jpg
我不知道文件夹的名称是什么,但是为了得到最终结果,我想获得在给定目录中找到的所有实际文件的堆栈/列表。 / p>
例如,使用images
目录:
/images/a/1.jpg
/images/b/thumb/1thumb.png
/images/c/4.jpg
/images/6.jpg
/images/9.jpg
/images/10.jpg
然后,将其全部删除。
这是我的尝试过的解决方案。
LoadInitialDirectory 函数:
public static void LoadInitialDirectory() {
string initialDirectory = "images";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(azureFileStorageAccount);
CloudBlobClient client = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference(azureContainerName);
CloudBlobDirectory directory = container.GetDirectoryReference(initialDirectory);
var blobs = await directory.ListBlobSegmentedAsync(false, BlobListingDetails.Metadata, 350, null, null, null);
foreach(var blob in blobs.Results)
{
var b = new CloudBlob(blob.Uri);
CloudBlockBlob blockBlob = container.GetBlockBlobReference(b.Name);
if (blockBlob.Exists()) {
// I will assume this is a file
ProcessFile(blockBlob.Uri);
}
else {
// This is another directory
ProcessDirectory(blockBlob.Uri);
}
}
}
ProcessDirectory 函数:
public static void ProcessDirectory(string innerDirectory) {
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(azureFileStorageAccount);
CloudBlobClient client = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference(azureContainerName);
CloudBlobDirectory directory = container.GetDirectoryReference(innerDirectory);
var blobs = await directory.ListBlobSegmentedAsync(false, BlobListingDetails.Metadata, 350, null, null, null);
foreach(var blob in blobs.Results)
{
var b = new CloudBlob(blob.Uri);
CloudBlockBlob blockBlob = container.GetBlockBlobReference(b.Name);
if (blockBlob.Exists()) {
ProcessFile(blockBlob.Uri);
}
else {
ProcessDirectory(blockBlob.Uri);
}
}
}
ProcessFile 函数:
public static void ProcessFile(string innerDirectory) {
myStack.push(innerDirectory);
}
最后,我应该有一堆Blob Uri字符串,可以通过DeleteAsync
方法进行迭代和删除,因此删除了初始目录。
这似乎太过分了。有人对更紧凑,更直接的解决方案有任何想法吗?
答案 0 :(得分:1)
您应该注意一件事:在Blob存储中,目录(和子目录)实际上被视为Blob名称的一部分。如果删除目录中的所有Blob,该目录将被自动删除。
删除目录(及其子目录)中所有blob的方法是列出所有blob,然后逐个删除blob。
假设您正在使用此Blob存储包Microsoft.Azure.Storage.Blob, version 11.1.3,则可以使用blobDirectory.ListBlobs()
方法并设置参数useFlatBlobListing as true
,该参数可让您遍历指定目录中的所有Blob(以及子目录中。
示例代码如下,并且对我有用:
var conn_str = "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxxxxx;EndpointSuffix=core.windows.net";
var myContainer = "aaa";
var myDirectory = "images";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(conn_str);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference(myContainer);
CloudBlobDirectory blobDirectory = blobContainer.GetDirectoryReference(myDirectory);
//set useFlatBlobListing as true, so you can list all the blobs in the directory(and it's sub-directories)
var blobs = blobDirectory.ListBlobs(useFlatBlobListing: true);
//iterate through all the blobs in the specified directory(and it's sub-directories)
foreach (var myblob in blobs)
{
var b = (CloudBlockBlob)myblob;
//print out some properties of the blob, just for testing purpose.
Console.WriteLine(b.Name);
Console.WriteLine(b.Uri);
Console.WriteLine("***********");
//delete the blob
b.Delete();
}
答案 1 :(得分:0)
如果可以从控制台完成,我强烈建议使用azure CLI和az storage blob delete-batch
命令。
有关更多信息,请参见此内容。 https://docs.microsoft.com/en-us/cli/azure/storage/blob?view=azure-cli-latest#az-storage-blob-delete-batch