我正在尝试通过Blob存储获取特定位置的任何目录的目录名称
我下面有助手类
public static class BlobHelper
{
private static CloudBlobContainer _cloudBlobContainer;
private const string _containerName = "administrator";
public static void Setup(string connectionString)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
_cloudBlobContainer = cloudBlobClient.GetContainerReference(_containerName);
}
public static List<string> GetDirectoryNames(string relativeAddress)
{
var result = new List<string>();
var directory = _cloudBlobContainer.GetDirectoryReference(relativeAddress);
var folders = directory.ListBlobs().OfType<CloudBlobDirectory>();
foreach (var folder in folders)
{
var name = folder.Uri.AbsolutePath;
name = name.Replace(folder.Parent.Prefix, string.Empty)
.Replace(@"/", string.Empty)
.Replace(_containerName, string.Empty);
result.Add(name);
}
}
}
仅获取目录名称(即不获取完整的层次结构)的过程虽然确实可行,但还是有点骇人听闻
有更好的方法吗?
我尝试了以下方法
var directory = _cloudBlobContainer.GetDirectoryReference(relativeAddress);
var blobs = directory.ListBlobs(true).OfType<CloudBlobDirectory>();;
var blobNames = blobs.OfType<CloudBlockBlob>().Select(b => b.Name).ToList();
return blobNames;
与上述方法的主要区别是将UseFlatBlobListing用作true
但是,这种方法导致根本没有返回任何文件夹,而我的其他逻辑至少给了我希望找到的2个文件夹
有什么想法我做错了吗?
欢呼
保罗
答案 0 :(得分:0)
我想您的代码还可以,我不明白您的意思是“有点hacky”。我想您想直接获取目录。
没有方法目录可以获取目录,因为现在使用v11 sdk进行处理的已知方法主要使用blob uri进行处理。
下面是我的方法。
CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference("test");
BlobContinuationToken blobContinuationToken = null;
var blobsSeg = cloudBlobContainer.ListBlobsSegmented(null, blobContinuationToken);
var directories= blobsSeg.Results.OfType<CloudBlobDirectory>().Select(b => b.Prefix).ToList();
foreach (string directory in directories) {
Console.WriteLine(directory);
}
返回的结果将如下图所示。希望对您有帮助。