有多个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并下载相应的文件?
答案 0 :(得分:2)
你的逻辑有一个缺陷:)。
基本上你的外部循环获取下载文件的名称,但是你的内部循环遍历blob,然后下载每个blob,并在外部循环中设置相同的名称。
这样做是因为它使用不同的名称多次保存内部循环中的最后一个blob(或第一个blob)。
这就是为什么当您解压缩文件时,即使文件名不同也会获得相同的内容,因为相同的blob会被下载(即使使用不同的名称保存)。
要解决此问题,您可以使用CloudBlockBlob
中的Key
创建kvp
的实例,然后尝试下载该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);
}
}