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