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

标签 java azure azure-blob-storage

我正在使用 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 中唯一迭代的 blob是目录,没有预期的文件。所以在日志中我只得到以下 URI:

https://blablablabla.blob.core.windows.net/aDirectory/aSubdirectoryWithManyFiles/

我应该怎么做才能访问每个文件?

万一我有多个子目录,如下例所示?

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

提前致谢

<小时/>

编辑

为了使方法可测试,该项目使用包装器和接口(interface),而不是直接使用 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 中。 ...

最佳答案

我必须说,之前的回答让我浪费了时间;问题在于,只有一个 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

关于java - 列出 Azure 中(子)目录中的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53088343/

相关文章:

java - Hibernate 5.2.7 - java.lang.NoSuchMethodError : org. hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Map;

azure - 上传到 Azure Blob 时请求的资源上不存在 'Access-Control-Allow-Origin' header

Azure 备份与快照

c# - 将 SQL Server 2012 指定为目标平台的项目可能会遇到与 Microsoft Azure SQL 数据库 v12 的兼容性问题

java - 使用 Windows Azure 在云中安装 Red5 服务器?

c# - 如何在容器之间复制 blob?

java - 我如何模拟 JWT.decode?

java - System.out 声明为 static final 并用 null 初始化?

java - 在java中播放mp3文件 - nullpointerException

sql - 不支持将Azure数据库导入本地