我在Azure Blob存储中有大量的XML文件。文件以树结构保存。有一个名为QA的根目录,然后在QA中我们有多年的子目录[例如:2015年,2016]。在每年的文件夹中,每个月都有子目录[例如:01,02,03 ... 12]。每个月内都有每天的子目录。我在这些日期文件夹中有这些xml文件。
我编写了一个解密,解压缩和处理这些xml文件的程序。我正在使用" useFlatBlobListing"属性列出所有blob并处理它们。
但是在处理了xml文件后,我想将它们存储在一个新的路径中,但是通过创建diretories的方式与源文件完全相同。
源文件的文件夹结构
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());
答案 0 :(得分:0)
不确定doc.Save()
是什么(因为它没有显示在您的代码中),但您不能使用普通的文件i / o操作来创建blob或容器。为此,您需要使用Azure SDK(或REST调用)来创建和上传您的blob内容(以及从原始位置删除,如果这是您的应用所要求的)。
答案 1 :(得分:0)
根据您的意见,以下是您需要做的事情:
MemoryStream
类型的对象。我们称之为memoryStremForNewXMLFile
。接下来,您将创建CloudBlockBlob
的实例。这是将在blob存储中上传的那个。由于您希望保持相同的文件夹结构,但将QA
目录更改为Safe
,以下是如何创建它的实例:
var newBlob = container.GetBlockBlobReference(blob.Name.Replace("QA/", "Safe/"));
最后,您要将流上传到此blob。
newBlob.UploadFromStream(memoryStremForNewXMLFile)
请确保将memoryStremForNewXMLFile
的位置重置为流的开头,否则您上传的文件将为零字节。