根据通配符确定S3存储桶中是否存在对象

时间:2010-08-19 21:53:01

标签: c# amazon-s3

有人可以告诉我如何确定S3存储桶中是否存在某个文件/对象,并显示一条消息(如果存在或是否存在)。

基本上我想要它:

1)检查我的S3帐户上的一个存储桶,例如testbucket

2)在该存储桶内部,查看是否存在前缀为test_(test_file.txt或test_data.txt)的文件。

3)如果该文件存在,则显示该文件存在的MessageBox(或控制台消息),或该文件不存在。

有人可以告诉我该怎么做吗?

12 个答案:

答案 0 :(得分:54)

使用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
    }   
}

答案 1 :(得分:46)

使用AWSSDK For .Net I目前正在采取以下措施:

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;
        }
}

它有点糟透了,但它现在有效。

答案 2 :(得分:12)

这解决了它:

列出现有对象的存储桶,并使用这样的前缀。

    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
    }

答案 3 :(得分:10)

我知道这个问题已经有几年了,但是新的SDK处理得很漂亮。如果有人还在搜索这个。您正在寻找S3DirectoryInfo班级

HeirarchyId

答案 4 :(得分:3)

我在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 S3版本3.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;
        }

答案 5 :(得分:1)

我不熟悉C#,但我在Java中使用这种方法(立即转换为c#):

public boolean exists(AmazonS3 s3, String bucket, String key) {
    ObjectListing list = s3.listObjects(bucket, key);
    return list.getObjectSummaries().size() > 0;
}

答案 6 :(得分:0)

 s3 = new S3(S3KEY, S3SECRET, false);
 res = s3->getObjectInfo(bucketName, filename);

如果文件存在,它将返回数组

答案 7 :(得分:0)

试试这个:

    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
}

答案 8 :(得分:0)

我知道这个问题还有几年的历史,但现在新的SDK可以更轻松地处理这个问题。

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

_amazonS3IAmazonS3实例,_awsS3Configuration.BucketName是您的广告位名称。

您可以使用完整密钥作为前缀。

答案 9 :(得分:0)

不确定这是否适用于.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_");

答案 10 :(得分:0)

using Amazon;
using Amazon.S3;
using Amazon.S3.IO;
using Amazon.S3.Model;

string accessKey = "xxxxx";
string secretKey = "xxxxx";
string regionEndpoint = "EU-WEST-1";
string bucketName = "Bucket1";
string filePath = "https://Bucket1/users/delivery/file.json"

public bool FileExistsOnS3(string filePath)
{
   try
   {
      Uri myUri = new Uri(filePath);
      string absolutePath = myUri.AbsolutePath; // /users/delivery/file.json
      string key = absolutePath.Substring(1); // users/delivery/file.json
      using(var client = AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey, regionEndpoint))
      {
         S3FileInfo file = new S3FileInfo(client, bucketName, key);
         if (file.Exists)
         {
            return true;
            // custom logic
         }
         else
         {
            return false;
            // custom logic
         }
      }
   }
   catch(AmazonS3Exception ex)
   {
      return false;
   }
}

答案 11 :(得分:0)

GetFileSystemInfos 有一个重载 注意这一行有文件名。*

var files=s3DirectoryInfo.GetFileSystemInfos("filename.*");

public bool Check()
{
    var awsCredentials = new Amazon.Runtime.BasicAWSCredentials("AccessKey", "SecretKey");

      using (var client = new AmazonS3Client(awsCredentials, Amazon.RegionEndpoint.USEast1))
       {
       S3DirectoryInfo s3DirectoryInfo = new S3DirectoryInfo(client, bucketName, "YourFilePath");
                var files= s3DirectoryInfo.GetFileSystemInfos("filename.*");
                if(files.Any())
                {
                    //fles exists
                }
            }
        }