我知道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
}
}
聚会非常晚,但这是目前的谷歌搜索。我们可以通过利用com.google.cloud.storage.StorageBatch
有效地删除多个blob。
像这样:
public static void rmdir(Storage storage, String bucket, String dir) {
StorageBatch batch = storage.batch();
Page<Blob> blobs = storage.list(bucket, Storage.BlobListOption.currentDirectory(),
Storage.BlobListOption.prefix(dir));
for(Blob blob : blobs.iterateAll()) {
batch.delete(blob.getBlobId());
}
batch.submit();
}
当您的存储桶/文件夹包含非常少量的项目时,这应该比逐个删除快得多。
编辑,因为这是一个小小的关注,我将演示错误处理:
public static boolean rmdir(Storage storage, String bucket, String dir) {
List<StorageBatchResult<Boolean>> results = new ArrayList<>();
StorageBatch batch = storage.batch();
try {
Page<Blob> blobs = storage.list(bucket, Storage.BlobListOption.currentDirectory(),
Storage.BlobListOption.prefix(dir));
for(Blob blob : blobs.iterateAll()) {
results.add(batch.delete(blob.getBlobId()));
}
} finally {
batch.submit();
}
return results.stream().allMatch(r -> r != null && r.get());
}
此方法将:删除给定存储桶的给定文件夹中的每个blob,如果是,则返回true。否则该方法将返回false。可以查看batch.delete()
的返回方法,以便更好地理解和防错。
要确保删除所有项目,您可以将其称为:
boolean success = false
while(!success)) {
success = rmdir(storage, bucket, dir);
}
我意识到这是一个老问题,但我偶然发现了同样的问题并找到了解决问题的不同方法。
Storage
中的Google Cloud Java Client for Storage类包括一个列出存储桶中blob的方法,该方法还可以接受一个选项来设置前缀以将结果过滤到名称以前缀开头的blob。
例如,从桶中删除具有给定前缀的所有文件可以像这样实现:
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());
}