internal IEnumerable<Tuple<CloudBlobContainer, BlobContinuationToken>> ListContainersByName(string name)
{
string prefix = string.Empty;
BlobRequestOptions requestOptions = RequestOptions;
AccessCondition accessCondition = null;
if (String.IsNullOrEmpty(name) || WildcardPattern.ContainsWildcardCharacters(name))
{
prefix = NameUtil.GetNonWildcardPrefix(name);
WildcardOptions options = WildcardOptions.IgnoreCase | WildcardOptions.Compiled;
WildcardPattern wildcard = null;
if (!string.IsNullOrEmpty(name))
{
wildcard = new WildcardPattern(name, options);
}
Func<CloudBlobContainer, bool> containerFilter = (container) => null == wildcard || wildcard.IsMatch(container.Name);
IEnumerable<Tuple<CloudBlobContainer, BlobContinuationToken>> containerList = ListContainersByPrefix(prefix, containerFilter);
foreach (var containerInfo in containerList)
{
yield return containerInfo;
}
}
else
{
if (!NameUtil.IsValidContainerName(name))
{
throw new ArgumentException(String.Format(Resources.InvalidContainerName, name));
}
CloudBlobContainer container = Channel.GetContainerReference(name);
if (Channel.DoesContainerExist(container, requestOptions, OperationContext))
{
//fetch container attributes
Channel.FetchContainerAttributes(container, accessCondition, requestOptions, OperationContext);
yield return new Tuple<CloudBlobContainer, BlobContinuationToken>(container, null);
}
else
{
throw new ResourceNotFoundException(String.Format(Resources.ContainerNotFound, name));
}
}
}