【发布时间】:2014-05-10 09:17:55
【问题描述】:
我们正在对 Azure Blob 存储中的目录结构进行建模。我希望能够将文件夹中的所有文件复制到本地目录。有什么方法可以一次从 blob 存储中复制多个匹配模式的文件,还是我必须单独获取这些文件?
【问题讨论】:
我们正在对 Azure Blob 存储中的目录结构进行建模。我希望能够将文件夹中的所有文件复制到本地目录。有什么方法可以一次从 blob 存储中复制多个匹配模式的文件,还是我必须单独获取这些文件?
【问题讨论】:
您可能已经知道,blob 存储仅支持 1 级层次结构:您有 blob 容器(文件夹),每个容器都包含 blob(文件)。那里没有文件夹层次结构的概念。创建文件夹层次结构错觉的方法是通过称为blob prefix 的东西。例如,看下面的截图:
在上图中,您会看到 images blob 容器下的两个文件夹:16x16 和 24x24。在云中,blob 名称包括这些文件夹名称。所以 blob 存储中 24x24 文件夹中的 AddCertificate.png 文件的名称是 24x24/AddCertificate.png。
现在谈到您的问题,您仍然需要下载单个文件,但存储客户端库允许您执行的是按 blob 前缀获取 blob 列表。因此,如果您想下载文件夹24x24 中的所有文件(或者换句话说,您想下载所有前缀为24x24 的blob),您将首先列出前缀为24x24 的blob,然后单独下载每个blob。在本地计算机上,您可以通过前缀名称创建一个文件夹。
【讨论】:
您可以参考下面的代码作为示例参考((它是用 javascript 编写的,但您可以轻松地将逻辑映射到任何语言)。此代码由 Microsoft 维护。
https://github.com/WindowsAzure/azure-sdk-tools-xplat/blob/master/lib/commands/storage.blob._js#L144 https://github.com/WindowsAzure/azure-sdk-tools-xplat/blob/master/lib/commands/storage.blob._js#L689
第二个链接解释了如何解析 blob 前缀并从中获取文件夹层次结构。 它还展示了如何使用多线程下载 blob 并使用 MD5 确保 blob 的完整性。
仅包括处理包含前缀的 blob 路径的高级代码。完整实现请参考上面的链接,我不能在这里复制粘贴整个实现。
if (!fileName) {
var structure = StorageUtil.getStructureFromBlobName(specifiedBlobName);
fileName = structure.fileName;
fileName = utils.escapeFilePath(fileName);
structure.dirName = StorageUtil.recursiveMkdir(dirName, structure.dirName);
fileName = path.join(structure.dirName, fileName);
dirName = '.'; //FileName already contain the dirname
}
【讨论】: