Как удалить файлы из контейнера blob?

private readonly CloudBlobContainer _blobContainer;

public void Remove()
{
    if (_blobContainer.Exists())
    {
       _blobContainer.Delete();
    }
}

Как удалить не весь контейнер, а некоторый List<string> disks, который находится в контейнере?

Ответ 1

Это код, который я использую:

private CloudBlobContainer blobContainer;

public void DeleteFile(string uniqueFileIdentifier)
{
    this.AssertBlobContainer();

    var blob = this.blobContainer.GetBlockBlobReference(fileName);
    blob.DeleteIfExists();
}

private void AssertBlobContainer()
{
    // only do once
    if (this.blobContainer == null)
    {
        lock (this.blobContainerLockObj)
        {
            if (this.blobContainer == null)
            {
                var client = this.cloudStorageAccount.CreateCloudBlobClient();

                this.blobContainer = client.GetContainerReference(this.containerName.ToLowerInvariant());

                if (!this.blobContainer.Exists())
                {
                    throw new CustomRuntimeException("Container {0} does not exist in azure account", containerName);
                }
            }
        }
    }

    if (this.blobContainer == null) throw new NullReferenceException("Blob Empty");
}

Вы можете игнорировать код блокировки, если знаете, что это не будет доступно одновременно.

Очевидно, что вы отсортировали содержимое blobContainer, поэтому все, что вам нужно, это метод DeleteFile без this.AssertBlobContainer().

Ответ 2

List<string> FileNameList = new List<string>();
FileNameList = fileName.Split(',').Where(t => t.ToString().Trim() != "").ToList();
CloudBlobClient client;
CloudBlobContainer container;
CloudBlockBlob blob;
string accessKey;
string accountName;
string connectionString;
accessKey = Environment.GetEnvironmentVariable("StorageAccountaccessKey");
accountName = Environment.GetEnvironmentVariable("StorageAccountName");
connectionString = Environment.GetEnvironmentVariable("StorageAccountConnectionString");
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
client = storageAccount.CreateCloudBlobClient();
string containerName = tenantId;
container = client.GetContainerReference(containerName);

foreach(var file in FileNameList)
{
   blob = container.GetBlockBlobReference(file);
   blob.DeleteIfExists();
}

Ответ 3

Мы можем использовать cloudBlobContainer.ListBlobsSegmentedAsync чтобы cloudBlobContainer.ListBlobsSegmentedAsync список cloudBlobContainer.ListBlobsSegmentedAsync объектов, а затем привести их к типу ICloudBlob чтобы вы могли выполнить DeleteIfExistsAsync. Ниже приведена функция рабочего образца. Надеюсь, поможет.

public async Task < bool > PerformTasks() {
    try {
        if (CloudStorageAccount.TryParse(StorageConnectionString, out CloudStorageAccount cloudStorageAccount)) {
            var cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
            var cloudBlobContainer = cloudBlobClient.GetContainerReference(_blobContainerName);
            if (await cloudBlobContainer.ExistsAsync()) {
                BlobContinuationToken blobContinuationToken = null;
                var blobList = await cloudBlobContainer.ListBlobsSegmentedAsync(blobContinuationToken);
                foreach(var item in blobList.Results.Select(blb = >blb as ICloudBlob)) {
                    await item.DeleteIfExistsAsync();
                }
            }
            else {
                _logger.LogError(ErrorMessages.NoStorageConnectionStringAvailable);
            }
        }
        else {
            _logger.LogError(ErrorMessages.NoStorageConnectionStringAvailable);
        }
    }
    catch(Exception ex) {
        _logger.LogError(ex.Message);
    }
    return false;
}