2015-12-23 2 views
1

Предположит следующие файлы существуют в моем ведре на S3Как удалить все «дети» объекта в моем ковше?

mybucket/folder1/folder2/myfile.txt 
mybucket/folder1/folder2/myfile2.txt 
mybucket/folder1/folder4/myfile3.txt 

То, что я хотел бы сделать, это удалить все файлы, которые живут под mybucket/folder1/folder2/ фактически не зная точно, какие файлы есть. Я понимаю, что папки не являются реальными и фактически являются объектными ключами, но мне все еще нужно добиться этого эффекта.

Я пробовал удалить mybucket/folder1/folder2/ (с завершающей косой чертой и без нее), но похоже, что ничего не происходит; ничего не удаляется. Там нет ошибок и HttpResponse 204.

ответ

3

Это было некоторое время, я не касаюсь службы AmazonS3, но это то, что вы должны сделать:

  1. list all object keys в пути, который вы хотите
  2. для каждого ключа, issue a delete action получить все ключи и 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 объекта.

+0

Спасибо, что сработало. Странно, что я могу перечислить из «папок», но я не могу удалить «папку» – Sinaesthetic

+0

@ Синестетическая проверка разрешений на эту клавишу «папка» – balexandre

+0

обновленный код: добавлен способ удаления всех ключей за одно действие, чтобы вы могли сохранить Полеты API для каждого ключа удалены ... – balexandre

Смежные вопросы