gpt4 book ai didi

azure - ListBlobsSegmentedAsync 突然停止返回 Blob 目录中的文件,即使存储资源管理器显示文件在那里

转载 作者:行者123 更新时间:2023-12-03 01:01:26 26 4
gpt4 key购买 nike

我尝试了不同的方法来搜索文件夹中的文件,尽管 Azure 存储资源管理器清楚地显示存在文件,并且完全相同的代码和配置之前已运行过,但 ListBlogsSementedAsync 返回 0 个文件。

使用的代码:

    var test = await directoryInfo.ListBlobsSegmentedAsync(new BlobContinuationToken());

var fileList = await directoryInfo.ListBlobsSegmentedAsync(true, BlobListingDetails.None, take, null, null, null, new CancellationToken());

我正在使用配置为 Datalake v2 的存储帐户。

当存储帐户配置为标准 blob 时,我也遇到了同样的情况,在这种情况下,我可以重命名该文件夹,它会再次工作。使用数据湖重命名不起作用。无论如何,重命名并不是一个真正可行的解决方法。

我也尝试过使用不同的 BlobListingDetails,但没有任何效果。

正在运行的进程是我有一个单独的作业,它将文件上传到文件夹中进行处理,该作业列出了文件夹中的前 X 个文件并下载它们以进行进一步处理。这可以工作一段时间,但过了一会儿,不到一天,ListBlobsSegmentedAsync 返回 0 个文件。当我使用 Azure 存储资源管理器并检查文件夹时,文件夹中有数千个文件,并且根据处理的数据,这是正确的答案。

编辑:

使用延续 token 实现:

        var directoryInfo = _blobContainer.GetDirectoryReference(directory);

BlobContinuationToken blobContinuationToken = null;
var list = new List<IListBlobItem>();
do
{
var resultSegment = await directoryInfo.ListBlobsSegmentedAsync(blobContinuationToken);

// Get the value of the continuation token returned by the listing call.
blobContinuationToken = resultSegment.ContinuationToken;
list.AddRange(resultSegment.Results);
}
while (blobContinuationToken != null && list.Count < take); // Loop while the continuation token is not null.

var filePaths = list.Select(x => (x as IListBlobItem)?.Uri.ToString());
return filePaths.Where(x => !string.IsNullOrEmpty(x)).ToList();

最佳答案

我认为您不应该执行 new BlobContinuationToken()。这可能会“混淆”SDK。 您必须首先传递null。另外,你真的在​​迭代结果吗? IE。评估生成的ContinuationToken?第一页始终可以为空,您必须检查 token 以检测是否还有更多可能的结果。

Why is ListBlobsSegmentedAsync only returning results on second page?

It's not at all unexpected that you can occasionally get empty pages or pages with less than the max results along with a continuation token.

https://github.com/Azure-Samples/azure-sdk-for-net-storage-blob-upload-download/blob/master/v11/Program.cs

BlobContinuationToken blobContinuationToken = null;

do
{
var resultSegment = await cloudBlobContainer.ListBlobsSegmentedAsync(null, blobContinuationToken);

// Get the value of the continuation token returned by the listing call.
blobContinuationToken = resultSegment.ContinuationToken;
foreach (IListBlobItem item in resultSegment.Results)
{
Console.WriteLine(item.Uri);
}
}
while (blobContinuationToken != null); // Loop while the continuation token is not null.

在您的情况下,您可能不想等到 token 为 null,您可能希望将其与跟踪返回的项目计数结合起来。

关于azure - ListBlobsSegmentedAsync 突然停止返回 Blob 目录中的文件,即使存储资源管理器显示文件在那里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59681691/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com