如何在C# Core中从Azure Blob存储中读取所有文件

13

我希望可以从 Azure Blob 存储中读取文件(文件位于文件夹内),该存储包含多个文件夹。我想要读取名为“blobstorage”的文件夹,其中包含多个 JSON 文件,并对每个文件执行 .read 和一些操作。我尝试了很多未成功的代码:

 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference($"blobstorage");
上面的代码使用了“Microsoft.WindowsAzure.Storage”NuGet包。该代码未按预期工作。 在stackoverflow中找到的许多问题和答案已经过时,无法使用。 注:如果有任何NuGet提及,也是因为它们有许多包。
5个回答

21

我在这个帖子里找到了解决方案,对我来说完美地工作。下载后,您只需像读取普通流一样进行阅读。

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

代码可以运行,但性能非常差。 - Shahid Malik

6

我没有看到任何使用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 的内容,请查看此链接

在这里输入图片描述


2
只是列出所有文件。我想从特定文件夹中读取所有文件。 - RaZiQ PS
您还可以下载blob检查更新的答案内容,我添加了链接。 - Pankaj Rawat
我不需要所有的 blob,只需要指定文件夹中的文件并读取文件内容,无法下载。 - RaZiQ PS
容器内的文件夹只是虚拟文件夹,您可以从特定容器中读取所有文件和文件夹,然后过滤并下载所需的文件夹JSON文件。 - Pankaj Rawat

1

0

0

尝试以下代码:

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接