Пример #1
0
        /// <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);
            }
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        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;
            }
        }