我的Azure Blob容器包含两个虚拟文件夹A和B,以及一些文件。我在项目中使用此代码来下载本地文件夹中容器的内容:
private async void Test(string temp, CloudBlobContainer container, string target, string prefix) {
foreach (var item in container.ListBlobs(prefix)) {
switch (item) {
case CloudBlobDirectory directory:
Directory.CreateDirectory(Path.Combine(temp, directory.Prefix));
Test(Path.Combine(temp, directory.Prefix), container, target, directory.Prefix);
break;
}
}
await CopyAll(temp, target, controller); /* Just a function to call at the end of the method*/
}
具有具有此虚拟结构的容器:
container
A/
B/
one.txt
two.txt
...
我想在本地文件夹上复制相同的结构。问题是B被跳过并且foreach
仅考虑A,但是如果我将Test(Path.Combine(temp, directory.Prefix), container, target, directory.Prefix)
替换为例如System.Diagnostics.Debug.WriteLine(directory.Prefix)
以仅打印它们,那么B将被打印到控制台。显然递归存在问题,但是我看不到它。我使用递归遍历容器中的虚拟目录,以便将原始结构复制到本地文件夹中。
您应该粘贴完整的代码,我们在您的帖子中不知道这些功能的详细信息,例如Test()
/ CopyAll()
。
但是,如果要下载所有Blob(包括文件夹)并在本地保留相同的结构,则可以尝试以下代码:
var conn_str = "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxx;EndpointSuffix=core.windows.net";
var myContainer = "aaa";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(conn_str);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference(myContainer);
var blobs = blobContainer.ListBlobs(prefix:null,useFlatBlobListing:true);
foreach (var item in blobs)
{
switch (item) {
case CloudBlockBlob blob:
var filename = blob.Uri.Segments.Last();
//download the blobs which directly under the container
if (string.IsNullOrEmpty(blob.Parent.Prefix))
{
blob.DownloadToFile(@"d:\aaa" + "\\" + filename, FileMode.CreateNew);
}
else
{
//download the blobs which are inside folder
string a = Path.Combine(@"d:\aaa", blob.Parent.Prefix);
var mydiretory = Directory.CreateDirectory(a);
blob.DownloadToFile(mydiretory.FullName + filename, FileMode.CreateNew);
}
break;
default:
break;
}
}
我正在使用此nuget包Microsoft.Azure.Storage.Blob, version 11.1.3。
[如果您还有其他问题,请告诉我。