Ejemplo n.º 1
0
        /// <summary>
        /// ディレクトリ直下のディレクトリ・オブジェクト一覧取得。
        /// minio NFSに書き込まれた学習結果を一覧で取得するために使用。
        /// 1000件までしか取得しない仕様
        /// </summary>
        /// <param name="searchDirPath"> 検索対象ディレクトリ </param>
        /// <returns>StorageListResultInfo (直下のディレクトリ一覧, 直下のオブジェクト一覧)  </returns>
        public async Task <Result <StorageListResultInfo, string> > GetUnderDirAsync(string searchDirPath)
        {
            ListObjectsRequest request = new ListObjectsRequest
            {
                BucketName = bucket,
                MaxKeys    = 1000,
                Prefix     = searchDirPath,
                Delimiter  = "/" // https://dev.classmethod.jp/cloud/aws/amazon-s3-folders/
            };

            try
            {
                LogDebug($"start querying objects under bucket");
                ListObjectsResponse response = await client.ListObjectsAsync(request);

                if (response.IsTruncated)
                {
                    LogWarning("too many output files(should be less than 1000). exceeded files are ignored.");
                }
                LogDebug($"storeage response : {response.ToString()}");
                var dirs     = response.CommonPrefixes.Select(x => new StorageDirInfo(x)).ToList();
                var files    = response.S3Objects.Select(x => new StorageFileInfo(x.Key, x.LastModified, x.Size)).ToList();
                var exceeded = response.IsTruncated;
                var result   = new StorageListResultInfo(dirs, files, exceeded);

                return(Result <StorageListResultInfo, string> .CreateResult(result));
            }
            catch (Exception e)
            {
                LogDebug($"GetUnderDirAsync error : {e.ToString()}");
                return(Result <StorageListResultInfo, string> .CreateErrorResult(e.ToString()));
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// ディレクトリ直下のディレクトリ・オブジェクト一覧取得。
        /// minio NFSに書き込まれた学習結果を一覧で取得するために使用。
        /// </summary>
        /// <param name="searchDirPath"> 検索対象ディレクトリ </param>
        /// <returns>StorageListResultInfo (直下のディレクトリ一覧, 直下のオブジェクト一覧)  </returns>
        public async Task <Result <StorageListResultInfo, string> > GetUnderDirAsync(string searchDirPath)
        {
            ListObjectsV2Request request = new ListObjectsV2Request
            {
                BucketName = bucket,
                MaxKeys    = 1000,
                Prefix     = searchDirPath,
                Delimiter  = "/" // https://dev.classmethod.jp/cloud/aws/amazon-s3-folders/
            };

            try
            {
                List <StorageDirInfo>  dirs  = new List <StorageDirInfo>();
                List <StorageFileInfo> files = new List <StorageFileInfo>();
                bool exceeded = false;

                LogDebug($"start querying objects under bucket");

                const int             MaxRequestCount = 10; // 1ディレクトリに含まれるファイル数の上限は、10*1,000=10,000件とする
                var                   requestCount    = 0;
                ListObjectsV2Response response        = new ListObjectsV2Response();
                do
                {
                    // ディレクトリ直下のディレクトリ・オブジェクト一覧を取得する
                    response = await client.ListObjectsV2Async(request);

                    if (response.IsTruncated)
                    {
                        LogWarning("more than 1000 output files exist. get continuously.");
                        exceeded = response.IsTruncated;
                    }
                    LogDebug($"storeage response : {response.ToString()}");

                    dirs.AddRange(response.CommonPrefixes.Select(x => new StorageDirInfo(x)).ToList());
                    files.AddRange(response.S3Objects.Select(x => new StorageFileInfo(x.Key, x.LastModified, x.Size)).ToList());

                    // 次の一覧取得の開始位置であるオブジェクトを設定する
                    request.ContinuationToken = response.NextContinuationToken;
                    requestCount++;
                }while (response.IsTruncated && requestCount < MaxRequestCount); // 一覧に続きがある場合再度問い合わせる

                var result = new StorageListResultInfo(dirs, files, exceeded);

                return(Result <StorageListResultInfo, string> .CreateResult(result));
            }
            catch (Exception e)
            {
                LogDebug($"GetUnderDirAsync error : {e.ToString()}");
                return(Result <StorageListResultInfo, string> .CreateErrorResult(e.ToString()));
            }
        }