如何从 C# Core 中的 azure blob 存储中读取所有文件

Posted

技术标签:

【中文标题】如何从 C# Core 中的 azure blob 存储中读取所有文件【英文标题】:How read all files from azure blob storage in C# Core 【发布时间】:2020-07-15 08:12:36 【问题描述】:

我想从 azure blob 存储(文件夹内的文件)读取文件,blob 存储包含许多文件夹。 我想读取我的文件夹“blobstorage”,它包含许多 JSON 文件,对每个文件执行 .read 和一些操作。我尝试了许多不起作用的代码:

 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference($"blobstorage");

以上代码使用 'Microsoft.WindowsAzure.Storage' nuget 包。此代码未按预期工作。 在堆栈溢出中发现的许多问题和答案中,我发现它们中的大多数已经过时并且不起作用。 注意:如果有任何 nuget 提到也 bcs 他们是很多包

【问题讨论】:

【参考方案1】:

我在post 中找到了解决方案,并且对我来说非常有效。您只需在下载后将其作为普通流读取即可。

BlobServiceClient blobServiceClient = new BlobServiceClient("connectionString");
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("containerName");
BlobClient blobClient = containerClient.GetBlobClient("blobName.csv");
if (await blobClient.ExistsAsync())

  var response = await blobClient.DownloadAsync();
  using (var streamReader= new StreamReader(response.Value.Content))
  
    while (!streamReader.EndOfStream)
    
      var line = await streamReader.ReadLineAsync();
      Console.WriteLine(line);
    
  

【讨论】:

工作,但是这段代码的性能很差。【参考方案2】:

我没有看到任何使用 Microsoft.WindowsAzure.Storage 包列出所有 blob 的选项。如果您可以使用Azure.Storage.Blobs 包,请尝试以下代码。

using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System;

namespace ConsoleApp2

    class Program
    
        static string connectionString = "DefaultEndpointsProtocol=https;AccountName=storage******c9709;AccountKey=v**************************************;EndpointSuffix=core.windows.net";
        static string container = "azure-webjobs-hosts";
        static void Main(string[] args)
        
            // Get a reference to a container named "sample-container" and then create it
            BlobContainerClient blobContainerClient = new BlobContainerClient(connectionString, container);
            blobContainerClient.CreateIfNotExists();
            Console.WriteLine("Listing blobs...");
            // List all blobs in the container
            var blobs = blobContainerClient.GetBlobs();
            foreach (BlobItem blobItem in blobs)
            
                Console.WriteLine("\t" + blobItem.Name);
                        
            Console.Read();
        
    

输出

你也可以下载blob的内容,看这个link

【讨论】:

它只是列出所有文件。我想读取特定文件夹中的所有文件 你也可以下载blob检查更新答案的内容,我加了链接 我不全是blob,只指定文件夹文件和读取文件内容,无法下载 容器内的文件夹只是虚拟文件夹,您可以从特定容器中读取所有文件和文件夹,然后您可以过滤并仅下载所需的文件夹 JSON 文件。【参考方案3】:

您可以在 SDK github repo 中找到 c# 的示例代码: https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs_12.8.0/sdk/storage/Azure.Storage.Blobs/

您可以使用以下命令将包添加到您的 dotNet Core 项目中。

dotnet add package Azure.Storage.Blobs

根据那里的示例,您可以枚举 blob,然后读取您要查找的那个。

【讨论】:

【参考方案4】:

如果您有大量数据要下载并且正在寻找效率,您可能不想在单个线程上逐个下载它们。使用多线程和异步。

这是一个很好的主题阅读:

https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-scalable-app-download-files?tabs=dotnet

下载 1000 个文件:

单线程:30秒下载时间 多线程:4秒下载时间

【讨论】:

【参考方案5】:

试试下面的代码:

var connectionString = "你的连接字符串";

        CloudStorageAccount storageacc = CloudStorageAccount.Parse(connectionString);
        //Create Reference to Azure Blob
        CloudBlobClient blobClient = storageacc.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference("containerName");
        var blobs = container.GetDirectoryReference("FolderName").GetDirectoryReference("FolderName").ListBlobs().OfType<CloudBlockBlob>().ToList();
        Console.WriteLine("Total files found in directory: " + blobs.Count.ToString());
        var tempBlobList = blobs.Where(b => b.Name.Contains("fileName")).ToList();
        var response = await tempBlobList[0].DownloadTextAsync();

【讨论】:

以上是关于如何从 C# Core 中的 azure blob 存储中读取所有文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 中的 Azure.Storage.Blobs 从 Azure 存储 Blob 以 ByteArray 格式获取文件

如何将图像从 Asp.net Core IFormFile 上传到 Azure Blob 存储?

Dot.Net Core 中 Azure blob 容器中的软删除 blob 文件

如何使用 c# 从 azure blob 存储中检索 xml 文件

ASP.NET Core 应用程序日志未写入 Azure 应用服务中的 Blob

将文件从 Azure 文件共享复制到 Azure Blob 的 C# 代码