/// <summary> /// 指定パスのファイルをS3にコピーする /// </summary> /// <param name="filename"></param> private void CopyFile(string filename, int max, int index) { // S3上での名前 var filekey = procDirectoryName(filename); var fileinfo = new FileInfo(filename); DateTime lastModified = DateTime.MaxValue; var response = findS3(filekey); if (null != response) { lastModified = response.LastModified; } // 全コピーモードか、S3上にファイルが無いか、S3上のファイルより新しい場合にアップロード if (option.RunMode == Options.Mode.All || null == response || fileinfo.LastWriteTimeUtc > lastModified) { var request = new TransferUtilityUploadRequest { BucketName = this.Bucket, FilePath = filename, Key = filekey, }; if (!OnlyCount) { transferUtility.Upload(request); } Console.WriteLine("[{1:###,###}/{2:###,###}] Copied...{0}", filename, index, max); CopiedFiles.Add(filename); } else { Console.WriteLine("[{1:###,###}/{2:###,###}] Skip...{0}", filename, index, max); } }
/// <summary> /// 設定されたバケットからカレントディレクトリにすべてのファイルを同期する。 /// </summary> /// <param name="timeFilter"></param> public override void Run() { // トリガーモードで、ローカルのトリガーが新しいなら何もしない if (triggerState == TriggerState.Local || triggerState == TriggerState.Same) { Console.WriteLine("Trigger is not updated. abort execution."); return; } CopiedFiles.Clear(); if (string.IsNullOrEmpty(Bucket)) { throw new Exception("バケット名が指定されていません。"); } ListObjectsResponse response = new ListObjectsResponse(); do { ListObjectsRequest request = new ListObjectsRequest { BucketName = Bucket, MaxKeys = int.MaxValue, Marker = response.NextMarker, }; response = transferUtility.S3Client.ListObjects(request); // response. foreach (var o in response.S3Objects) { var filename = procKey(o.Key); filename = Path.Combine(TargetDirectory, filename); var dirname = Path.GetDirectoryName(filename); if (!Directory.Exists(dirname)) { Directory.CreateDirectory(dirname); } if (!string.IsNullOrEmpty(Path.GetFileName(filename))) { retrieveFile(o, filename); } } } while (!string.IsNullOrEmpty(response.NextMarker)); }
/// <summary> /// S3バケットのみに含まれるファイルを検出 /// </summary> /// <returns></returns> public List <string> FindDeletedFiles() { var ret = new List <string>(); CopiedFiles.Clear(); if (string.IsNullOrEmpty(Bucket)) { throw new Exception("バケット名が指定されていません。"); } ListObjectsResponse response = new ListObjectsResponse(); do { // S3バケット内のオブジェクト取得リクエストを構築 ListObjectsRequest request = new ListObjectsRequest { BucketName = Bucket, MaxKeys = int.MaxValue, // 取れるだけを要求するが、実際に取れるのは1000件 Marker = response.NextMarker, // 取得開始カーソル }; response = transferUtility.S3Client.ListObjects(request); foreach (var o in response.S3Objects) { // S3のキー名から対応するローカルファイル名を生成 var filename = Path.Combine(TargetDirectory, procKey(o.Key)); var dirname = Path.GetDirectoryName(filename); if (!Directory.Exists(dirname) || // 存在しないディレクトリ string.IsNullOrEmpty(Path.GetFileName(filename)) || // ファイル名が無い !File.Exists(filename)) // 存在しない { ret.Add(o.Key); } } } while (!string.IsNullOrEmpty(response.NextMarker)); return(ret); }
private void retrieveFile(S3Object o, string filename) { DateTime lastModified = o.LastModified; FileInfo fi = null; if (File.Exists(filename)) { fi = new FileInfo(filename); if (fi.LastWriteTime < lastModified) { if (!OnlyCount) { transferUtility.Download(filename, Bucket, o.Key); } Console.WriteLine("Update.. {0}", filename); CopiedFiles.Add(filename); } else { // Console.WriteLine("Skip.... {0}", filename); } } else { if (!OnlyCount) { transferUtility.Download(filename, Bucket, o.Key); } Console.WriteLine("Create.. {0}", filename); CopiedFiles.Add(filename); } /// カウントモードでなければ、タイムスタンプを再設定する fi = new FileInfo(filename); if (lastModified != DateTime.MinValue && !OnlyCount) { fi.LastWriteTime = lastModified; } }