如何查找文件(blob)是否存在于容器内的文件夹(虚拟目录)中

How to find if a file (blob) exists in a folder (virtual directory) inside a container

我想查找我的 blob 容器内的虚拟目录中是否存在任何文件。里面有可能有成千上万个文件,所以我想使用优化的方法。另外,如果文件存在,我想列出这些文件。

我在容器中的目录结构是 Folder/Subfolder1/file.txt

Folder/Subfolder2/file.txt

所以这里我想检测一下 Subfolder1 中是否有文件。由于 azure 存储具有虚拟目录结构,如果没有 blob,Subfolder1 将不存在。因此,我想设置条件,使其查找 Subfolder1 是否存在,如果存在,则列出其中的所有文件。

还有什么更好的方法可以从 GetBlobs(prefix: foldername) 方法获取有限数量的记录,假设我的容器中有 500 个文件,而我只想列出 50 个。目前我正在使用 foreach 循环和计数器来列出 50 个文件并在计数为 50

时跳出循环
            var inputfiles = ContainerClient.GetBlobsAsync(prefix: inputfolder);
                var count = 0;
                List<string> FilesList = new List<string>();

                await foreach (var blob in inputfiles)
                {
                    count++;
                    if (count == 50)
                        break;
                    FilesList.Add(blob.Name);
                }

我使用 Azure SDK v12 和 C# 作为语言

Hence I want to setup condition such that it finds if Subfolder1 exists and if yes list all files inside that.

如你的问题和我的评论所述,子文件夹并不真正存在,除非其中有一个 blob,因为子文件夹在 Azure Blob 存储中是虚拟的。

您可以做的只是尝试通过将子文件夹路径(在您的情况下为 Folder/Subfolder1/)指定为 blob 前缀来列出子文件夹内的 blob。如果存在 blob,您将获得该子文件夹内的 blob 列表。如果不存在 blob,那么您将得到一个空集合。您无需先检查是否存在再列出 blob,因为在这两种情况下您都必须列出 blob。

以上答案适用于禁用分层命名空间的 Azure 存储(即非数据湖帐户)。对于 Azure Data Lake Gen 2 存储帐户,方法会有所不同,因为那里的文件夹不是虚拟的。

更新

请将您的代码更改为如下所示:

var blobPages = ContainerClient.GetBlobsAsync(prefix: inputFolder).AsPages(pageSizeHint: 50);
await foreach (var blobPage in blobPages)
{
    foreach (var blob in blobPage.Values)
    {
        FilesList.Add(blob.Name);
    }
}

本质上是为了限制记录的数量,您必须添加 AsPages(pageSizeHint: 50),它会 return 从与前缀匹配的容器中最多选择前 50 个 blob。

更新 2

请尝试下面的代码。

var blobPages = ContainerClient.GetBlobsAsync(prefix: inputFolder).AsPages(pageSizeHint: 50).GetAsyncEnumerator();
await blobPages.MoveNextAsync();
var blobPage = blobPages.Current.Values;
foreach (var blob in blobPage)
{
        FilesList.Add(blob.Name);
}