仅从Blob容器获取目录名称的简单方法

时间:2020-03-10 17:51:04

标签: azure azure-storage azure-storage-blobs

我正在尝试通过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个文件夹

有什么想法我做错了吗?

欢呼

保罗

1 个答案:

答案 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);
            }

返回的结果将如下图所示。希望对您有帮助。

enter image description here