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