Определите, существует ли объект в корзине S3 на основе подстановочного знака - PullRequest
33 голосов
/ 20 августа 2010

Может кто-нибудь показать мне, как определить, существует ли определенный файл / объект в корзине S3, и показать сообщение, если он существует или его нет.

В основном я хочу, чтобы он:

1) Проверьте корзину на моей учетной записи S3, например testbucket

2) Внутри этой корзины посмотрите, есть ли файл с префиксом test_ (test_file.txt или test_data.txt).

3) Если этот файл существует, отобразите MessageBox (или сообщение консоли), что файл существует или что файл не существует.

Может кто-нибудь показать мне, как это сделать?это?

Ответы [ 10 ]

54 голосов
/ 19 апреля 2013

Используйте метод S3FileInfo.Exists :

using (var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey))
{
    S3FileInfo s3FileInfo = new Amazon.S3.IO.S3FileInfo(client, "your-bucket-name", "your-file-name");
    if (s3FileInfo.Exists)
    {
         // file exists
    }
    else
    {
        // file does not exist
    }   
}
46 голосов
/ 05 ноября 2010

Использование AWSSDK для .Net В настоящее время я делаю что-то вроде:

public bool Exists(string fileKey, string bucketName)
{
        try
        {
            response = _s3Client.GetObjectMetadata(new GetObjectMetadataRequest()
               .WithBucketName(bucketName)
               .WithKey(key));

            return true;
        }

        catch (Amazon.S3.AmazonS3Exception ex)
        {
            if (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
                return false;

            //status wasn't not found, so throw the exception
            throw;
        }
}

Это вроде отстой, но пока работает.

12 голосов
/ 08 октября 2012

Это решает это:

Вывести список сегментов для существующих объектов и использовать префикс, например, так.

    var request = new ListObjectsRequest()
        .WithBucketName(_bucketName)
        .WithPrefix(keyPrefix);

    var response = _amazonS3Client.ListObjects(request);

    var exists = response.S3Objects.Count > 0;

    foreach (var obj in response.S3Objects) {
        // act
    }
10 голосов
/ 21 августа 2015

Я знаю, что этому вопросу уже несколько лет, но новый SDK прекрасно с этим справляется. Если кто-то все еще ищет это. Вы ищете S3DirectoryInfo Класс

using (IAmazonS3 s3Client = new AmazonS3Client(accessKey, secretKey))
{
    S3DirectoryInfo s3DirectoryInfo = new Amazon.S3.IO.S3DirectoryInfo(s3Client, "testbucket");
    if (s3DirectoryInfo.GetFiles("test*").Any())
    {
        //file exists -- do something
    }
    else
    {
        //file doesn't exist -- do something else
    }
}
3 голосов
/ 26 апреля 2016

Я использовал следующий код в C # с Amazon S3 версии 3.1.5 (.net 3.5), чтобы проверить, существует ли корзина:

BasicAWSCredentials credentials = new BasicAWSCredentials("accessKey", "secretKey");

AmazonS3Config configurationAmazon = new AmazonS3Config();
configurationAmazon.RegionEndpoint = S3Region.EU; // or you can use ServiceUrl

AmazonS3Client s3Client = new AmazonS3Client(credentials, configurationAmazon);


S3DirectoryInfo directoryInfo = new S3DirectoryInfo(s3Client, bucketName);
            bucketExists = directoryInfo.Exists;// true if the bucket exists in other case false.

Я использовал следующий код (в C # с версией Amazon S33.1.5 .net 3.5) Файл существует.

Опция 1:

S3FileInfo info = new S3FileInfo(s3Client, "butcketName", "key");
bool fileExists = info.Exists; // true if the key Exists in other case false

Опция 2:

ListObjectsRequest request = new ListObjectsRequest();
        try
        {
            request.BucketName = "bucketName";
            request.Prefix = "prefix"; // or part of the key
            request.MaxKeys = 1; // max limit to find objects
            ListObjectsResponse response = s3Client .ListObjects(request);
            return response.S3Objects.Count > 0;
        }
1 голос
/ 27 мая 2019

Не уверен, относится ли это к .NET Framework, но версия AWS SDK (v3) .NET Core поддерживает только асинхронные запросы, поэтому мне пришлось использовать немного другое решение:

/// <summary>
/// Determines whether a file exists within the specified bucket
/// </summary>
/// <param name="bucket">The name of the bucket to search</param>
/// <param name="filePrefix">Match files that begin with this prefix</param>
/// <returns>True if the file exists</returns>
public async Task<bool> FileExists(string bucket, string filePrefix)
{
    // Set this to your S3 region (of course)
    var region = Amazon.RegionEndpoint.USEast1;

    using (var client = new AmazonS3Client(region))
    {
        var request = new ListObjectsRequest {
            BucketName = bucket,
            Prefix = filePrefix,
            MaxKeys = 1
        };

        var response = await client.ListObjectsAsync(request, CancellationToken.None);

        return response.S3Objects.Any();
    }
}

И, если вы хотите найти папку:

/// <summary>
/// Determines whether a file exists within the specified folder
/// </summary>
/// <param name="bucket">The name of the bucket to search</param>
/// <param name="folder">The name of the folder to search</param>
/// <param name="filePrefix">Match files that begin with this prefix</param>
/// <returns>True if the file exists</returns>
public async Task<bool> FileExists(string bucket, string folder, string filePrefix)
{
    return await FileExists(bucket, $"{folder}/{filePrefix}");
}

Использование:

var testExists = await FileExists("testBucket", "test_");
// or...
var testExistsInFolder = await FileExists("testBucket", "testFolder/testSubFolder", "test_");
1 голос
/ 08 февраля 2012

Я не знаком с C #, но я использую этот метод из Java (преобразование в c # немедленно):

public boolean exists(AmazonS3 s3, String bucket, String key) {
    ObjectListing list = s3.listObjects(bucket, key);
    return list.getObjectSummaries().size() > 0;
}
0 голосов
/ 05 июня 2018

Я знаю, что этому вопросу уже несколько лет, но новый SDK в настоящее время справляется с этим проще.

  public async Task<bool> ObjectExistsAsync(string prefix)
  {
     var response = await _amazonS3.GetAllObjectKeysAsync(_awsS3Configuration.BucketName, prefix, null);
     return response.Count > 0;
  }

Где _amazonS3 - ваш IAmazonS3 экземпляр, а _awsS3Configuration.BucketName - имя вашего сегмента.

Вы можете использовать свой полный ключ в качестве префикса.

0 голосов
/ 28 сентября 2016

попробуйте это:

    NameValueCollection appConfig = ConfigurationManager.AppSettings;

        AmazonS3 s3Client = AWSClientFactory.CreateAmazonS3Client(
                appConfig["AWSAccessKey"],
                appConfig["AWSSecretKey"],
                Amazon.RegionEndpoint.USEast1
                );

S3DirectoryInfo source = new S3DirectoryInfo(s3Client, "BUCKET_NAME", "Key");
if(source.Exist)
{
   //do ur stuff
}
0 голосов
/ 24 декабря 2015
 s3 = new S3(S3KEY, S3SECRET, false);
 res = s3->getObjectInfo(bucketName, filename);

Возвращает массив, если файл существует

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...