2010-08-19 36 views
29

有人可以告訴我如何確定某個文件/對象是否存在於S3存儲桶中,並顯示一條消息(如果存在或者不存在)。根據通配符確定S3存儲桶中是否存在對象

基本上我希望它:

1)檢查我的S3帳戶水桶如testbucket

2)內部的桶,看看是否有帶有前綴TEST_文件( test_file.txt或test_data.txt)。 3)如果該文件存在,則顯示文件存在的MessageBox(或控制檯消息),或文件不存在。

有人可以告訴我如何做到這一點?

回答

40

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

還挺很爛,但它適用於現在。

+3

改變的擲(前)到純老遙。 – 2011-10-12 03:27:08

+1

我不明白這是如何回答使用通配符的問題。如何檢查文件是否存在相同的前綴? – Alvis 2012-10-08 13:14:39

+2

這裏有幾個問題。首先,這種技術不支持基於通用前綴的匹配對象。其次,一個相當常見的執行路徑(該文件不存在)將導致引發異常 - 這具有性能影響。 – 2012-12-04 11:40:50

1

我不熟悉C#,但我用這個方法從Java(轉換爲C#是即時的):

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

有人糾正我,如果我錯了,但我相信這會返回對於0字節(空)文件爲假。 – 2012-05-27 15:37:14

9

這解決了它:

列表桶現有對象和使用像這樣的前綴。

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

使用S3FileInfo.Exists方法:

using (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 
    } 
} 
+3

如果key不存在,那麼AmazonS3Exception異常將引發消息'Forbidden 403'。非常愚蠢的東西...但是,如果我們確信我們可以訪問存儲桶,那麼我們可以將其視爲「錯誤」。 – 2013-09-13 16:32:47

+0

由於它不使用例外來驅動邏輯,因此這是一個比當前最高評級更好的解決方案。這將是更高的性能。 – 2014-07-10 14:07:29

+1

@PavelShkleinik - GitHub上可用的來源是相當近期的: https://github.com/aws/aws-sdk-net/blob/master/AWSSDK_DotNet35/Amazon.S3/IO/S3FileInfo.cs - 我相信你說的不再是幸運的話。 – aaaaaa 2014-12-14 06:33:24

8

我知道這個問題是幾年的歷史,但新的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 
       } 

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

如果文件存在

2

我用下面的代碼在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)Exists。

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