微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Google Cloud Storage 上的目录中列出 Blob 会返回错误的结果

如何解决在 Google Cloud Storage 上的目录中列出 Blob 会返回错误的结果

我想像这样列出 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 客户端库开发人员犯的错误。

所以,不要依赖目录指示符。了解底层平台并明智地使用它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。