如何使用function app将文件从源文件夹复制到目标文件夹并删除azure存储帐户中的源文件夹文件
我可以将源文件夹blob复制到目标文件夹blob并删除源blob 如何将多个Blob复制到源到目标文件夹并删除源Blob如何使用function app将文件从源文件夹复制到目标文件夹并删除azure存储帐户中的源文件夹文件,azure,azure-functions,azure-storage-blobs,azure-blob-storage,azure-function-async,Azure,Azure Functions,Azure Storage Blobs,Azure Blob Storage,Azure Function Async,我可以将源文件夹blob复制到目标文件夹blob并删除源blob 如何将多个Blob复制到源到目标文件夹并删除源Blob 将源blob复制到目标文件夹时,无法为目标文件夹中的blob指定名称 public async static void CopyDeleteData(ILogger log) { //copy blobs - from var ConnectionString = Environment.GetEnvironmentVariable("Azur
public async static void CopyDeleteData(ILogger log)
{
//copy blobs - from
var ConnectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
CloudStorageAccount sourceStorageAccount = CloudStorageAccount.Parse(ConnectionString);
CloudBlobClient sourceCloudBlobClient = sourceStorageAccount.CreateCloudBlobClient();
CloudBlobContainer sourceContainer = sourceCloudBlobClient.GetContainerReference("Data");
CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference("SourceFolder/");
CloudBlockBlob targetBlob = sourceContainer.GetBlockBlobReference("SourceFolder/ArchieveFolder/");
var resultSegment = sourceContainer.GetDirectoryReference("SourceFolder/");
var rootDirFolders = resultSegment.ListBlobsSegmentedAsync(true, BlobListingDetails.Metadata,null, null, null, null).Result;
try
{
foreach (var blob in rootDirFolders.Results)
{
log.LogInformation("Blob " + blob.Uri);
await targetBlob.StartCopyAsync(blob.Uri);
}
}
catch (Exception ex)
{
log.LogError(ex.Message);
log.LogError( "Error, source BLOB probably has private access only: " + ex.Message);
}
await targetBlob.FetchAttributesAsync();
while (targetBlob.CopyState.Status == Microsoft.WindowsAzure.Storage.Blob.CopyStatus.Pending)
{
log.LogError("Status: " + targetBlob.CopyState.Status);
Thread.Sleep(500);
await targetBlob.FetchAttributesAsync();
}
if (targetBlob.CopyState.Status != Microsoft.WindowsAzure.Storage.Blob.CopyStatus.Success)
{
log.LogError("Copy failed with status: " + targetBlob.CopyState.Status);
}
await sourceBlob.DeleteAsync();
log.LogInformation( "Done.");
}
当我们使用
targetBlob.startCopySync(blob.Uri)
将blob复制到目标blob时,我们应该将blob名称指定给targetBlob
。在代码中,可以使用:
CloudBlockBlob targetBlob = sourceContainer.GetBlockBlobReference("SourceFolder/ArchieveFolder/");
因此,targetBlob
只有文件夹目录,而没有blob名称
请参考下面我的代码:
var ConnectionString = "xxxxxx";
CloudStorageAccount sourceStorageAccount = CloudStorageAccount.Parse(ConnectionString);
CloudBlobClient sourceCloudBlobClient = sourceStorageAccount.CreateCloudBlobClient();
CloudBlobContainer sourceContainer = sourceCloudBlobClient.GetContainerReference("data");
CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference("SourceFolder/");
//CloudBlockBlob targetBlob = sourceContainer.GetBlockBlobReference("SourceFolder/ArchieveFolder/"); //please remove this line, get "targetBlob" in the foreach loop
var resultSegment = sourceContainer.GetDirectoryReference("SourceFolder/");
var rootDirFolders = resultSegment.ListBlobsSegmentedAsync(true, BlobListingDetails.Metadata, null, null, null, null).Result;
try
{
foreach (var blob in rootDirFolders.Results)
{
string blobUri = blob.Uri.ToString();
string blobName = blobUri.Substring(blobUri.IndexOf("SourceFolder/") + 13);
CloudBlockBlob targetBlob = sourceContainer.GetBlockBlobReference("SourceFolder/ArchieveFolder/" + blobName);
await targetBlob.StartCopyAsync(blob.Uri);
}
}
catch (Exception ex)
{
........
}
运行代码后,我们可以发现三个txt文件从SourceFolder/
复制到SourceFolder/archivefolder/
(如下两个屏幕截图所示)
当我们使用
targetBlob.startCopySync(blob.Uri)
将blob复制到目标blob时,我们应该将blob名称指定给targetBlob
。在代码中,可以使用:
CloudBlockBlob targetBlob = sourceContainer.GetBlockBlobReference("SourceFolder/ArchieveFolder/");
因此,targetBlob
只有文件夹目录,而没有blob名称
请参考下面我的代码:
var ConnectionString = "xxxxxx";
CloudStorageAccount sourceStorageAccount = CloudStorageAccount.Parse(ConnectionString);
CloudBlobClient sourceCloudBlobClient = sourceStorageAccount.CreateCloudBlobClient();
CloudBlobContainer sourceContainer = sourceCloudBlobClient.GetContainerReference("data");
CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference("SourceFolder/");
//CloudBlockBlob targetBlob = sourceContainer.GetBlockBlobReference("SourceFolder/ArchieveFolder/"); //please remove this line, get "targetBlob" in the foreach loop
var resultSegment = sourceContainer.GetDirectoryReference("SourceFolder/");
var rootDirFolders = resultSegment.ListBlobsSegmentedAsync(true, BlobListingDetails.Metadata, null, null, null, null).Result;
try
{
foreach (var blob in rootDirFolders.Results)
{
string blobUri = blob.Uri.ToString();
string blobName = blobUri.Substring(blobUri.IndexOf("SourceFolder/") + 13);
CloudBlockBlob targetBlob = sourceContainer.GetBlockBlobReference("SourceFolder/ArchieveFolder/" + blobName);
await targetBlob.StartCopyAsync(blob.Uri);
}
}
catch (Exception ex)
{
........
}
运行代码后,我们可以发现三个txt文件从SourceFolder/
复制到SourceFolder/archivefolder/
(如下两个屏幕截图所示)
请记住,最简单的方法是使用 您可以声明性地绑定到容器/blob。例如,这些将允许您读取/写入blob: 此绑定将允许您写入容器: 以下示例显示了如何复制和删除Blob:
using BlobMover.Models;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.IO;
using System.Threading.Tasks;
namespace BlobMover
{
public static class BlobMover
{
[StorageAccount("Connection")]
[FunctionName("BlobMover")]
public static async Task Run(
[QueueTrigger("%BlobMover:TriggerQueue%")] BlobMessage msg,
[Blob("{source}-error/{name}", FileAccess.Write)] CloudBlockBlob error,
[Blob("{destination}/{name}", FileAccess.Write)] CloudBlockBlob @out,
[Blob("{source}/{name}", FileAccess.Read)] CloudBlockBlob @in,
ILogger log)
{
var trackingId = Guid.NewGuid();
await @out.StartCopyAsync(@in);
await @in.DeleteAsync();
}
}
}
请记住,最简单的方法是使用 您可以声明性地绑定到容器/blob。例如,这些将允许您读取/写入blob: 此绑定将允许您写入容器: 以下示例显示了如何复制和删除Blob:
using BlobMover.Models;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.IO;
using System.Threading.Tasks;
namespace BlobMover
{
public static class BlobMover
{
[StorageAccount("Connection")]
[FunctionName("BlobMover")]
public static async Task Run(
[QueueTrigger("%BlobMover:TriggerQueue%")] BlobMessage msg,
[Blob("{source}-error/{name}", FileAccess.Write)] CloudBlockBlob error,
[Blob("{destination}/{name}", FileAccess.Write)] CloudBlockBlob @out,
[Blob("{source}/{name}", FileAccess.Read)] CloudBlockBlob @in,
ILogger log)
{
var trackingId = Guid.NewGuid();
await @out.StartCopyAsync(@in);
await @in.DeleteAsync();
}
}
}
您好,我可以知道下面提供的解决方案是否有助于解决您的问题吗?如果仍然有任何问题,请让我知道。嗨,我可以知道下面提供的解决方案是否有助于解决您的问题吗?如果还有什么问题,请告诉我。