Удалить пустую папку S3 .Net SDK - PullRequest
1 голос
/ 25 марта 2019

Я использую .Net Core вместе с Amazon .NET SDK для загрузки и извлечения вещей из S3. Я использую структуру папок в S3, которая включает в себя вставку пустого каталога с несколькими подкаталогами.

Позже я вставляю файлы в эти каталоги и перемещаю их. Теперь мне нужно полностью удалить каталог.

Я могу удалить все содержимое каталога с помощью

await client.DeleteObjectAsync(bucketName, keyName, null).ConfigureAwait(false);

где я перебираю все файлы, которые хочу удалить в данном сегменте. Тем не менее, это всегда оставляет меня с пустой структурой папок, в S3 я вижу, что он имеет содержимое 0 байт, но я не хочу разбирать тысячи пустых папок, чтобы найти те, которые действительно имеют данные.

Есть ли способ удалить пустую папку из S3 с помощью AWS .NET SDK?

Обновление:

Я могу удалить все, что хочу в папке, кроме самой папки.

using (IAmazonS3 client = new AmazonS3Client(awsCreds, Amazon.RegionEndpoint.USEast1))
            {
                try
                {
                    DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest();
                    ListObjectsRequest listRequest = new ListObjectsRequest
                    {
                        BucketName = bucketName,
                        Prefix = prefix,
                        //Marker = prefix,
                    };

                    ListObjectsResponse response = await client.ListObjectsAsync(listRequest).ConfigureAwait(false);
                    // Process response
                    foreach (S3Object entry in response.S3Objects)
                    {
                        deleteRequest.AddKey(entry.Key);
                    }

                    deleteRequest.BucketName = bucketName;
                    var response2 = await client.DeleteObjectsAsync(deleteRequest).ConfigureAwait(false);

                    return true;
                }
                catch (AmazonS3Exception amazonS3Exception)
                {
                    if (amazonS3Exception.ErrorCode != null
                        && (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId", StringComparison.Ordinal)
                        || amazonS3Exception.ErrorCode.Equals("InvalidSecurity", StringComparison.Ordinal)))
                    {
                        logger.LogError("AwsS3Service.DeleteFileFromBucket Error - Check the provided AWS Credentials.");
                    }
                    else
                    {
                        logger.LogError($"AwsS3Service.DeleteFileFromBucket Error - Message: {amazonS3Exception.Message}");
                    }
                }
            }

При этом удаляется все содержимое выбранного мной каталога, а также все подкаталоги. Но основной каталог остается, есть ли способ удалить этот основной каталог.

1 Ответ

0 голосов
/ 28 марта 2019

Ваш код находится на 99% пути.Единственное, что вам нужно сделать, это добавить переменную prefix к вашим ключам, которые также будут удалены.Технически, это 0-байтовый объект, который также нужно «удалить».

Например, после прохождения всех объектов в ответе, добавьте переменную prefix, которая быладобавлен, чтобы найти все эти вещи.

foreach (S3Object entry in response.S3Objects)
{
    deleteRequest.AddKey(entry.Key);
}

// Add the folder itself to be deleted as well
deleteRequest.AddKey(prefix);
...