有人可以告訴我如何確定某個文件/對象是否存在於S3存儲桶中,並顯示一條消息(如果存在或者不存在)。根據通配符確定S3存儲桶中是否存在對象
基本上我希望它:
1)檢查我的S3帳戶水桶如testbucket
2)內部的桶,看看是否有帶有前綴TEST_文件( test_file.txt或test_data.txt)。 3)如果該文件存在,則顯示文件存在的MessageBox(或控制檯消息),或文件不存在。
有人可以告訴我如何做到這一點?
有人可以告訴我如何確定某個文件/對象是否存在於S3存儲桶中,並顯示一條消息(如果存在或者不存在)。根據通配符確定S3存儲桶中是否存在對象
基本上我希望它:
1)檢查我的S3帳戶水桶如testbucket
2)內部的桶,看看是否有帶有前綴TEST_文件( test_file.txt或test_data.txt)。 3)如果該文件存在,則顯示文件存在的MessageBox(或控制檯消息),或文件不存在。
有人可以告訴我如何做到這一點?
使用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;
}
}
還挺很爛,但它適用於現在。
我不熟悉C#,但我用這個方法從Java(轉換爲C#是即時的):
public boolean exists(AmazonS3 s3, String bucket, String key) {
ObjectListing list = s3.listObjects(bucket, key);
return list.getObjectSummaries().size() > 0;
}
有人糾正我,如果我錯了,但我相信這會返回對於0字節(空)文件爲假。 – 2012-05-27 15:37:14
這解決了它:
列表桶現有對象和使用像這樣的前綴。
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
}
使用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
}
}
如果key不存在,那麼AmazonS3Exception異常將引發消息'Forbidden 403'。非常愚蠢的東西...但是,如果我們確信我們可以訪問存儲桶,那麼我們可以將其視爲「錯誤」。 – 2013-09-13 16:32:47
由於它不使用例外來驅動邏輯,因此這是一個比當前最高評級更好的解決方案。這將是更高的性能。 – 2014-07-10 14:07:29
@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
我知道這個問題是幾年的歷史,但新的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
}
}
s3 = new S3(S3KEY, S3SECRET, false);
res = s3->getObjectInfo(bucketName, filename);
如果文件存在
我用下面的代碼在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;
}
試試這個:
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
}
改變的擲(前)到純老遙。 – 2011-10-12 03:27:08
我不明白這是如何回答使用通配符的問題。如何檢查文件是否存在相同的前綴? – Alvis 2012-10-08 13:14:39
這裏有幾個問題。首先,這種技術不支持基於通用前綴的匹配對象。其次,一個相當常見的執行路徑(該文件不存在)將導致引發異常 - 這具有性能影響。 – 2012-12-04 11:40:50