列出 Azure 中(子)目录中的所有文件

5

我正在使用Java开发Azure函数。我需要迭代以下文件夹中的所有文件:

aDirectory/aSubdirectoryWithManyFiles/

那个路径下有很多文件:

aDirectory/aSubdirectoryWithManyFiles/file1
aDirectory/aSubdirectoryWithManyFiles/file2
aDirectory/aSubdirectoryWithManyFiles/file3
aDirectory/aSubdirectoryWithManyFiles/file4
aDirectory/aSubdirectoryWithManyFiles/file5

所以我编写了以下代码以获取它们:

// myCloudBlobContainer is a CloudBlobContainer
// I expected to get all files thanks to the next row
Iterable<ListBlobItem> blobs = myCloudBlobContainer.listBlobs();
// The only blob found in the container is the directory itself
for (ListBlobItem blob : blobs) {
    //log the current blob URI
    if (blob instanceof CloudBlob) {  // this never happens
        CloudBlob cloudBlob = (CloudBlob) blob;
        //make nice things with every found file
    }
}

唯一在 for 中迭代的是目录,没有任何预期的文件。因此,在日志中我只得到了以下 URI:
https://blablablabla.blob.core.windows.net/aDirectory/aSubdirectoryWithManyFiles/

如何才能访问每个文件?

如果我有多个子目录,像以下示例那样怎么办?

aDirectory/aSubdirectoryWithManyFiles/files(1-5)
aDirectory/anotherSubdirectoryWithManyFiles/files(6-10)

提前感谢你


编辑

为了使方法可测试,该项目使用包装器和接口而不是直接使用 CloudBlobContainer; 基本上,CloudBlobContainer 是通过 CloudBlobClient.getContainerReference("containername") 给出的。

在回答这个问题之后,我将代码更改为以下形式,因此我使用了带有参数 myCloudBlobContainer.listBlobs("aDirectory", true) 的 listBlobs,并编写了以下代码以获取它们所有:

// myCloudBlobClient is a CloudBlobClient
CloudBlobContainer myCloudBlobContainer = myCloudBlobClient.getContainerReference("containername")
// I expected to get all files thanks to the next row
Iterable<ListBlobItem> blobs = myCloudBlobContainer.listBlobs("aDirectory", true); // HERE THE CHANGE
// No blob found this time
for (ListBlobItem blob : blobs) { // NEVER IN THE FOR
    //log the current blob URI
    if (blob instanceof CloudBlob) {
        CloudBlob cloudBlob = (CloudBlob) blob;
        //make nice things with every found file
    }
}

但是这一次,在 for 循环中完全没有执行...
2个回答

3
我必须说,之前的答案让我浪费了时间;问题在于只有一个 for 不足以在文件夹中查找文件。第一个 for 查找文件夹和子文件夹,可能还包括在“根目录”(我们称之为这样)中的文件(也许我没有检查)。
有了文件夹之后,对于每个文件夹,我们必须将其转换为 CloudBlobDirectory,以便使用另一个 for 查看并迭代所有包含的文件。
以下是适用于我的解决方案:
// myCloudBlobClient is a CloudBlobClient
CloudBlobContainer myCloudBlobContainer = myCloudBlobClient.getContainerReference("containername")
// I expected to get all files thanks to the next row
Iterable<ListBlobItem> blobs = myCloudBlobContainer.listBlobs();
// only directories here, another for needed to scan files
for (ListBlobItem blob : blobs) {
    if (blob instanceof CloudBlobDirectory) {
        CloudBlobDirectory directory = (CloudBlobDirectory)blob;
        //next is in try/catch
        Iterable<ListBlobItem> fileBlobs = directory.listBlobs();
        for (ListBlobItem fileBlob : fileBlobs) {
            if (fileBlob instanceof CloudBlob) {
            CloudBlob cloudBlob = (CloudBlob) fileBlob;
            //make nice things with every found file
            }
        }
    } // else: may be we found a cloudBlob in root?
}

这篇文章帮助我找到了正确的方法: https://social.msdn.microsoft.com/Forums/en-US/1cfdc91f-e588-4839-a878-9650339a0a06/list-all-blobs-in-c?forum=windowsazuredata

1
我很惊讶在Azure存储中这么复杂。难道没有像GCS那样简单的方法,只需传递文件夹前缀就可以工作吗? - Bugs Buggy

2

尝试使用以下的 listBlobs 方法重写:

listBlobs(String prefix, boolean useFlatBlobListing)

所以你的代码应该是这样的:
Iterable<ListBlobItem> blobs = myCloudBlobContainer.listBlobs("aDirectory", true);

这将列出您的Blob容器中“aDirectory”虚拟文件夹内的所有Blob。

你可以使用Gaurav建议的方法,但我建议使用listBlobsSegmented(String prefix)。这个方法将有助于避免从Blob存储返回的结果限制。 - Harish
@Harish...listBlobs方法在处理连续令牌时会在内部处理,而在使用listBlobsSegmented时,您需要在代码中处理连续令牌。我的首选也是使用此方法而不是listBlobs。在这种特定的情况下,我建议使用https://azure.github.io/azure-sdk-for-java/com/microsoft/azure/storage/blob/CloudBlobContainer.html#listBlobsSegmented-java.lang.String-boolean-java.util.EnumSet-java.lang.Integer-com.microsoft.azure.storage.ResultContinuation-com.microsoft.azure.storage.blob.BlobRequestOptions-com.microsoft.azure.storage.OperationContext-。 - Gaurav Mantri
如果我理解正确,你们两个都同意使用 listBlobsSegmented,是吗? - fresko
“dir” 是你的子目录的名称吗? - Gaurav Mantri
container.listBlobs("aDirectory", true)也没有看到任何文件。抱歉Gaurav,我删除了我的评论,因为我无法编辑,在注意到你写了一些东西之前。aDirectory是包含带有文件的子目录的目录。 - fresko
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接