问题描述
我想像这样列出 Google Cloud Storage 目录中的所有 blob:
public List<Blob> getFiles(String bucketName,String path) {
final Storage storage = storagesupplier.get();
final Page<Blob> blobs =
storage.list(
bucketName,BlobListOption.currentDirectory(),BlobListOption.prefix((path.endsWith("/") ? path : (path + "/"))));
final Iterator<Blob> blobIterator = blobs.iterateall().iterator();
final List<Blob> files = new ArrayList<>();
while (blobIterator.hasNext()) {
Blob blob = blobIterator.next();
System.out.println(blob.getName() + ",isDirectory: " + blob.isDirectory());
if (!blob.isDirectory()) {
files.add(blob);
}
}
return files;
}
在我的存储桶中,我有一个名为 input
的目录,我正在使用我的存储桶名称和路径 = input/
调用上述方法。
在日志中我得到:
input/,isDirectory: false
input/1.json,isDirectory: false
input/2.json,isDirectory: false
input/3.json,isDirectory: false
我发现有两个问题:
input
目录在列表中。这我可以理解,因为它还包含 prefix
方法调用中的 list(...)
集。
但我的问题是:为什么 isDirectory()
对于 input
blob 返回 false,因为它显然是一个目录?
isDirectory()
方法的文档保留:
如果当前 blob 代表一个目录,则返回 true。仅当使用 Storage.BlobListOption.currentDirectory() 选项时 Storage.list(String,Storage.BlobListOption) 返回 blob 时才会发生这种情况。 [...]
我的 Google Cloud Storage 客户端的版本:
com.google.cloud:google-cloud-storage:1.113.9
解决方法
我已经answered a similar question.
TL;DR:在没有目录的平台上查找目录是一个很大的错误!
IMO,这是 Java 客户端库开发人员犯的错误。
所以,不要依赖目录指示符。了解底层平台并明智地使用它。