65.9K
CodeProject 正在变化。 阅读更多。
Home

Azure Blob C# 非平凡

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (8投票s)

2019年3月20日

CPOL

1分钟阅读

viewsIcon

14886

Azure Blob 存储 .NET Core C# 的实用方法

引言

在为客户解决问题时,我正在处理 Azure 函数和 Blob 存储的集成,我需要 Blob 存储方面的帮助。虽然有很多关于 Azure 存储的基本连接、写入和下载的教程,但几乎所有这些教程都缺少以下一些场景:

  1. 如何循环遍历容器内的目录中的所有 Blob
  2. 如何附加到已存在的 Blob
  3. 如何将本地文件夹结构以及文件复制到容器中

如何循环遍历容器内的目录中的所有 Blob

假设您已经知道 Azure Blob 存储中没有真正的目录,并且我们使用文件的路径来模拟文件夹结构(/Test/fileName.txt - 我们将 Test 视为一个文件夹),让我们开始循环文件。

这是我编写的方法,用于将所有文件从一个 Azure 目录移动到另一个目录

public static async void MoveAllFiles(string sourceContainer, 
    string sourceDircetory, string destinationDirectory, string destinationContainer)
{
string storageConnection = "DefaultEndpointsProtocol=https;
    AccountName=abcappstorage;AccountKey=somelongkey;EndpointSuffix=core.windows.net";
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(storageConnection);
var client = cloudStorageAccount.CreateCloudBlobClient();
var sContainer = client.GetContainerReference(sourceContainer);
CloudBlobDirectory sDirectory = sContainer.GetDirectoryReference(sourceDircetory);

//this will fetch all the items in the particular directory
var blobs = sDirectory.ListBlobsSegmentedAsync
              (false, BlobListingDetails.Metadata, 100, null, null, null).Result;
var dContainer = client.GetContainerReference(destinationContainer);

foreach (var blob in blobs.Results)
{
   var fileName = System.IO.Path.GetFileName(blob.Uri.LocalPath);

   if (fileName.EndsWith(".txt"))
   {
     var sourceBlob = sContainer.GetBlobReference(sourceDircetory + fileName);
     var destinationBlob = dContainer.GetBlobReference(destinationDirectory + fileName);
     await destinationBlob.StartCopyAsync(sourceBlob.Uri);
     await sourceBlob.DeleteIfExistsAsync();
   }
  }
}

您可以这样调用此方法

MoveAllFiles(“sourceContainer”,”FirstFolder/SecondFolder/”,
    ”DestinationFirstFolder/DestinationSecondFolder/”,”destinationContainer”);

如何附加到已存在的文件

为了能够附加到现有文件,我们需要创建一个追加 Blob 而不是块 Blob。这是我编写的方法,用于将一些日志文件写入 Azure Blob 存储

public async static void AppendToBlob(string fileName, string blobContainer, string text)
{
string storageConnection = "DefaultEndpointsProtocol=https;
AccountName=abcappstorage;AccountKey=somelongkey;Endpoint Suffix=core.windows.net";
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(storageConnection);

if (cloudStorageAccount != null)
{  
  CloudBlobClient client = cloudStorageAccount.CreateCloudBlobClient();
  CloudBlobContainer container = client.GetContainerReference(blobContainer);
  container.CreateIfNotExistsAsync();
  container.SetPermissionsAsync(new BlobContainerPermissions 
    { PublicAccess =  BlobContainerPublicAccessType.Container });

  CloudAppendBlob blob = container.GetAppendBlobReference(fileName);

   //the below code creates the blob if it doesn’t already exist.
   if (!await blob.ExistsAsync())
      blob.CreateOrReplaceAsync();
   
   blob.AppendTextAsync(text);
   }
  }

您可以这样调用此方法

AppendToBlob(“azurefolder/logfile.txt”,”containerName”,”Some text”);

如何将本地文件夹结构以及文件复制到容器中

public static void UploadFolders(string sourceFolderPath)
{
 string storageConnection = "DefaultEndpointsProtocol=https;AccountName=abcStorage;
                              AccountKey=longkey;EndpointSuffix=core.windows.net";
 CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(storageConnection);

 if (cloudStorageAccount != null)
 {
   CloudBlobClient client = cloudStorageAccount.CreateCloudBlobClient();
   CloudBlobContainer container = client.GetContainerReference("containerName");
   container.CreateIfNotExistsAsync();
   container.SetPermissionsAsync(new BlobContainerPermissions 
          { PublicAccess =BlobContainerPublicAccessType.Container });

   var folders = System.IO.Directory.GetDirectories(sourceFolderPath);

   foreach (var folder in folders)
    {
     var files = System.IO.Directory.GetFiles(folder);
     foreach (var file in files)
     {
      var filename = System.IO.Path.GetFileName(file);
      var foldername =  System.IO.Path.GetFileName(Path.GetDirectoryName(file));
      string strFileName = foldername + "/" + filename;
      CloudBlockBlob blockblob = container.GetBlockBlobReference(strFileName);
      blockblob.UploadFromFileAsync(file);
      }
     }
  }
}

您可以这样调用此方法

UploadFolders(“D:/SomeFolder/”);

结论

我尽量保持简单。希望这有帮助。

历史

  • 2019年3月20日:初始版本
© . All rights reserved.