programing

Azure BLOB 컨테이너 내의 폴더를 삭제하는 방법

stoneblock 2023. 4. 29. 08:16

Azure BLOB 컨테이너 내의 폴더를 삭제하는 방법

에 나는에컨테이있너가습다니b▁in▁blob있다니습▁i▁blo▁az▁a▁have가▁container테너ureure라는 블롭 용기를 가지고 있습니다.pictures다양한 폴더가 있는 경우(아래 스냅샷 참조):

여기에 이미지 설명 입력

다음제목폴삭합니다고려제하더를라는 제목의 .users그리고.uploads되지만 다음합니다.Failed to delete blob pictures/uploads/. Error: The specified blob does not exist.누가 제가 그 두 폴더를 어떻게 삭제할 수 있는지 알려주실 수 있나요?저는 이 문제에 대해 구글링을 통해 의미 있는 것을 발견할 수 없었습니다.

참고: 필요한 경우 추가 정보를 요청하십시오.

Windows Azure Blob Storage에는 폴더 개념이 없습니다.계층 구조는 매우 간단합니다: 저장 계정 > 컨테이너 > blob.실제로 특정 폴더를 제거하면 폴더 이름으로 시작하는 모든 블롭이 제거됩니다.아래와 같이 간단한 코드를 작성하여 폴더를 삭제할 수 있습니다.

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();
    }
}

용기디렉토리 참조("사용자")를 가져옵니다.ListBlobs(true)는 "그림" 컨테이너 내의 "사용자"로 시작하는 블롭을 나열한 다음 개별적으로 삭제할 수 있습니다.다른 폴더를 삭제하려면 GetDirectoryReference("폴더 이름")와 같이 지정하면 됩니다.

마이크로소프트의 데스크톱 스토리지 탐색기도 있습니다.가상 폴더를 선택한 후 삭제하여 모든 하위 블로그를 효과적으로 삭제할 수 있는 기능이 있습니다.

https://azure.microsoft.com/en-us/features/storage-explorer/

최근 레포에서, Azure.보관소.블롭스, 그건 아주 간단합니다.

var connectionString = "blob-connection-string";
var containerName = "container-name";
var folderPath = "folder1/subfolder/sub-subfolder";

var blobServiceClient = new BlobServiceClient(connectionString);
var blobContainerClient = blobServiceClient.GetBlobContainerClient(containerName);
var blobItems = blobContainerClient.GetBlobsAsync(prefix: folderPath);
await foreach (BlobItem blobItem in blobItems)
{
     BlobClient blobClient = blobContainerClient.GetBlobClient(blobItem.Name);
     await blobClient.DeleteIfExistsAsync();
}

모든 BLOB에는 고유한 URI 값이 있으므로 쿼리하기 전에 특정 URI로 BLOB를 가져오고 삭제할 수 있도록 접두사를 설정할 수 있습니다.블롭이 삭제되면 폴더가 사라집니다.

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);

그게 하는 일은...

var ctoken = new BlobContinuationToken();

"폴더"는 많은 파일을 포함할 수 있습니다.ListBlubSegmentedAsyc는 일부만 반환할 수 있습니다.이 토큰은 다음 통화에서 계속 진행할 정보를 저장합니다.

var result = await container.ListBlobsSegmentedAsync("myfolder", true, BlobListingDetails.None, null, ctoken, null, null);
  • 첫 번째 인수는 필수 BLOB 이름("경로") 접두사입니다.
  • 두 번째 인수 "useFlatBlobListing=true"는 클라이언트에게 모든 하위 폴더의 모든 항목을 반환하도록 지시합니다.false로 설정하면 "가상 폴더" 모드로 실행되고 파일 시스템처럼 작동합니다.
  • 계속 진행할 위치가 표시됩니다.

모든 인수에 대한 자세한 내용은 https://learn.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.blob.cloudblobclient.listblobssegmentedasync?view=azure-dotnet 을 참조하십시오.

(item as CloudBlob)?.DeleteIfExistsAsync()

이제 결과적으로 IListBlobItem 목록이 표시됩니다.결과.IListBlobItem은 삭제 가능한 CloudBlub(예: FlatBlubListing=false를 사용하도록 설정했다면 가상 폴더일 수 있음)로 보장되지 않기 때문에 가능하면 캐스트하고 삭제하려고 합니다.

result.Results.Select(item => (item as CloudBlob)?.DeleteIfExistsAsync())

모든 결과에 대해 삭제를 트리거하고 작업 목록을 반환합니다.

.Where(task => task != null)

결과에 CloudBlob에 캐스트할 수 없는 항목이 포함된 경우 작업 목록에 null 값이 포함됩니다.우리는 그들을 제거해야 합니다.

그런 다음 현재 세그먼트에 대한 모든 삭제가 완료될 때까지 기다렸다가 가능한 경우 다음 세그먼트로 계속 진행합니다.

그것은 "폴더"가 실제로 존재하지 않기 때문입니다.Azure 스토리지 계정에는 블롭으로 채워진 컨테이너가 있습니다.클라이언트가 "폴더"로 시각화한 것은 "pictures/uploads/" 계정에 있는 블롭의 파일 이름입니다."폴더"를 제거하려면 실제로 동일한 "경로"로 이름이 지정된 각 블롭을 제거해야 합니다.

가장 일반적인 접근 방식은 이러한 블롭의 목록을 가져온 다음 블롭 삭제 호출에 제공하는 것입니다.

윈도우즈 애저.스토리지 패키지는 버전 9.4.0에서 별도의 패키지로 분할되었습니다.이는 승인된 답변에 사용된 API가 최신 Azure에서 변경되었음을 의미합니다.저장소.블롭 패키지.

아래의 접근 방식은 최신 Azure의 API를 사용합니다.저장소.Blobs 패키지이지만 모든 Blobs를 나열한 다음 한 번에 하나씩 삭제하는 동일한 허용 답변 방식을 사용합니다.

string ConnectionString = "<your connection string>";
string ContainerName = "<your container name>";

private BlobContainerClient ContainerClient()
{
    var client = new BlobContainerClient(ConnectionString, ContainerName);
    client.CreateIfNotExists();
    return client;
}

public async Task<List<BlobItem>> ListBlobsAsync(string folder)
{
    var c = ContainerClient();
    var enumerator = c.GetBlobsByHierarchyAsync(prefix: folder).GetAsyncEnumerator();

    var result = new List<BlobItem>();
    while (await enumerator.MoveNextAsync())
    {
        if (enumerator.Current.IsBlob)
            result.Add(enumerator.Current.Blob);
    }
    return result;
}

public async Task DeleteByFolderAsync(string folder)
{
    var c = ContainerClient();
    foreach (var blob in await ListBlobsAsync(folder))
    {
        await c.GetBlobClient(blob.Name).DeleteIfExistsAsync(DeleteSnapshotsOption.IncludeSnapshots);
    }
}

Azure CLI를 사용해 보십시오.

를 들어, 들어다음로시작으로 하는 경로를 과 같이 .pictures/users여기서 당신은 모든 얼룩을 찾을 수 있습니다.

export CONN_STRING="<YOUR-CONNECTION-STRING>"

az storage blob list -c mycontainer \
   --connection-string $CONN_STRING \
   --output tsv \
   --prefix pictures/users

아니면 바로 가서 모두 삭제할 수도 있습니다.

az storage blob delete-batch -s mycontainer \
   --connection-string $CONN_STRING \
   --pattern pictures/users/*

Azure 클라우드 셸에서도 이 작업을 수행할 수 있습니다. 다음 명령은 다음과 같습니다.

az storage blob delete-batch --source <blob-container> --account-name <blob-account> --pattern <folder-name>*

CLI를 사용하는 는 Azure CLI를 사용합니다.delete-batch디렉터리의 모든 블롭을 재귀적으로 삭제하기 전에 표시하지만 디렉터리는 삭제하지 않습니다.

이전에 말했듯이 계층은 스토리지 계정 > 컨테이너 > blob입니다.따라서 디렉터리를 블롭으로 처리하고 사용할 수 있습니다.azcopy명령:

az storage azcopy blob delete --account-name MyAccount --container MyContainer --target MyDirectory 

원하는 동작을 달성하기 위한 몇 가지 간단한 코드:

    public static async Task DeleteFolder(string containerName, string folder)
    {
        CloudBlobContainer container = await GetContainerAsync(containerName);

        BlobResultSegment blobList = null;
        bool folderIsEmpty = false;

        while (!folderIsEmpty)
        {
            blobList = await container.ListBlobsSegmentedAsync(
                prefix: folder,
                useFlatBlobListing: true,
                blobListingDetails: BlobListingDetails.None,
                maxResults: null,
                currentToken: null,
                options: null,
                operationContext: null
            );

            folderIsEmpty = true;

            foreach (IListBlobItem item in blobList.Results)
            {
                folderIsEmpty = false;
                await ((CloudBlockBlob)item).DeleteIfExistsAsync();
            }
        }
    }

한 번만 끌면 storage-explor를 설치할 수 있습니다. 디렉토리 삭제를 지원합니다.

이제 라이프사이클 관리를 사용하여 prefixMatch 및 속성으로 삭제할 작업을 가진 파일을 삭제할 수 있습니다.daysAfterModificationGreaterThan규칙을 약 24시간 동안 활성 상태로 둡니다.그리고 그것은 그 일을 할 것입니다.라이프사이클 관리 문서는 https://learn.microsoft.com/en-us/azure/storage/blobs/storage-lifecycle-management-concepts 에서 확인할 수 있습니다.

리눅스에서 와일드카드 경로(예: '*')를 사용하려면 따옴표를 사용해야 합니다.

az storage blob delete-batch -s mycontainer \
   --connection-string $CONN_STRING \
   --pattern 'pictures/users/*'

다음을 사용하여 다른 방법을 추가합니다.azcopy명령행에서.이것은 기본적으로 Microsoft Azure Storage Explorer 데스크톱 응용 프로그램을 사용하여 BLOB 저장소에서 파일을 삭제할 때 수행되는 작업입니다.

하위 폴더에서 모든 파일을 삭제한다고 가정합니다.l1:

azcopy remove \
  https://nameofyourstorageaccount.blob.core.windows.net/datasets/your/path/here/l1/ \
  --from-to=BlobTrash --recursive --log-level=INFO --dry-run

출력을 확인한 다음 제거합니다.--dry-run삭제를 실제로 수행합니다.

(저의 경우, 약 20,000개의 파일을 삭제하는 데 약 8초가 걸렸기 때문에 다소 빠릅니다.)

여기에 이미지 설명 입력이제 ADF의 삭제 활동을 사용하여 파일/블롭을 삭제할 수 있습니다.내부의 모든 파일이 삭제됩니다.

언급URL : https://stackoverflow.com/questions/34727829/how-to-delete-a-folder-within-an-azure-blob-container