从Azure

时间:2017-03-31 08:25:45

标签: c# azure azure-storage-blobs

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

1 个答案:

答案 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);
            }
        }