private List <string> GetOciPrefixs(string prefix, SearchOption searchOption, string nextStartWith = "") { var res = new List <string>(); var listObjectsRequest = new ListObjectsRequest() { NamespaceName = NamespaceName, BucketName = BucketName, Start = nextStartWith, Delimiter = "/", Prefix = ObjectStorageHelper.EncodeKey(prefix), Fields = new List <string> { "name" }, Limit = 1 }; var objects = Client.ListObjects(listObjectsRequest); res.AddRange(objects.ListObjects.Prefixes); if (!string.IsNullOrEmpty(objects.ListObjects.NextStartWith)) { res.AddRange(GetOciPrefixs(ObjectStorageHelper.DecodeKey(prefix), searchOption, objects.ListObjects.NextStartWith)); } if (objects.ListObjects.Prefixes != null && objects.ListObjects.Prefixes.Count > 0) { // all sub prefix if (searchOption == SearchOption.AllDirectories) { foreach (var pre in objects.ListObjects.Prefixes) { res.AddRange(GetOciPrefixs(pre, searchOption)); } } else { var newPrefix = objects.ListObjects.Prefixes.Where(p => p == ObjectStorageHelper.EncodeKey(prefix) + "/"); if (newPrefix != null && newPrefix.Count() > 0) { foreach (var pre in newPrefix) { res.AddRange(GetOciPrefixs(pre, searchOption)); } } } } return(res); }
/// <summary> /// Returns the directory in the s-bucket to the specified pattern /// </summary> /// <param name="searchPattern"></param> /// <param name="searchOption"></param> /// <returns></returns> public IEnumerable <ObjectStorageDirectoryInfo> EnumerateDirectories(string searchPattern, SearchOption searchOption) { IEnumerable <ObjectStorageDirectoryInfo> folders = null; if (String.IsNullOrEmpty(BucketName)) { var request = new ListBucketsRequest(); folders = Client.ListBuckets(request).Items .ConvertAll(bucket => new ObjectStorageDirectoryInfo(Client, NamespaceName, bucket.Name, "")); } else { var prefixs = GetOciPrefixs(ObjectKey, searchOption); folders = prefixs.ToList() .ConvertAll(f => new ObjectStorageDirectoryInfo(Client, NamespaceName, BucketName, ObjectStorageHelper.DecodeKey(f))); } //filter based on search pattern var regEx = WildcardToRegex(searchPattern); folders = folders.Where(f => Regex.IsMatch(f.Name, regEx, RegexOptions.IgnoreCase)); return(folders); }
/// <summary> /// Get the object in the bucket. /// </summary> /// <param name="prefix"></param> /// <param name="searchOption"></param> /// <param name="maxCount"></param> /// <param name="nextStartWith"></param> /// <returns></returns> private List <ObjectSummary> GetOciObjects(string prefix, SearchOption searchOption, int maxCount, string nextStartWith = "") { var res = new List <ObjectSummary>(); if (maxCount == -1) { maxCount = GET_OBJECT_LIMIT; } string delimiter = ""; var prefixReg = ObjectStorageHelper.EncodeKey(prefix); if (prefixReg.Contains("/")) { delimiter = "/"; } var listObjectsRequest = new ListObjectsRequest() { NamespaceName = NamespaceName, BucketName = BucketName, Start = nextStartWith, Delimiter = delimiter, Prefix = prefixReg, Fields = new List <string> { "name", "size", "timeCreated", "md5" }, Limit = maxCount }; var objects = Client.ListObjects(listObjectsRequest); if (searchOption == SearchOption.TopDirectoryOnly) { foreach (var o in objects.ListObjects.Objects) { if (CheckAddObject(o, prefixReg, searchOption)) { res.Add(o); } } } else { foreach (var o in objects.ListObjects.Objects) { if (CheckAddObject(o, prefixReg, searchOption)) { res.Add(o); } } } NextPageId = objects.ListObjects.NextStartWith; // next check if (!string.IsNullOrEmpty(objects.ListObjects.NextStartWith)) { if (maxCount == -1) { res.AddRange(GetOciObjects(ObjectStorageHelper.DecodeKey(prefix), searchOption, maxCount, objects.ListObjects.NextStartWith)); } } if (objects.ListObjects.Prefixes != null && objects.ListObjects.Prefixes.Count > 0) { // all sub prefix if (searchOption == SearchOption.AllDirectories) { foreach (var pre in objects.ListObjects.Prefixes) { res.AddRange(GetOciObjects(pre, searchOption, maxCount)); } } else { var newPrefix = objects.ListObjects.Prefixes.Where(p => p == prefixReg + "/"); if (newPrefix != null && newPrefix.Count() > 0) { foreach (var pre in newPrefix) { res.AddRange(GetOciObjects(pre, searchOption, maxCount)); } } } } return(res); }
/// <summary> /// returns files in a directory according to the specified search pattern /// </summary> /// <param name="searchPattern"></param> /// <param name="searchOption"></param> /// <param name="maxCount"></param> /// <param name="nextPageId"></param> /// <returns></returns> public IEnumerable <ObjectStorageFileInfo> EnumerateFiles(string searchPattern, SearchOption searchOption, int maxCount, string nextPageId) { IEnumerable <ObjectStorageFileInfo> files = null; if (String.IsNullOrEmpty(BucketName)) { files = new List <ObjectStorageFileInfo>(); } else { var metaFiles = GetOciObjects(ObjectKey, searchOption, maxCount, nextPageId).Where(f => !f.Name.EndsWith("/")).ToList(); files = new EnumerableConverter <ObjectSummary, ObjectStorageFileInfo> (metaFiles, o => new ObjectStorageFileInfo(Client, NamespaceName, BucketName, ObjectStorageHelper.DecodeKey(o.Name))); } var regEx = WildcardToRegex(searchPattern); files = files.Where(o => Regex.IsMatch(o.Name, regEx, RegexOptions.IgnoreCase)); return(files); }