public S3Controller() { Authentication = new Authentication(); PreprocessPerformsDiscovery = true; ListType = S3ListType.File; TemplateKVP["[BucketName]"] = "Reserved"; TemplateKVP["[KeyPrefix]"] = "Reserved"; }
public List <S3Object> ListObjects(string bucketName, string prefix, S3ListType listType, bool recurse, string directoryFilter, string fileFilter) { List <S3Object> ret = new List <S3Object>(); prefix = prefix.Replace('\\', '/'); prefix = prefix.TrimEnd('/'); Regex inclusiveDirFilter = STEM.Sys.IO.Path.BuildInclusiveFilter(directoryFilter); Regex exclusiveDirFilter = STEM.Sys.IO.Path.BuildExclusiveFilter(directoryFilter); Regex inclusiveFileFilter = STEM.Sys.IO.Path.BuildInclusiveFilter(fileFilter); Regex exclusiveFileFilter = STEM.Sys.IO.Path.BuildExclusiveFilter(fileFilter); if (String.IsNullOrEmpty(bucketName)) { List <S3Object> buckets = new List <S3Object>(); foreach (S3Bucket i in ListBuckets()) { S3Object o = new S3Object(); o.BucketName = i.BucketName; o.Key = ""; o.LastModified = i.CreationDate; o.Size = -1; buckets.Add(o); } if (listType != S3ListType.File) { if (inclusiveDirFilter != null) { buckets = buckets.Where(i => inclusiveDirFilter.IsMatch(STEM.Sys.IO.Path.GetFileName(i.BucketName.TrimEnd('/')).ToUpper())).ToList(); } if (exclusiveDirFilter != null) { buckets = buckets.Where(i => !exclusiveDirFilter.IsMatch(STEM.Sys.IO.Path.GetFileName(i.BucketName.TrimEnd('/')).ToUpper())).ToList(); } ret.AddRange(buckets); } if (recurse) { foreach (S3Object i in buckets) { ret.AddRange(ListObjects(i.BucketName, "", listType, recurse, directoryFilter, fileFilter)); } } return(ret); } List <S3Object> fullList = ListObjects(bucketName, prefix); ret = fullList.Where(i => i.Key.EndsWith("/") && i.Key.TrimEnd('/') != prefix).ToList(); if (inclusiveDirFilter != null) { ret = ret.Where(i => inclusiveDirFilter.IsMatch(STEM.Sys.IO.Path.GetFileName(i.Key.TrimEnd('/')).ToUpper())).ToList(); } if (exclusiveDirFilter != null) { ret = ret.Where(i => !exclusiveDirFilter.IsMatch(STEM.Sys.IO.Path.GetFileName(i.Key.TrimEnd('/')).ToUpper())).ToList(); } if (!recurse) { ret = ret.Where(i => STEM.Sys.IO.Path.GetDirectoryName(i.Key.TrimEnd('/')).Replace("\\", "/").Equals(prefix, StringComparison.InvariantCultureIgnoreCase)).ToList(); } List <S3Object> ret2 = fullList.Where(i => !i.Key.EndsWith("/")).ToList(); if (inclusiveFileFilter != null) { ret2 = ret2.Where(i => inclusiveFileFilter.IsMatch(STEM.Sys.IO.Path.GetFileName(i.Key).ToUpper())).ToList(); } if (exclusiveFileFilter != null) { ret2 = ret2.Where(i => !exclusiveFileFilter.IsMatch(STEM.Sys.IO.Path.GetFileName(i.Key).ToUpper())).ToList(); } foreach (S3Object o in ret2) { if (ret.Exists(i => i.Key.Equals(STEM.Sys.IO.Path.GetDirectoryName(o.Key).Replace("\\", "/") + "/", StringComparison.InvariantCultureIgnoreCase))) { ret.Add(o); } else if (prefix.Equals(STEM.Sys.IO.Path.GetDirectoryName(o.Key).Replace("\\", "/"), StringComparison.InvariantCultureIgnoreCase)) { ret.Add(o); } } if (listType == S3ListType.Directory) { ret = ret.Where(i => i.Key.EndsWith("/") && i.Key.TrimEnd('/') != prefix).ToList(); } else if (listType == S3ListType.File) { ret = ret.Where(i => !i.Key.EndsWith("/")).ToList(); } return(ret); }