【问题标题】:Loop through tree structure of directories in Azure循环遍历 Azure 中的目录树结构
【发布时间】:2016-09-09 18:43:48
【问题描述】:

我在 Azure Blob 存储中有大量 XML 文件。文件保存在树结构中。有一个名为 QA 的根目录,然后在 QA 中我们有多年的子目录 [例如:2015、2016]。 在每个 year 文件夹中,每个月都有子目录 [例如:01,02, 03 ... 12]。每个月里面都有每天的子目录。我在这些天文件夹中有这些 xml 文件。

我编写了一个代码来处理 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);
    }

【问题讨论】:

  • 因此,如果我正确理解了您的问题,您首先要列出一年的子目录,然后对于每一年,您都想列出几个月的子目录,一个月中的几天也一样。只有在那之后,您才想列出文件并处理这些文件。我的理解正确吗?
  • 好吧,这些文件只存在于最里面的目录,即日文件夹中。我编写的代码仅适用于特定目录。是的,您的理解是正确的。用我的代码更新了问题。
  • @GauravMantri :我希望程序在一天的 for 循环中提供类似 getdirectory(QA/2015/01) 的路径。

标签: c# azure azure-storage azure-blob-storage


【解决方案1】:

我有完全相同的目录结构,每天每小时都有一个额外的文件夹。我处理每个文件夹中的每个 blob 并“清理”它们。

一些伪代码

  • blob = cloudBlobClient.ListBlobs(prefix:rootFolder,useFlatBlobListing:true,blobListingDetails: BlobListingDetails.Metadata);
  • foreach(blob 中的 blob)
    • blob.AcquireLease
    • var blocks = blob.DownloadBlockList(BlockListingFilter.Committed).ToList();
    • foreach(块中的块)
      • blob.DownloadRangeToStream(dataStream,position,block.Length)
      • 必要时修改流
      • 如果修改,blob.PutBlock(block.Name,adjustedStream...)
  • blob.PutBlockList(blocksToPush, new AccessCondition() { LeaseId = leaseId })

    client.ListBlobs 基本上完成了枚举所有文件夹中的所有 blob 的工作。然后只需迭代每个 blob 文件并获取其块并处理它们。

【讨论】:

  • 哇!我正在寻找类似的东西。你能详细说明你的伪代码吗?也找不到 AcqureLease 方法或 DownloadBlockList。如果你能把代码做到这一点,那将是一个很大的帮助。
  • blob.PutBlockList(blocks, null, null, null);结果 n 错误。 PutBlockList 的第一个参数应该是什么?
  • 我用你的代码修改了我的代码[更新了问题]。但它不起作用,我得到错误。你能检查一下我的做法是否正确吗?
  • @HadoopAddict 我更新了调用 PutBlockList 的方式。 “blocksToPush”是您已修改的块列表。你得到什么错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多