Azure Blob C# 非平凡






4.71/5 (8投票s)
Azure Blob 存储 .NET Core C# 的实用方法
引言
在为客户解决问题时,我正在处理 Azure 函数和 Blob 存储的集成,我需要 Blob 存储方面的帮助。虽然有很多关于 Azure 存储的基本连接、写入和下载的教程,但几乎所有这些教程都缺少以下一些场景:
- 如何循环遍历容器内的目录中的所有 Blob
- 如何附加到已存在的 Blob
- 如何将本地文件夹结构以及文件复制到容器中
如何循环遍历容器内的目录中的所有 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日:初始版本