繁体   English   中英

azure storage / c#:从容器中的目录下载所有文件

[英]azure storage / c#: Download all files from a directory in a container

有没有一种简单的方法可以从容器内部下载所有文件并维护目录结构?

例如,我已将以下目录上载到容器“用户”中的Azure存储帐户。

../username/files/ ../username/files/default.htm ../username/files/1.txt ../username/files/2.txt

下面的代码会将d​​efault.htm文件下载到C:\\ users \\ username \\ files \\ default.htm

问题是我不想下载特定文件。 我希望能够获取用户/用户名/中的每个文件,并在所需的本地存储路径下输出相同的目录结构。

我将在此容器中拥有多个“目录”(不同的用户),并且它们的结构将不总是相同的,有些可能包含带有文件的多个子目录,有些可能没有,等等。所以我真的在寻找一种表达方式:

从“用户/用户名”下载所有文件到C:\\ users \\ username \\

private static void DownloadFromAzureStorage()// RUN on new server
{
    string azureStorageAccountName = 
    ConfigurationManager.AppSettings["AzureStorageAccountName"];
    string azureStorageAccountKey = 
    ConfigurationManager.AppSettings["AzureStorageAccountKey"];
    string target = 
    ConfigurationManager.AppSettings["TargetDirectoryPath"];
    //C:\username\files\
    var storageCredentials = new 
    StorageCredentials(azureStorageAccountName, azureStorageAccountKey);
    var csa = new CloudStorageAccount(storageCredentials, true);

    CloudBlobClient blobClient = csa.CreateCloudBlobClient();
    CloudBlobContainer container = 
    blobClient.GetContainerReference("users");

    CloudBlockBlob blockBlob = 
    container.GetBlockBlobReference("username/files/default.htm");
    string path = (target + "default.htm");
    blockBlob.DownloadToFile(path, FileMode.OpenOrCreate);
}

Blob名称包括容器中文件的完整路径,因此,如果使用CloudBlockBlob Name属性保存Blob,则将获得与容器中相同的文件夹结构。

像这样尝试

var blobContainerName = "users";
var storageCredentials = new StorageCredentials(azureStorageAccountName, azureStorageAccountKey);
var storageAccount = new CloudStorageAccount(storageCredentials, true);
var context = new OperationContext();
var options = new BlobRequestOptions();
var cloudBlobClient = storageAccount.CreateCloudBlobClient();
var cloudBlobContainer = cloudBlobClient.GetContainerReference(blobContainerName);
BlobContinuationToken blobContinuationToken = null;
do
{
    var results = await cloudBlobContainer.ListBlobsSegmentedAsync(null, true, BlobListingDetails.All,
        null, blobContinuationToken, options, context);
    blobContinuationToken = results.ContinuationToken;
    foreach (var item in results.Results)
    {
        if(item is CloudBlockBlob blockBlob)
        {
            string path = $"{target}{blockBlob.Name}";
            blockBlob.DownloadToFile(path, FileMode.OpenOrCreate);
        }
    }
} while (blobContinuationToken != null);

您可能要尝试使用AzCopy命令行工具,该工具可以递归下载容器/目录:

AzCopy /Source:https://myaccount.blob.core.windows.net/users /Dest:C:\users /SourceKey:key /S

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM