Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Azure下载文件_C#_Azure_Azure Storage Blobs - Fatal编程技术网

C# 从Azure下载文件

C# 从Azure下载文件,c#,azure,azure-storage-blobs,C#,Azure,Azure Storage Blobs,具有多个blob,已将每个blob的名称提取到列表中,并显示其上次修改的日期。 设置下载路径,然后运行以下代码,其中kvp.Key是每个blob的名称。我的想法是,我可以循环使用每个文件名并下载它: foreach (KeyValuePair<string, DateTimeOffset?> kvp in to_be_dl) { Console.WriteLine("Downloading: " + kvp.Key);

具有多个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);
        }
foreach(KeyValuePair kvp in to_be_dl)
{
Console.WriteLine(“下载:+kvp.Key”);
//Console.WriteLine(kvp.Key+“”+kvp.Value);
foreach(CloudBlockBlob blobItem in blob)
{
尝试
{
blobItem.DownloadToFile(downloadpath+“\\”+kvp.Key,FileMode.Create);
打破
}
捕获(例外e)
{
控制台写入线(e);
打破
}
}
Console.WriteLine(“下载:+kvp.Key”);
}

有没有办法通过名称获取blob并下载相应的文件?

您的逻辑中有一个缺陷:)

基本上,外部循环获取下载文件的名称,但是内部循环在blob上进行迭代,然后使用外部循环中设置的相同名称下载每个blob

它使用不同的名称在内部循环中多次保存最后一个blob(或第一个blob)

这就是为什么解压文件时,即使文件名不同,也会得到相同的内容,因为下载了相同的blob(即使使用不同的名称保存)

要解决此问题,您可以使用
kvp
中的
键创建
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);
            }
        }
foreach(KeyValuePair kvp in to_be_dl)
{
Console.WriteLine(“下载:+kvp.Key”);
var blob=container.GetBlockBlobReference(kvp.Key);
尝试
{
//如果blob不存在,您将得到一个错误,然后您的代码将移动到下一个键
blob.DownloadToFile(downloadpath+“\\”+kvp.Key,FileMode.Create);
Console.WriteLine(“下载:+kvp.Key”);
}
捕获(例外e)
{
Console.WriteLine(“未能下载:+kvp.Key”);
控制台写入线(e);
}
}

您的逻辑中有一个缺陷:)

基本上,外部循环获取下载文件的名称,但是内部循环在blob上进行迭代,然后使用外部循环中设置的相同名称下载每个blob

它使用不同的名称在内部循环中多次保存最后一个blob(或第一个blob)

这就是为什么解压文件时,即使文件名不同,也会得到相同的内容,因为下载了相同的blob(即使使用不同的名称保存)

要解决此问题,您可以使用
kvp
中的
键创建
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);
            }
        }
foreach(KeyValuePair kvp in to_be_dl)
{
Console.WriteLine(“下载:+kvp.Key”);
var blob=container.GetBlockBlobReference(kvp.Key);
尝试
{
//如果blob不存在,您将得到一个错误,然后您的代码将移动到下一个键
blob.DownloadToFile(downloadpath+“\\”+kvp.Key,FileMode.Create);
Console.WriteLine(“下载:+kvp.Key”);
}
捕获(例外e)
{
Console.WriteLine(“未能下载:+kvp.Key”);
控制台写入线(e);
}
}

代码中的
kvp.Key
是什么?我看不出每一个斑点都在变化。对不起,我没说清楚。它是一个嵌套的foreach,kvp是一个键值对,保存文件名和上次修改日期。因此,kvp.Key是我从每个blob中提取的文件名。调试时,每个循环的文件名都会更改。感谢您的解释。因此,如果我理解正确,将下载多个zip文件,当您解压缩每个zip文件时,它们都包含相同的文件。对吗?是的,没错。我一直在调试代码,但blobItem似乎没有移动到文件名。有没有办法告诉它我想用我的kvp.Key(文件名)下载哪个blobItem?你能编辑你的问题并分享完整的代码吗?显然,在将代码发布到此处之前,请从代码中删除存储凭据和其他敏感信息。代码中的
kvp.Key
是什么?我看不出每一个斑点都在变化。对不起,我没说清楚。它是一个嵌套的foreach,kvp是一个键值对,保存文件名和上次修改日期。因此,kvp.Key是我从每个blob中提取的文件名。调试时,每个循环的文件名都会更改。感谢您的解释。因此,如果我理解正确,将下载多个zip文件,当您解压缩每个zip文件时,它们都包含相同的文件。对吗?是的,没错。我一直在调试代码,但blobItem似乎没有移动到文件名。有没有办法告诉它我想用我的kvp.Key(文件名)下载哪个blobItem?你能编辑你的问题并分享完整的代码吗?显然,在将代码发布到这里之前,请删除代码中的存储凭据和其他敏感信息。谢谢-我明白了,这是一个愚蠢的错误!有没有办法通过blob名称获取blob?因此,根据键值对中的名称设置我想要的blob,并将两者匹配?感谢您的帮助。CloudBlockBlob有一个名为
Name
的属性,它将