有多个 blob,已将每个 blob 的名称及其上次修改日期提取到列表中。 设置好下载路径,然后运行以下代码,其中 kvp.Key 是每个 blob 的名称。我的想法是我可以循环每个文件名并下载它:
foreach (KeyValuePair<string, DateTimeOffset?> kvp in to_be_dl)
{
Console.WriteLine("Downloading: " + kvp.Key);
//Console.WriteLine(kvp.Key+" "+kvp.Value);
foreach (CloudBlockBlob blobItem in blobs)
{
try
{
blobItem.DownloadToFile(downloadpath + "\\" + kvp.Key, FileMode.Create);
break;
}
catch (Exception e)
{
Console.WriteLine(e);
break;
}
}
Console.WriteLine("Downloaded: " + kvp.Key);
}
有没有办法能够通过名称获取 blob 并下载相应的文件?
最佳答案
你的逻辑有问题:)。
本质上,您的外循环获取下载文件的名称,但随后您的内循环会迭代 blob,然后下载与外循环中设置的名称相同的每个 blob。
它的作用是用不同的名称多次保存内部循环中的最后一个 blob(或第一个 blob)。
这就是为什么当您解压缩文件时,即使文件名不同,您也会获得相同的内容,因为下载的是相同的 blob(即使使用不同的名称保存)。
要解决此问题,您可以使用 kvp
中的 Key
创建一个 CloudBlockBlob
实例,然后尝试下载那个 Blob 。如下所示:
foreach (KeyValuePair<string, DateTimeOffset?> kvp in to_be_dl)
{
Console.WriteLine("Downloading: " + kvp.Key);
var blob = container.GetBlockBlobReference(kvp.Key);
try
{
//If the blob doesn't exist, you will get an error and then your code should move to the next key
blob.DownloadToFile(downloadpath + "\\" + kvp.Key, FileMode.Create);
Console.WriteLine("Downloaded: " + kvp.Key);
}
catch (Exception e)
{
Console.WriteLine("Failed to download: " + kvp.Key);
Console.WriteLine(e);
}
}
关于c# - 从 Azure 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43135970/