从 Azure 下载文件

Download file from Azure

有多个 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);
            }
        }