2016-05-13 4 views
0

У меня есть тонны XML-файлов в хранилище Azure Blob. Файлы сохраняются в древовидной структуре. Имея корневой каталог под названием QA, тогда в QA мы имеем подкаталоги в течение лет [Eg: 2015, 2016]. И в папке каждого года есть подкаталоги для каждого месяца [например: 01,02, 03 ... 12]. Внутри каждого месяца есть подкаталоги для каждого дня. У меня есть эти xml-файлы в этих дневных папках.Loop через древовидную структуру каталогов в Azure

Я написал код для обработки xml-файлов и сохранил их в том же месте, но код, который я написал, работает только в том случае, если я показываю точный каталог, где присутствуют файлы, он не перебирается во внутренние каталоги. Как сделать это через каждый из этих подкаталогов и файлов.

QA\2015\01\01\file1<datetimestamp>.xml 
    -------01\file2<datetimestamp>.xml 
    -------01\file3<datetimestamp>.xml 
    ------\01\02\file1<datetimestamp>.xml 
    ------\01\02\file2<datetimestamp>.xml 
    ... 
    ... 
    ... 
    ------\02\01\file1<datetimestamp>.xml 
    ... 
    ... 
    ... 
QA\2016\01\01\file1<datetimestamp>.xml 
    -------01\file2<datetimestamp>.xml 
    -------01\file3<datetimestamp>.xml 
    ------\01\02\file1<datetimestamp>.xml 
    ------\01\02\file2<datetimestamp>.xml 
    ... 
    ... 
    ... 
    ------\02\01\file1<datetimestamp>.xml 

Я ищу какой-нибудь способ реализации кода, как

for (year) 
    { 
     for (month) 
      { 
       for day 
        <My code goes here - pick the files scrub unnecessary data and save as a new file in same location> 
        --- Now I need to fiigure out how to save in same location as well 
      } 
    } 

Кроме того, это не работает для меня: var blobs = container.ListBlobs(prefix: "container-directory", useFlatBlobListing: true); как я не листинга. Я хочу, чтобы Гото каждый каталог и обрабатывать файлы

Моего код: не получите ничего, кроме ошибка

 CloudBlobClient bc = sa.CreateCloudBlobClient(); 

    // Get a reference to the container 
    CloudBlobContainer container = bc.GetContainerReference(ContainerNameStr); 

    var blobs = bc.ListBlobs(prefix: InitialLocDir, useFlatBlobListing: true, blobListingDetails: BlobListingDetails.Metadata); 
    foreach (CloudBlockBlob blob in blobs) 
    { 
     blob.AcquireLease(TimeSpan.FromSeconds(15), null); 
     var blocks = blob.DownloadBlockList(BlockListingFilter.Committed).ToList(); 
     foreach (var block in blocks) 
     { 
      MemoryStream sourceStream = new MemoryStream(); 
      blob.DownloadRangeToStream(sourceStream, 0, block.Length); 
      // Modify the stream here 
      Gpg gpg1 = new Gpg(); 
      MemoryStream destStream = new MemoryStream(); 
      gpg1.Passphrase = Phrase; 
      gpg1.BinaryPath = @"C:/Program Files (x86)/GNU/GnuPG/gpg2.exe"; 
      sourceStream.Position = 0; 
      gpg1.Decrypt(sourceStream, destStream); 

      destStream.Position = 0; 
      StreamReader reader = new StreamReader(destStream); 
      string xmlfile = ""; 
      xmlfile = reader.ReadToEnd(); 
      blob.PutBlock(block.Name, destStream, null, null, null, null); 
      Console.WriteLine(xmlfile); 
     } 

     Console.Read(); 

     blob.PutBlockList(blocks, null, null, null); 
    } 
+0

Итак, если я правильно понял ваш вопрос, вы хотите сначала указать подкаталоги на год, а затем за каждый год вы хотите перечислить подкаталоги в течение нескольких месяцев и сделать то же самое в течение нескольких дней в месяц. Только после этого вы хотите перечислить файлы и обработать эти файлы. Правильно ли я понимаю? –

+0

Ну, файлы присутствуют только во внутренней папке, которая является дневной папкой. Код, который я написал, работает только для определенного каталога. И да, ваше понимание правильное. Обновлен вопрос с моим кодом. – HadoopAddict

+0

@GauravMantri: Я хочу, чтобы программа передавала путь как getdirectory (QA/2015/01) внутри цикла for. – HadoopAddict

ответ

1

У меня есть точно такая же структура каталогов с дополнительной папкой для каждого часа в день. Я обрабатываю каждый blob в каждой папке и «очищаю» их.

Некоторые псевдокод

  • блобов = cloudBlobClient.ListBlobs (префикс: RootFolder, useFlatBlobListing: истинно, blobListingDetails: BlobListingDetails.Metadata);
  • foreach (blob in blobs)
    • blob. AcquireLease
    • var blocks = blob. DownloadBlockList (BlockListingFilter.Committed) .ToList();
    • Еогеасп (блок в блоках)
      • blob.DownloadRangeToStream (DATASTREAM, положение, block.Length)
      • изменить поток, при необходимости
      • В случае изменения, blob.PutBlock (block.Name, adjustedStream. ..)
  • blob.PutBlockList (blocksToPush, новый AccessCondition() {LeaseId = leaseId})

    client.ListBlobs в основном выполняет задание, перечисляющее все капли по всем папкам. Тогда это всего лишь вопрос итерации каждого файла blob и загрузки его блоков и их обработки.

+0

Ничего себе! Я ищу нечто подобное. Не могли бы вы уточнить свой псевдокод? Также не удалось найти метод AcqureLease или DownloadBlockList. Было бы очень полезно, если бы вы могли сделать код для этого. – HadoopAddict

+0

Обновили ответ с некоторыми ссылками – alwayslearning

+0

blob.PutBlockList (блоки, null, null, null); результат n ошибка. Какой должен быть первый аргумент для PutBlockList? – HadoopAddict

Смежные вопросы