Цель: Удалить все файлы в указанном каталоге c, включая файлы во вложенных папках.
Проблема: Удаление самого каталога не приводит к работать, как это возвращает ошибку:
Исключение: указанный BLOB-объект не существует
Моя Azure структура хранения BLOB-объектов может выглядеть следующим образом:
AzureFileStorageAccount
AzureContainerName
/themes
/irrelevantstuff
/images
/a
1.jpg
/b
/thumb
1thumb.png
/c
4.jpg
6.jpg
9.jpg
10.jpg
Я не знаю, каково какое-либо из имен папок, но для конечного результата я хочу получить стек / список всех фактических файлов , найденных в данном каталоге.
Например, взяв каталог 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 function:
public static void ProcessFile(string innerDirectory) {
myStack.push(innerDirectory);
}
В конце этого у меня должен быть стек строк Uri BLOB-объектов, через которые я могу перебирать и удалять с помощью метода DeleteAsync
, поэтому удалите начальный каталог.
Это кажется излишним. У кого-нибудь есть идеи для более компактных, простых решений?