2017-03-07 7 views
1

Azure Blob 파일의 모든 이름을 컨테이너에 넣으 려합니다 (특정 목적으로). stackoverflow.com (getting list of names of Azure blob files in a container?) 에서조차 비슷한 질문을 발견했습니다. 그러나 모든 대답은 ListBlobs() - 메서드를 먼저 사용하고 있습니다. 모든 파일이 목록에 저장되고 모든 파일에서 이름이 수신되기까지 24,000 개의 파일로 인해이를 방지하기 위해 약 10 분이 소요됩니다. 방법은 전 C# 지금 사용컨테이너에 Azure BLOB 파일의 모든 이름 만 가져 오는 중입니까?

  var container = GetOrCreateBlobContainer(containerName); 
      var blobs = container.ListBlobs(useFlatBlobListing: true); 
      var blobNames = blobs.OfType<CloudBlockBlob>().Select(b => b.Name).ToList(); 
      return blobNames; 

내가 원하는 무엇 :() 첫 container.ListBlobs를 사용하지 않고 스토리지에서 직접 모든 이름을 가져옵니다.

가능합니까 ??

답변

2

원하는 것 : container.ListBlobs()를 먼저 사용하지 않고 저장소에서 모든 이름을 직접 가져옵니다.

가능합니까 ??

아니요, 불가능합니다. 컨테이너에있는 모든 얼룩의 목록을 얻으려면 ListBlobs에 전화해야합니다.

0

Gaurav Mantri가 말한 것처럼 ListBlob을 호출하여 컨테이너의 모든 얼룩의 목록을 먼저 가져와야합니다.

해결 방법은 컨테이너의 메타 데이터를 사용하거나 txt 파일을 업로드하여 모든 BLOB 이름을 저장 한 다음 메타 데이터 또는 txt 파일을 직접 다운로드하여 모든 BLOB 이름을 가져 오는 것이 좋습니다.

참고 : 메타 데이터의 최대 크기는 8kb입니다. 파일이 많은 경우 txt를 사용하여 파일 이름을 저장할 수 있습니다.

+0

댓글을 보내 주셔서 감사합니다.하지만 파일은 하루에 바뀌므로 txt 파일을 최신 상태로 유지하는 것은 불가능합니다. –

2

동일한 문제가있는 사람들에게 몇 가지 사항을 정리하고 싶습니다. 이것은 10 분이 걸리는 방법입니다. 우리가 코드를 변경 몇 가지 조사 후

public IEnumerable<string> GetAllBlobNames(string containerName) 
{ 
    try 
    { 
     var container = GetOrCreateBlobContainer(containerName); 
     var blobs = container.ListBlobs(useFlatBlobListing: true); 

     var blobNames = new List<string>(); 
     foreach (var item in blobs) 
     { 
      var blob = (CloudBlockBlob)item; 
      blob.FetchAttributes(); 
      blobNames.Add(blob.Name); 
     } 
     return blobNames; 
    } 
    catch (Exception ex) 
    { 
     throw new DomainException("BlobStorageProvider_Retrieve_Fails", typeof(Properties.Resources), containerName, ex.ToStringExtended()); 
    } 
} 

:이 때문에 이름을 얻기 위해 우리 모두가 24,000 파일을 통해 반복하는 사실이다

var container = GetOrCreateBlobContainer(containerName); 
var blobs = container.ListBlobs(useFlatBlobListing: true); 
var blobNames = blobs.OfType<CloudBlockBlob>().Select(b => b.Name).ToList(); 
return blobNames; 

이 두 번째 방법 2의 기간이있다 초. 10 분보다 훨씬 빠릅니다. 그러나 우리는 여전히 container.ListBlobs()을 사용해야하는지 궁금해하고있었습니다.

Gaurav Mantri가 말한 것처럼 container.ListBlobs()을 먼저 사용하지 않고 저장소에서 모든 이름을 직접 가져 오는 것은 불가능합니다. 희망은 다른 사람들에게도 도움이되기를 바랍니다.)