当前位置: 首页 > 知识库问答 >
问题:

Azure函数定时器触发器可以迭代容器或目录中的所有blobs吗?

能帅
2023-03-14

是否可以使用定期触发的函数(计时器触发器)循环访问 Azure 存储容器中的所有 Blob 并对其进行操作。

路径: {容器名称}/{目录名称}/{文件名}

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace SampleNamespace
{
    public static class SampleFunction
    {
        [FunctionName("SampleFunction")]
        public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log)
        {
            // How to iterate an operate on all blobs?
        }
    }
}

共有2个答案

高茂
2023-03-14

除了使用存储blob sdk(Ivan provide)之外,您可以使用blob绑定来获取容器客户端,然后执行列表操作。

您可以参考 blob 输入用法,可以找到它支持绑定 CloudBlobContainerCloudBlobDirectory 类型。您可以参考下面的代码

[FunctionName("Function1")]
public static async System.Threading.Tasks.Task RunAsync([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log,
            [Blob("test",Connection = "AzureWebJobsStorage")]CloudBlobContainer container)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
            var segment = await container.ListBlobsSegmentedAsync(null);
            var blobs = segment.Results;
            foreach (var blob in blobs) {

                log.LogInformation(blob.GetType().ToString(), blob.ToString());
            }
        }

如果将返回所有 blob 和 blob 目录,下面是我的测试结果,所以你需要判断返回类型是 CloudBlockBlob 还是 CloudBlobDirectory 然后执行列表操作。

戚弘和
2023-03-14

您应该为azure函数安装此blob存储nuget包Microsoft.Azure.Storage.Blob。然后您可以使用ListBlossync方法代替async方法ListBlosSegmentedAsync。最后,您可以编写代码来操作这些blob。

代码如下:

using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Blob;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using System;

namespace FunctionApp7
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

            log.LogInformation("the blobs list:");

            var connectionString = "DefaultEndpointsProtocol=https;AccountName=xx;AccountKey=xxxx;EndpointSuffix=core.windows.net";
            var containerName = "test4";
            var directoryName = "sub1";

            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            CloudBlobContainer container = blobClient.GetContainerReference(containerName);

            //list blobs in a container
            var blobs = container.ListBlobs(useFlatBlobListing: true);

            foreach (IListBlobItem item in blobs)
            {
                if (item.GetType() == typeof(CloudBlockBlob))
                {
                    CloudBlockBlob blob = (CloudBlockBlob)item;
                    //other operation.
                }
            }

            //list blobs in a directory
            CloudBlobDirectory directory = container.GetDirectoryReference(directoryName);
            var blobs_2 = directory.ListBlobs(useFlatBlobListing: true);

            foreach(IListBlobItem item in blobs_2)
            {
                if (item.GetType() == typeof(CloudBlockBlob))
                {
                    CloudBlockBlob blob = (CloudBlockBlob)item;
                    //other operation.
                }
            }


        }
    }
}
 类似资料:
  • 我有一个现有的 Azure 函数,用于解压缩文件并将每个文件添加为 blob。 我现在想迭代这些文件并执行它们(它们是SQL文件)。我不想触发一个基于blob创建的函数,而是在一个函数中运行它们。 在一个函数中,我如何在一个容器中迭代一个blobs列表并获取它们的内容? 谢谢

  • Azure函数存储帐户Blob容器触发器 在我们的一个用例中,我正在为具有以下条件的存储帐户容器中的任何活动寻找Azure函数触发器 < li >具有特定命名约定的容器(名称如xxxx-input) < li >它应该自动检测是否创建了新的容器(具有特定的命名约定) < li>

  • 我正在使用Python 3.x编写一个Azure timer触发器。我已经运行了一个这样的函数。我想我知道怎么做,从JS创建一个然后删除' index.js '并创建一个run.py,但这次,当我运行我的python函数时,我总是得到一个错误,说“没有这样的文件:index.js”。我没有看到函数和“index.js”文件之间有任何联系。 有什么想法吗?

  • 如果你使用blob存储触发器阅读Azure WebJobs上的留档,它们会提到这不是很可靠: WebJobs SDK扫描日志文件以查看新的或更改的blob。这个过程不是实时的;在创建blob后的几分钟或更长时间内,函数可能不会被触发。此外,存储日志是在“尽力而为”的基础上创建的;无法保证所有事件都将被捕获。在某些情况下,日志可能会丢失。如果您的应用程序无法接受blob触发器的速度和可靠性限制,建议

  • 我在使用 blob 触发器的消费计划上创建了一个 Azure 函数。然后,我向 Blob 添加大量文件,并且我希望每次将文件添加到触发器时都会调用 Azure 函数。 因为我使用Azure函数和消耗计划,所以我希望不存在可伸缩性问题,对吗?错。 我可以轻松地将文件添加到blob中,速度比Azure函数处理它们的速度快。一百个用户可以添加到blob中,但在任何时候似乎只有一个Azure函数的实例在工

  • 我对azure非常陌生,正在努力处理eventGrid中的python函数触发器。我正在使用从azure为python创建的现成模板,并出现错误。我将共享这些文件。 (init.py) function.json 主机. json 这是我发送给事件网格的数据集 我得到的错误是 也许在上面的某个地方很容易出错,但我找不到。。 提前感谢!