【问题标题】:Saving files in tree directory structure以树形目录结构保存文件
【发布时间】:2016-09-12 10:27:31
【问题描述】:

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

我编写了一个程序来解密、解压缩和处理这些 xml 文件。我正在使用“useFlatBlobListing”属性列出所有 blob 并对其进行处理。

但在处理完 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

我的程序:

var blobs = container.ListBlobs(prefix: InitialLocDir, useFlatBlobListing: true);  //Here the initialLoc is QA\
Console.WriteLine(blobs.Count());
foreach (CloudBlockBlob blob in blobs)
{
    FileName = blob.Uri.Segments.Last();
    blob.AcquireLease(TimeSpan.FromSeconds(15), null);

    MemoryStream sourceStream = new MemoryStream();

    blob.DownloadToStream(sourceStream);


    // Code - to decrypt-files//
    // Code to unzip and scrub the data//
// Do some updates/inserts using LINQ to XML.
    string finaldest = "NewFolderStruct/" + FileName;

     doc.Save(finaldest.xml); \\How to create the NewFolderStruct/ in exact same way ??
    // May be something like blob.UploadText(xDoc.ToString());          

【问题讨论】:

  • 2 个问题:1) 您是否将清理后的文件保存在本地计算机上的任何位置? 2)假设您希望保持相同的目录结构是否安全?您可能想将处理后的文件放入另一个容器中吗?
  • 不,我没有在本地保存任何地方。我想使用相同的结构 例如,如果源 xml 在 QA\2016\01\01\ 我想在 Safe\2016\01\01 中创建目标 xml,其中 Safe 是我要创建的新目录。相同的容器但不同的目录

标签: c# xml azure


【解决方案1】:

根据您的 cmets,您需要执行以下操作:

  • 既然您提到您没有将 XML 文件保存在磁盘上的任何位置,我猜您将它保存在内存中。您需要做的是为它创建一个MemoryStream 类型的对象。我们就叫它memoryStremForNewXMLFile吧。
  • 接下来您将创建一个CloudBlockBlob 的实例。这是将上传到 blob 存储中的文件。由于您希望保持相同的文件夹结构,但将 QA 目录更改为 Safe,以下是创建它的实例的方法:

    var newBlob = container.GetBlockBlobReference(blob.Name.Replace("QA/", "Safe/"));

  • 最后,您将流上传到此 blob。

    newBlob.UploadFromStream(memoryStremForNewXMLFile)

请确保将memoryStremForNewXMLFile 的位置重置为流的开头,否则您上传的文件将为零字节。

【讨论】:

  • 进入流后,我使用流阅读器将流读入字符串 例如:string xmlfile = reader.ReadToEnd();然后我使用 Linq to xml 进行更改。例如: var doc = XDocument.Parse(xlfile);并对此文档对象进行了更改。我可以使用类似 newBlobUploadFromXdoucment(doc) 的东西吗??
  • 很遗憾没有。正如大卫在他的回答中提到的,您需要使用 Azure 存储 SDK 的 blob 上传方法,包括上传文件、流、字节数组或文本。
  • 我将 XDocument 转换为流并执行 UploadFromStream 。程序运行成功,但我没有看到名为 Safe 的目录?
  • 你能分享你的代码吗?把它放在 pastebin 或者其他地方?
  • 感谢分享代码。您可以检查 blob 和 newBlob 名称的值吗?我猜这个问题只是存在。
【解决方案2】:

不确定doc.Save() 是什么(因为它未在您的代码中显示),但您不能使用正常的文件 i/o 操作来创建 blob 或容器。为此,您需要使用 Azure SDK(或 REST 调用)来创建和上传您的 Blob 内容(并从原始位置删除,如果您的应用需要这样做)。

【讨论】:

  • 要将编辑保存到 blob 存储上的新 xml 中,我需要 Azure SDK 吗?是的,我确实有 Azure SDK。你能指导我如何进行吗?另外,我不想从原始位置删除初始文件,我只想通过创建目录将处理后的文件放在不同的位置。
  • 是的 - blob 存储不是文件系统(除了文件服务,但这是一个不同的主题)。并且不遵守任何类型的文件 I/O 命令。而且您已经拥有 Azure SDK(因为您在示例代码中使用它 - 这就是 CloudBlockBlob 所在的位置)。
  • 是的,我有 Azure SDK
  • 你能指导我如何继续使用它吗?可能是通过使用 blob.PutBlock(); ?
猜你喜欢
  • 1970-01-01
  • 2011-03-28
  • 2015-10-15
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2014-02-02
相关资源
最近更新 更多