【问题标题】:Download file from Azure从 Azure 下载文件
【发布时间】:2017-08-25 10:44:15
【问题描述】:

有多个 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 并下载相应的文件?

【问题讨论】:

  • 您的代码中的kvp.Key 是什么?我没有看到每个 blob 的变化。
  • 抱歉,没说清楚。它是一个嵌套的 foreach,kvp 是一个键值对,包含文件名和最后修改日期。所以 kvp.Key 是我从每个 blob 中提取的文件名。调试时,每个循环的文件名都会改变。
  • 感谢您的解释。因此,如果我理解正确,则会下载多个 zip 文件,并且当您提取每个 zip 文件时,它们都包含相同的文件。对吗?
  • 是的,没错。我一直在调试代码,似乎 blobItem 没有移动到文件名。有没有办法告诉它我想用我拥有的 kvp.Key(文件名)下载哪个 blobItem?
  • 你能编辑你的问题并分享完整的代码吗?显然,在将代码发布到此处之前,请从代码中删除存储凭据和其他敏感信息。

标签: c# azure azure-blob-storage


【解决方案1】:

你的逻辑有缺陷:)。

本质上,您的外部循环获取下载文件的名称,但随后您的内部循环遍历 blob,然后下载在外部循环中设置的具有相同名称的每个 blob。

这样做的目的是,它使用不同的名称多次保存内部循环中的最后一个 blob(或第一个 blob)。

这就是为什么当您解压缩文件时,即使文件名不同,您也会得到相同的内容,因为下载的是同一个 blob(即使以不同的名称保存)。

要解决此问题,您可以使用Keykvp 中创建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);
            }
        }

【讨论】:

  • 谢谢 - 我明白了,一个愚蠢的错误!有没有办法通过 blob 名称获取 blob?因此,通过键值对中的名称设置我想要的 blob 并匹配两者?感谢您的帮助。
  • CloudBlockBlob 有一个名为 Name 的属性,它将为您提供 blob 的名称。您的键名是否与 blob 的名称相同?如果是这种情况,那么您可以将下载代码包装在 if 块中。类似if (blob.Name == kvp.Key) { blobItem.DownloadToFile(downloadpath + "\\" + kvp.Key, FileMode.Create); }
  • 是的,我有另一种方法可以访问 blob 并获取每个 blob 的名称并在列表中返回它们。然后我使用该列表来填充 kvp。
  • 谢谢!这已经解决了,GetBlockBlobReference 正是我所需要的!
猜你喜欢
  • 2017-08-20
  • 2023-03-20
  • 1970-01-01
  • 2021-01-04
  • 2021-12-08
  • 2018-09-27
  • 1970-01-01
相关资源
最近更新 更多