fre*_*sko 5 java azure azure-blob-storage
我正在使用 Java 开发一个 azure 函数。我需要迭代以下文件夹中的所有文件
aDirectory/aSubdirectoryWithManyFiles/
Run Code Online (Sandbox Code Playgroud)
该路径中有很多文件:
aDirectory/aSubdirectoryWithManyFiles/file1
aDirectory/aSubdirectoryWithManyFiles/file2
aDirectory/aSubdirectoryWithManyFiles/file3
aDirectory/aSubdirectoryWithManyFiles/file4
aDirectory/aSubdirectoryWithManyFiles/file5
Run Code Online (Sandbox Code Playgroud)
所以我写了下面的代码来获取它们:
// 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
}
}
Run Code Online (Sandbox Code Playgroud)
中迭代的唯一 blobfor
是目录,没有预期的文件。所以在日志中我只得到以下 URI:
https://blablablabla.blob.core.windows.net/aDirectory/aSubdirectoryWithManyFiles/
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能访问每个文件?
万一我有多个子目录,如下例所示?
aDirectory/aSubdirectoryWithManyFiles/files(1-5)
aDirectory/anotherSubdirectoryWithManyFiles/files(6-10)
Run Code Online (Sandbox Code Playgroud)
提前致谢
编辑
为了使方法可测试,该项目使用包装器和接口,而不是直接使用 CloudBlobContainer;基本上,CloudBlobContainer 由下式给出CloudBlobClient.getContainerReference("containername")
回答完这个问题后,我将代码更改为以下内容,因此我使用带有参数的 listBlobsmyCloudBlobContainer.listBlobs("aDirectory", true)
并编写了以下代码以获得全部内容:
// 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
}
}
Run Code Online (Sandbox Code Playgroud)
但这一次,事情根本就没有发生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?
}
Run Code Online (Sandbox Code Playgroud)
这帮助我找到了正确的方法:
归档时间: |
|
查看次数: |
12584 次 |
最近记录: |