如何从Java中删除“文件夹”中的所有文件或GoogleCloudBucket中的前缀文件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (134)

我知道Google云端存储中“文件夹”的概念是不存在或不同的,但我需要一种方法来删除“文件夹”中的所有对象或使用Java中的给定前缀。

GcsService有一个删除函数,但据我所知它只需要1个GscFilename对象并且不支持通配符(即“folderName / **”不起作用)。

提问于
用户回答回答于

API仅支持一次删除单个对象。您只能使用许多HTTP请求或批量处理许多删除请求来请求许多删除。没有API调用使用通配符等删除多个对象。为了删除具有特定前缀的所有对象,您需要列出对象,然后对与该模式匹配的每个对象进行删除调用。

当你要求删除路径“gs:// bucket / dir / **时,命令行实用程序gsutil就是这样做的。它获取与该模式匹配的对象列表,然后对每个模块进行删除调用。他们。

如果您需要快速解决方案,您可以始终拥有Java程序exec gsutil。

以下是与上述答案相对应的代码,以防其他人想要使用它:

public void deleteFolder(String bucket, String folderName) throws CoultNotDeleteFile {
  try
  {
    ListResult list = gcsService.list(bucket, new ListOptions.Builder().setPrefix(folderName).setRecursive(true).build());

    while(list.hasNext())
    {
      ListItem item = list.next();
      gcsService.delete(new GcsFilename(file.getBucket(), item.getName()));
    }
  }
  catch (IOException e)
  {
    //Error handling
  }
}

请注意,对象列表最终是一致的,这意味着如果最近创建了对象,则无法保证捕获所有对象。

用户回答回答于

我意识到这是一个老问题,但我偶然发现了同样的问题并找到了解决问题的不同方法。

Storage类中的谷歌云计算的Java客户端存储的方法包括列出在桶中的斑点,这也是可以接受的选项来设置一个前缀,筛选出特定的斑点名称开头的前缀。

例如,从桶中删除具有给定前缀的所有文件可以像这样实现:

Storage storage = StorageOptions.getDefaultInstance().getService();
Iterable<Blob> blobs = storage.list("bucket_name", Storage.BlobListOption.prefix("prefix")).iterateAll();
for (Blob blob : blobs) {
    blob.delete(Blob.BlobSourceOption.generationMatch());
}

扫码关注云+社区

领取腾讯云代金券