我们目前在同一个Azure容器下有一个包含数千个文件的blob存储。我们的文件命名约定是这样的:
StorageName \队\工作小组\文件名
我正在编写一个工具,显示每个特定子团队的文件。代码获取Container的blob列表,然后为每个尝试与正确的Team \ Subteam匹配的blob列表(请参阅下面的示例代码)。
这有效,但速度极慢(因为我需要浏览所有文件以查看它们是否与特定的子团队匹配)。有没有办法提高查询的速度?我可以考虑优化,例如“查找与您正在寻找的团队匹配的第一个文件,然后在找到另一个团队以便提前退出时跟踪”,但这会假设BlobList已排序且无法修复最糟糕的情况。
不幸的是,目前不能在不同的容器下拆分文件。
以下是示例代码:
IEnumerable<IListBlobItem> blobs = blobContainer.ListBlobs(
new BlobRequestOptions()
{
UseFlatBlobListing = true,
BlobListingDetails = BlobListingDetails.Metadata
}).OfType<CloudBlob>();
foreach (var blob in blobs) {
var cloudy = blob as CloudBlob;
string blobTeamId = cloudy.Uri.Segments[2].Trim('/');
if (blobTeamId != teamId)
continue;
//Do something interesting with the file
答案 0 :(得分:18)
第一个解决方案 使用REST接口,您可以传入
http://somwhere.com/mycontainername/?restype=container&comp=list&delimiter=/&prefix=\Team\SubTeam
这将返回一个xml doc,只包含子团队“Folder”中的文件(我知道它不是一个文件夹,但它看起来像工具中的一个)
您可能需要生成共享访问签名才能访问它,您必须在URL的末尾标记它。
它显示您可以按blobname前缀过滤。
第二个解决方案 这可能更接近你想要的。如果您可以使用在azure sdk 1.3中更新的新存储客户端,那么现在可以使用
IEnumerable blobList = client.ListBlobsWithPrefix(“Team / SubTeam”);
客户端是CloudBlobClient的实例。
编辑 - 2013年11月18日 它似乎不再支持resttype作为参数,它应该是restype。这似乎在周末悄然发生。我已经更改了上面的url示例。
答案 1 :(得分:3)
只是更新......
您可以使用GetDirectoryRefence获取blob列表,然后列出blob ...
var subDirectory = blobContainer.GetDirectoryReference(String.Format("{0}/", folder));
return subDirectory.ListBlobs(false, BlobListingDetails.Metadata);
答案 2 :(得分:2)
你真的需要BlobListingDetails.Metadata吗?这导致下载了大量额外信息。我想你需要的只是名字