我在Core .NET 2.2框架的顶部有一个使用C#
编写的控制台应用程序。
我正在尝试C# library来获取容器内所有目录的列表。据我了解,Azure Blob存储实际上没有目录。而是创建虚拟名称,这些斑点看起来像Azure Blob Explorer
这样的浏览器中容器内的文件夹我使用以下代码存储文件
CloudBlockBlob blockBlob = container.GetBlockBlobReference("foldername/filename.jpg");
await blockBlob.UploadFromStreamAsync(stream);
所以我想在我的容器内选择一个前缀又名文件夹名称的列表。
因此,如果我有以下斑点“ foldername1 / file1.jpg”,“ foldername1 / file2.jpg”,“ foldername1 / file3.jpg”和“ foldername2 / file1.jpg”。我想返回“ foldername1”,“ foldername2”
如何从Azure Blob存储中获取不同前缀的列表?
已更新
我试图从下面的评论中获得反馈,所以我想出了以下代码
public async Task<string[]> Directories(string path = null)
{
int index = path == null ? 0 : path.Split('/', StringSplitOptions.RemoveEmptyEntries).Length;
BlobContinuationToken token = null;
List<string> directories = new List<string>();
do
{
BlobResultSegment blobsListingResult = await ContainerFactory.Get().ListBlobsSegmentedAsync(path ?? string.Empty, true, BlobListingDetails.None, 5000, token, null, null);
token = blobsListingResult.ContinuationToken;
IEnumerable<IListBlobItem> blobsList = blobsListingResult.Results;
foreach (var item in blobsList)
{
var blobName = (item as CloudBlob).Name;
var blobParts = blobName.Split('/', StringSplitOptions.RemoveEmptyEntries);
if (blobParts.Length <= index)
{
// At this point, we know that this not a directory inside the provided path directory
continue;
}
directories.Add(blobParts[index]);
}
}
while (token != null);
return directories.Distinct().ToArray();
}
由于容器中有很多Blob,因此花费的时间太长,因为它几乎必须获取每个块才能获取目录列表。另外,这可能会非常昂贵,因为每次调用此方法时我都必须读取每个blob。
如果一切都在本地运行,我基本上需要与运行Directory.GetDirectories(path)
相同的结果! 是否可以改善此功能?
答案 0 :(得分:0)
我发现执行此操作的最佳方法是不要将Blob存储视为文件夹/文件存储。将文件(斑点)保留在此处,但使用其他方法来跟踪文件夹结构。我选择的方法是一个SQL数据库,其中包含我的文件夹结构,然后是对Azure中Blob文件的引用。直接在Azure中调用所有这些代码的问题是:
a)会很慢 b)从长远来看,它将给您带来不必要的费用
您最好按照我的建议进行操作,将元数据保留在其他位置,并将Blob存储用于其预期用途-存储blob
答案 1 :(得分:0)
也许您可以通过检查blob项目的类型来改进解决方案?
var result = new List<string>();
var directory = _blobContainer.GetDirectoryReference(relativeFilePath);
if (directory.Equals(null))
return result;
var blobs = directory.ListBlobsSegmentedAsync(null).Result;
foreach (var item in blobs.Results)
{
if (item.GetType() == typeof(CloudBlobDirectory))
{
result.Add(item.Uri.Segments.Last().Trim('/'));
}
}
return result;
我没有太多文件夹,因此最好再次检查性能是否满足您的要求。