В C # как сравнить свойство datemodified локального файла с файлом Amazon S3? - PullRequest
1 голос
/ 06 октября 2011

У меня есть несколько локальных файлов, которые нужно периодически обновлять с S3.Я бы предпочел обновить их, только если версия S3 новее.Я не совсем понимаю, как использовать свойство

    ModifiedSinceDate

в объектах S3.На самом деле, я не уверен, использовать ли метаданные или есть что-то еще, что я должен проверять.

Я представляю что-то вроде этого:

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

Затем, используя это для проверки/ download:

 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.WriteResponseStreamtToFile (dest) одновременноВ любом случае, я обновлю это, если смогу прибить его.

1 Ответ

3 голосов
/ 06 октября 2011

Вы должны использовать 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
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...