2010-08-19 17 views
29

Qualcuno può indicarmi come determinare se un certo file/oggetto esiste in un bucket S3 e visualizzare un messaggio se esiste o se non esiste.Determinare se un oggetto esiste in un bucket S3 basato su caratteri jolly

Fondamentalmente voglio che:

1) Controllare un secchio sul mio conto S3 come testbucket

2) All'interno di quel secchio, guardare per vedere se c'è un file con il test_ prefisso (test_file.txt o test_data.txt).

3) Se questo file esiste, quindi visualizza un MessageBox (o messaggio Console) che il file esiste o che il file non esiste.

Qualcuno può mostrarmi come si fa?

risposta

40

Utilizzando l'AWSSDK per NET ho Attualmente fare qualcosa sulla falsariga di:

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

fa schifo un pò, ma funziona per ora.

+3

tiro Altered (ex) a plain-old tiro. –

+1

Non vedo come questo risponda alla domanda sull'uso di caratteri jolly. Come posso verificare se i file esistono con lo stesso prefisso? – Alvis

+2

Ci sono un paio di problemi qui. Il primo è che questa tecnica non supporta gli oggetti corrispondenti basati su un prefisso comune.In secondo luogo, un percorso di esecuzione abbastanza comune (il file non esiste) genererà un'eccezione generata - questo ha implicazioni sulle prestazioni. –

1

Non ho familiarità con C#, ma io uso questo metodo da Java (conversione in C# è immediata):

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

Qualcuno mi corregge se sbaglio, ma credo che questo tornerebbe false per file 0 byte (vuoti). –

9

Questo risolve:

Lista il secchio per gli oggetti e l'uso esistenti un prefisso come questo

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

utilizzare il metodo 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

Se la chiave non esiste, l'eccezione AmazonS3Exception verrà generata con il messaggio "Forbidden 403". Cose piuttosto stupide ... Ma se siamo sicuri di avere accesso al bucket, possiamo considerarlo 'falso'. –

+0

Si tratta di una soluzione decisamente migliore rispetto a quella attualmente più apprezzata in quanto non utilizza eccezioni per la logica dell'unità. Sarà prestazioni più elevate. –

+1

@PavelShkleinik - La sorgente disponibile su GitHub è piuttosto recente: https://github.com/aws/aws-sdk-net/blob/master/AWSSDK_DotNet35/Amazon.S3/IO/S3FileInfo.cs - I credi che quello che dici non è più il caso per fortuna. – aaaaaa

8

So che questa domanda è vecchia di qualche anno, ma il nuovo SDK gestisce questa splendidamente. Se qualcuno sta ancora cercando questo. Siete alla ricerca di S3DirectoryInfo Classe

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

Si tornerà array se il file esiste

2

ho usato il seguente codice in C# con Amazon S3 versione 3.1.5 (.net 3.5) per verificare se la secchio esiste:

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. 

ho usato il codice seguenti (in C# con Amazon S3 versione 3.1.5 .net 3.5) il file esiste.

Opzione 1:

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

Opzione 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

provare questo:

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 
} 
Problemi correlati