【问题标题】:How to check wether a CloudBlobDirectory exists or not?如何检查 CloudBlobDirectory 是否存在?
【发布时间】:2012-02-29 15:41:02
【问题描述】:

在我正在编程的软件中,我试图在 Azure 的 blobs 结构上创建一个虚拟文件系统。

在此过程中,我多次从系统中获取路径,我需要判断该路径是 Blob 还是只是 azure 提供的虚拟 BlobDirectory。我通过将它从一种形式转换为另一种形式并处理错误来做到这一点。

但是现在,如果我知道一个路径指向一个虚拟目录,我该如何检查这个虚拟目录是否存在呢?

我可以使用以下代码获得对CloudBlobDirectory 的引用:

var blobDirectory = client.GetBlobDirectoryReference("Path_to_dir");

【问题讨论】:

    标签: azure azure-storage azure-blob-storage


    【解决方案1】:

    在 blob 存储中,目录本身并不作为一个项目存在。您可以拥有的是一个具有可以被解释为位于目录中的名称的 blob。如果您查看底层的REST API,您会发现其中没有关于目录的任何内容。存储客户端库正在为您做的事情是搜索以目录名称开头的 blob,然后是分隔符,例如“目录A/目录B/文件名.txt”。这意味着要存在一个目录,它必须包含一个 blob。要检查目录是否存在,您可以尝试:

    var blobDirectory = client.GetBlobDirectoryReference("Path_to_dir");
    bool directoryExists = blobDirectory.ListBlobs().Count() > 0
    

    或

    bool directoryExists = client.ListBlobsWithPrefix("DirectoryA/DirectoryB/").Count() > 0
    

    我知道将目录中的所有内容列出来只是为了获得计数并不是一个好主意,我相信您可以想出更好的方法。

    【讨论】:

    • blobDirectory.ListBlobs().Any () 将节省对所有 blob 的计数
    • 我已经有一段时间没有研究这个库的内部工作了,但是使用 .Any() 是否会有所不同,很大程度上取决于它如何处理大量的斑点。如果对 ListBlobs() 的调用总是返回完整的 blob 集,那么它只会产生非常小的差异。如果 ListBlobs() 足够聪明,只能按需获取 blob 详细信息,并且该目录中有超过 5000 个 blob(底层 REST API 一次只能以最多 5000 个为一组返回它们),那么它可能会节省一些调用.
    【解决方案2】:

    不确定您是否可以使用 GetAttributes 方法,如果它引发异常则意味着不存在目录。我使用类似的方法来验证 blob 是否存在,但尚未在目录上进行测试。

    【讨论】:

    • cloudBlobDirectory 对象上没有任何 FetchAttributes()
    • 我认为误解了你的问题。该目录实际上并不存在于 blob 上。就像 Knightpfhor 所说,如果您将 blob 命名为“dirA/dirB/a.txt”,它将看起来像在 dirA 和 dirB 目录中。我正在关注 Knightpfhor 以检查目录是否存在。
    【解决方案3】:

    对于 Java 这个可以用:

    container.getDirectoryReference(directoryName).listBlobs().iterator().hasNext() == true
    

    表示目录存在,否则不存在目录。

    【讨论】:

      【解决方案4】:
      val storageAccountString: String = s"BlobEndpoint=https://$account.$endpoint;SharedAccessSignature=$SASTOKEN"
      
      val client: CloudBlobContainer = CloudStorageAccountparse(storageAccountString).createCloudBlobClient().getContainerReference(container)
          
      val blobPattern: String = s"wasbs://$containerName@$accountName.blob.core.windows.net/$dirPath"
          
      client
            .getBlockBlobReference(blobPattern)
            .exists
            .booleanValue
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        • 2011-08-23
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多