如何在Azure存储位置中创建子容器。

78

我该如何在Azure存储位置中创建子容器?

6个回答

133

Windows Azure没有提供分层容器的概念,但是它确实通过惯例和API提供了遍历层级的机制。所有容器都存储在同一级别上。您可以通过为Blob名称使用命名约定来获得类似的功能。

例如,您可以创建一个名为“content”的容器,并在该容器中创建具有以下名称的Blob:

content/blue/images/logo.jpg
content/blue/images/icon-start.jpg
content/blue/images/icon-stop.jpg

content/red/images/logo.jpg
content/red/images/icon-start.jpg
content/red/images/icon-stop.jpg

注意,这些Blob是针对您的 "content" 容器的一个平坦列表。话虽如此,使用“/”作为惯例分隔符,可以使您以分层的方式遍历它们。

protected IEnumerable<IListBlobItem> 
          GetDirectoryList(string directoryName, string subDirectoryName)
{
    CloudStorageAccount account =
        CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
    CloudBlobClient client = 
        account.CreateCloudBlobClient();
    CloudBlobDirectory directory = 
        client.GetBlobDirectoryReference(directoryName); 
    CloudBlobDirectory subDirectory = 
        directory.GetSubdirectory(subDirectoryName); 

    return subDirectory.ListBlobs();
}

你可以按以下方式调用:

GetDirectoryList("content/blue", "images")

注意使用GetBlobDirectoryReferenceGetSubDirectory方法以及CloudBlobDirectory类型,而不是使用CloudBlobContainer。这些提供了您可能正在寻找的遍历功能。

这应该能帮助您入门。如果这不能回答您的问题,请告诉我:

[ 感谢Neil Mackenzie提供的灵感 ]


16
请注意,从SDK版本2.0开始,“GetBlobDirectoryReference”功能不可用。 取而代之的是,我们可以使用以下内容: CloudBlobContainer container = cloudBlobClient.GetContainerReference(directoryName); CloudBlobDirectory subDirectory = container.GetDirectoryReference(subDirectoryName); 等等... - Knelis
3
这个概念是否有PHP实现? - Vaibhav Kaushal
在你的函数调用中,应该是cloudBlobClient还是client - juunas

16

您是在谈论Blob存储吗?如果是这样,在层次结构中仅有StorageAccount/Container/BlobName,没有嵌套容器。

话虽如此,您可以在Blob名称中使用斜杠来模拟URI中的嵌套容器。请参阅MSDN上的这篇文章以获取命名详情。


1
非常感谢,Blob 名称中的斜杠将在容器上创建嵌套文件夹,例如 /a/b.txt。 - Akash kumar
@Akashkumar - 不确定我是否理解了评论,但是... blob 名称中的斜杠不会创建嵌套文件夹。斜杠只是文件名的一部分。要创建嵌套文件夹,您需要使用 ADLS(分层存储),这在我回答此问题时的2010年并不存在。而今天的非 ADLS blob 存储没有分层文件夹,文件名中的斜杠仍会导致平面容器/ blob 结构,正如我的答案所述。 - David Makogon

6
我同意tobint的回答,并且想要补充一些关于这种情况的内容,因为我也需要以同样的方式上传我的html游戏到Azure存储,并创建这些目录:
  • Games\Beautyshop\index.html
  • Games\Beautyshop\assets\apple.png
  • Games\Beautyshop\assets\aromas.png
  • Games\Beautyshop\customfont.css
  • Games\Beautyshop\jquery.js
所以在你的建议下,我尝试使用Azure Storage Explorer这个工具上传我的内容,你可以通过这个URL下载工具和源代码:Azure Storage Explorer 首先,我尝试使用工具上传,但是它不允许层次目录上传,因为你不需要这样做:如何在blob容器中创建子目录 最后,我调试了Azure Storage Explorer的源代码,并编辑了StorageAccountViewModel.cs文件中的Background_UploadBlobs方法和UploadFileList字段。你可以根据自己的需求进行编辑。我可能会有拼写错误:/非常抱歉,但这只是我的建议。

5
如果您正在尝试从Azure门户上传文件: 在上传文件时,您可以进入高级选项并选择上传到文件夹来创建容器中的子文件夹,这将创建一个新文件夹并将文件上传到其中。

这是一种对于某些情况而言有效的解决方案,就像它对我来说一样。如果我提出了这个问题,这将是被选中的答案。 - SikoSoft

0

Kotlin 代码

    val blobClient = blobContainerClient.getBlobClient("$subDirNameTimeStamp/$fileName$extension");

这将创建一个以时间戳为名称的目录,并在其中放置您的 Blob 文件。请注意上面代码中斜杠 (/) 的使用,它将通过创建以斜杠前面的字符串命名的文件夹来嵌套您的 Blob 文件。

在门户上看起来像这样 enter image description here


-1

示例代码

string myfolder = "<folderName>";
string myfilename = "<fileName>";
string fileName = String.Format("{0}/{1}.csv", myfolder, myfilename);
CloudBlockBlob blob = container.GetBlockBlobReference(fileName);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接