问题
I have a blob container in Azure called pictures
that has various folders within it (see snapshot below):
I'm trying to delete the folders titled users
and uploads
shown in the snapshot, but I keep the error: Failed to delete blob pictures/uploads/. Error: The specified blob does not exist.
Could anyone shed light on how I can delete those two folders? I haven't been able to uncover anything meaningful via Googling this issue.
Note: ask me for more information in case you need it
回答1:
Windows Azure Blob Storage does not have the concept of folders. The hierarchy is very simple: storage account > container > blob. In fact, removing a particular folder is removing all the blobs which start with the folder name. You can write the simple code as below to delete your folders:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("your storage account");
CloudBlobContainer container = storageAccount.CreateCloudBlobClient().GetContainerReference("pictures");
foreach (IListBlobItem blob in container.GetDirectoryReference("users").ListBlobs(true))
{
if (blob.GetType() == typeof(CloudBlob) || blob.GetType().BaseType == typeof(CloudBlob))
{
((CloudBlob)blob).DeleteIfExists();
}
}
container.GetDirectoryReference("users").ListBlobs(true) lists the blobs start with "users" within the "picture" container, you can then delete them individually. To delete other folders, you just need to specify like this GetDirectoryReference("your folder name").
回答2:
There is also a desktop storage explorer from Microsoft. It has a feature where you can select the virtual folder and then delete it effectively deleting all sub blobs.
https://azure.microsoft.com/en-us/features/storage-explorer/
回答3:
Its because the "folders" don't actually exist. In an Azure storage account, you have containers which are filled with blobs. What you see visualized by clients as "folders" are the file names of the blobs in the account "pictures/uploads/". If you want to remove the "folder", you actually have to remove each of the blobs that are named with the same "path".
The most common approach is to get a list of these blobs then feed that to the delete blob call.
回答4:
Let's start with an example how to delete a "folder" using ListBlobsSegmentedAsyc:
var container = // get container reference
var ctoken = new BlobContinuationToken();
do
{
var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
ctoken = result.ContinuationToken;
await Task.WhenAll(result.Results
.Select(item => (item as CloudBlob)?.DeleteIfExistsAsync())
.Where(task => task != null)
);
} while (ctoken != null);
What it does...
var ctoken = new BlobContinuationToken();
A "folder" may contain a lot of files. ListBlobSegmentedAsyc may return only a part of them. This token will store the info where to continue in next call.
var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
- First argument is the required blob name ("path") prefix.
- Second argument "useFlatBlobListing=true" tells the client to return all items in all sub folders. If set to false, it will run in "virtual folders" mode and behave like a file system.
- The ctoken will tell azure where to continue
For all arguments see https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.blob.cloudblobclient.listblobssegmentedasync?view=azure-dotnet for details.
(item as CloudBlob)?.DeleteIfExistsAsync()
Now we have a list of IListBlobItem in result.Results. Because an IListBlobItem is not guaranteed to be a deletable CloudBlob (e.g. it could be a virtual folder if we would have set useFlatBlobListing=false), we try to cast it and delete it if possible.
result.Results.Select(item => (item as CloudBlob)?.DeleteIfExistsAsync())
Triggers delete for all results and returns a list of tasks.
.Where(task => task != null)
If Results contained items we could not cast to CloudBlob, our list of tasks contains null values. We have to remove them.
... then we wait until all delete for current segment finished and continue with next segment if available.
回答5:
Now you can use lifecycle management to delete file with prefixMatch and action to
delete with property daysAfterModificationGreaterThan
. Leave the rule active for about 24 hours. And it will do the job. Documentation of lifecycle management available at https://docs.microsoft.com/en-us/azure/storage/blobs/storage-lifecycle-management-concepts
回答6:

来源:https://stackoverflow.com/questions/34727829/how-to-delete-a-folder-within-an-azure-blob-container