2011-10-05 3 views
1

가끔 S3에서 업데이트해야하는 로컬 파일이 있습니다. 나는 S3 버전이 더 새로운 경우에만 그들을 업데이 트하는 것을 선호합니다. S3 객체에서C#에서는 로컬 파일의 datemodified 속성을 Amazon S3 파일과 어떻게 비교합니까?

ModifiedSinceDate 

속성을 잘 이해할 수 없습니다. 사실, 메타 데이터를 사용할 지, 아니면 내가 검사 할 내용이 있는지 확실하지 않습니다.

나는 이런 식으로 뭔가를 상상 해요 :

GetObjectRequest request = new GetObjectRequest().WithBucketName(my_bucketName).WithKey(s3filepath); 

       using (GetObjectResponse response = client.GetObject(request)) 
       { 

        string s3DateModified = response.ModifiedSinceDate; // Complete psuedo code 
        DateTime s3_creationTime = DateTime.Convert(s3DateModified); //Complete psuedo code 
        DateTime local_creationTime = File.GetCreationTime(@"c:\file.txt"); 

        if (s3_creationTime > local_CreationTime) 
        { 
         //download the S3 object; 
        } 
       } 

감사합니다 순전히!

수정 ---------------------------------------

PutObjectRequest titledRequest = new PutObjectRequest(); 
         .WithFilePath(savePath) 
         .WithBucketName(bucketName) 
         .WithKey(tempFileName) 
         .WithMetaData("Last-Modified", System.DateTime.Now.ToString()); 
다음

체크/다운로드를 위해 이것을 사용 :

using (GetObjectResponse response = client.GetObject(request)) 
       { 
        string lastModified = response.Metadata["x-amz-meta-last-modified"]; 
        DateTime s3LastModified = Convert.ToDateTime(lastModified); 
        string dest = Path.Combine(@"c:\Temp\", localFileName); 
        DateTime localLastModified = File.GetLastWriteTime(dest); 
        if (!File.Exists(dest)) 
        { 
         response.WriteResponseStreamToFile(dest); 
        } 
        if (s3LastModified > localLastModified) 
        { 
         response.WriteResponseStreamToFile(dest); 
        } 

       } 

나는 원래 객체를 업로드 할 때 나는 메타 태그로 수정 날짜를 쓰고 있어요 ... 거의 다 해요 뭔가 깨고있어, 난 아마도 WriteResponseStream 비동기이며, 그것은 두 respnse.WriteResponseStreamtToFil 노력하고있어 e (dest) 동시에. 어쨌든, 내가 그것을 못 박히면 얻을 수있을거야.

답변

3

실제로 개체 자체를 다운로드하지 않고 개체에 대한 정보를 검색하려면 GetObjectMetadata을 사용해야합니다.

GetObjectMetadataResponse 클래스는 LastModified 속성을 가지고 있거나 맞춤 메타 데이터를 사용할 수 있습니다.

그런 다음 GetObject을 사용하여 실제로 파일을 다운로드하고 저장하십시오. 같은

뭔가 : 당신의 도움에 대한

using (GetObjectMetadataResponse response = client.GetObjectMetadata(request)) 
{ 
    DateTime s3LastModified = response.LastModified; 
    string dest = Path.Combine(@"c:\Temp\", localFileName); 
    DateTime localLastModified = File.GetLastWriteTime(dest); 
    if (!File.Exists(dest) || s3LastModified > localLastModified) 
    { 
     // Use GetObject to download and save file 
    } 

} 
+0

헤이 Geoff-의 정말 고마워요. 이것은 기본적으로 작동하지만 응답. 마지막 수정 된 결과는 이상 할 수 있습니다. 개체가 캐시되고 있기 때문에 확실하지 않지만 S3에서 반환 된 DateTime은 각 호출마다 다를 수 있습니다. 그 문제가 있었나요? 그렇지 않으면 완벽하게 작동합니다. –

+0

@Hairgami_Master - 이상 하네. 전에 'LastModified' 속성을 많이 사용하지는 않았지만 이전에는이를 알지 못했습니다. 파일을 다시 업로드 한 것처럼 임의의 날짜 또는 항상 최신 날짜입니까? –

+0

솔직히 말해서 나는 패턴을 식별 할 수 없었습니다. S3에 똑같은 파일을 두 번 넣으면 동일한 LastModified 결과가 나오는지, 아니면 다를지를 이해하려고합니다. 다른 말로하면, S3에 파일을 복사하는 것이 수정 중입니까? –