Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用function app将文件从源文件夹复制到目标文件夹并删除azure存储帐户中的源文件夹文件_Azure_Azure Functions_Azure Storage Blobs_Azure Blob Storage_Azure Function Async - Fatal编程技术网

如何使用function app将文件从源文件夹复制到目标文件夹并删除azure存储帐户中的源文件夹文件

如何使用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

我可以将源文件夹blob复制到目标文件夹blob并删除源blob 如何将多个Blob复制到源到目标文件夹并删除源Blob

  • 将源blob复制到目标文件夹时,无法为目标文件夹中的blob指定名称

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

    您好,我可以知道下面提供的解决方案是否有助于解决您的问题吗?如果仍然有任何问题,请让我知道。嗨,我可以知道下面提供的解决方案是否有助于解决您的问题吗?如果还有什么问题,请告诉我。