如何删除存储桶中某个对象的所有 "children"?
How do I delete all "children" of an object in my bucket?
假设 S3 上我的存储桶中存在以下文件
mybucket/folder1/folder2/myfile.txt
mybucket/folder1/folder2/myfile2.txt
mybucket/folder1/folder4/myfile3.txt
我想做的是删除 mybucket/folder1/folder2/
下的所有文件,而实际上并不知道那里到底有哪些文件。我知道文件夹不是真实的,实际上是对象键,但我仍然需要实现这种效果。
我试过删除 mybucket/folder1/folder2/
(带和不带尾部斜线),但似乎没有发生任何事情;什么都没有被删除。没有错误,HttpResponse 为 204。
我已经有一段时间没有接触 AmazonS3 服务了,但这是你应该做的:
- list all object keys在你想要的路径
每个键,issue a delete action get all keys and delete them in one go
在代码中它应该是这样的(建议示例的粗略编译):
static IAmazonS3 client;
static void DeleteFolderContents(string bucketName, string folderPath)
{
using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1))
{
var allKeys = GetFolderContents(bucketName, fodlerPath);
var allDeletes = DeleteAllKeys(bucketName, allKeys);
// allDeletes has # of deleted objects
}
}
// using DeleteObjectsRequest (all keys at once)
static int DeleteAllKeys(string bucketName, List<string> allKeys)
{
var multiObjectDeleteRequest = new DeleteObjectsRequest();
multiObjectDeleteRequest.BucketName = bucketName;
foreach(var key in allKeys)
multiObjectDeleteRequest.AddKey(key, null); // version ID is null
try
{
var response = client.DeleteObjects(multiObjectDeleteRequest);
return response.DeletedObjects.Count;
}
catch (DeleteObjectsException e)
{
// throw exception.
}
return 0;
}
// delete one by one
static void DeleteKey(string bucketName, string keyName)
{
DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest
{
BucketName = bucketName,
Key = keyName
};
try
{
client.DeleteObject(deleteObjectRequest);
}
catch (AmazonS3Exception s3Exception)
{
// throw
}
}
// list all keys for a given path
static List<string>
GetFolderContents(string bucketName, string folderPath)
{
var r = new List<string>();
try
{
ListObjectsRequest request = new ListObjectsRequest
{
BucketName = bucketName,
Prefix = folderPath,
MaxKeys = 100
};
do
{
ListObjectsResponse response = client.ListObjects(request);
foreach (S3Object entry in response.S3Objects)
r.Add(entry.Key);
// If response is truncated, set the marker to get the next
// set of keys.
if (response.IsTruncated)
request.Marker = response.NextMarker;
else
request = null;
} while (request != null);
}
catch (AmazonS3Exception amazonS3Exception)
{
// throw error
}
}
您还可以通过 looking at this article 找到一种监听文件夹中所有按键的方法。
已编辑:添加了一个单一操作调用以使用 DeleteObjectsRequest
对象删除所有键。
假设 S3 上我的存储桶中存在以下文件
mybucket/folder1/folder2/myfile.txt
mybucket/folder1/folder2/myfile2.txt
mybucket/folder1/folder4/myfile3.txt
我想做的是删除 mybucket/folder1/folder2/
下的所有文件,而实际上并不知道那里到底有哪些文件。我知道文件夹不是真实的,实际上是对象键,但我仍然需要实现这种效果。
我试过删除 mybucket/folder1/folder2/
(带和不带尾部斜线),但似乎没有发生任何事情;什么都没有被删除。没有错误,HttpResponse 为 204。
我已经有一段时间没有接触 AmazonS3 服务了,但这是你应该做的:
- list all object keys在你想要的路径
每个键,issue a delete actionget all keys and delete them in one go
在代码中它应该是这样的(建议示例的粗略编译):
static IAmazonS3 client;
static void DeleteFolderContents(string bucketName, string folderPath)
{
using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1))
{
var allKeys = GetFolderContents(bucketName, fodlerPath);
var allDeletes = DeleteAllKeys(bucketName, allKeys);
// allDeletes has # of deleted objects
}
}
// using DeleteObjectsRequest (all keys at once)
static int DeleteAllKeys(string bucketName, List<string> allKeys)
{
var multiObjectDeleteRequest = new DeleteObjectsRequest();
multiObjectDeleteRequest.BucketName = bucketName;
foreach(var key in allKeys)
multiObjectDeleteRequest.AddKey(key, null); // version ID is null
try
{
var response = client.DeleteObjects(multiObjectDeleteRequest);
return response.DeletedObjects.Count;
}
catch (DeleteObjectsException e)
{
// throw exception.
}
return 0;
}
// delete one by one
static void DeleteKey(string bucketName, string keyName)
{
DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest
{
BucketName = bucketName,
Key = keyName
};
try
{
client.DeleteObject(deleteObjectRequest);
}
catch (AmazonS3Exception s3Exception)
{
// throw
}
}
// list all keys for a given path
static List<string>
GetFolderContents(string bucketName, string folderPath)
{
var r = new List<string>();
try
{
ListObjectsRequest request = new ListObjectsRequest
{
BucketName = bucketName,
Prefix = folderPath,
MaxKeys = 100
};
do
{
ListObjectsResponse response = client.ListObjects(request);
foreach (S3Object entry in response.S3Objects)
r.Add(entry.Key);
// If response is truncated, set the marker to get the next
// set of keys.
if (response.IsTruncated)
request.Marker = response.NextMarker;
else
request = null;
} while (request != null);
}
catch (AmazonS3Exception amazonS3Exception)
{
// throw error
}
}
您还可以通过 looking at this article 找到一种监听文件夹中所有按键的方法。
已编辑:添加了一个单一操作调用以使用 DeleteObjectsRequest
对象删除所有键。