我知道‘文件夹’的想法在谷歌云存储中是不存在的或不同的,但我需要一种方法来删除‘文件夹’中的所有对象或Java中给定的前缀。
GcsService有一个删除功能,但据我所知,它只接受一个GscFilename对象,并且不支持通配符(即"folderName/**“不起作用)。
有什么建议吗?
发布于 2014-10-14 06:51:55
该接口一次仅支持删除单个对象。您只能使用多个HTTP请求或批处理多个delete请求来请求多次删除。不存在使用通配符等删除多个对象的API调用。为了删除具有某个前缀的所有对象,您需要列出这些对象,然后对与该模式匹配的每个对象进行delete调用。
当您要求命令行实用程序gsutil删除路径"gs://bucket/dir/**“时,它就会执行此操作。它会获取与该模式匹配的对象列表,然后对每个对象进行删除调用。
如果需要快速解决方案,可以随时使用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
}
}
发布于 2017-12-30 09:12:33
我意识到这是一个老问题,但我只是偶然发现了同样的问题,并找到了不同的方法来解决它。
Google Cloud Java Client for Storage中的Storage
类包括一个列出存储桶中的blobs的方法,该方法还可以接受一个选项来设置前缀,以便将结果过滤到名称以前缀开头的blobs。
例如,从存储桶中删除所有具有给定前缀的文件,可以这样实现:
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());
}
https://stackoverflow.com/questions/26349901
复制相似问题