如何列出Blob容器中的文件夹内容?

时间:2019-07-15 17:53:25

标签: c# listbox azure-storage-blobs

我有一些代码,将容器的blob和文件夹列出到asp.net listBox。双击作为文件夹的listItem时,该文件夹的内容将进入listBox。问题在于,这种方法不适用于第一层之后的任何文件夹,并且listBox变为空。

我的争执是我的代码的引用目录位于容器内,并且由于子文件夹并非直接位于容器内,因此无法识别该子文件夹,并且listBox变为空。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request["__EVENTARGUMENT"] != null && Request["__EVENTARGUMENT"] == "expand")
        {

            List<string> ListBlobsInFolder()
            {

                List<string> blobs = new List<string>();
                CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse("MYCONNECTIONSTRING");
                CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
                CloudBlobContainer container = cloudBlobClient.GetContainerReference("testcontainer");
                ListItem listItem = lboxLogs.SelectedItem;
                CloudBlobDirectory directory = container.GetDirectoryReference(listItem.ToString());
                IEnumerable<IListBlobItem> blobList = directory.ListBlobs();
                    foreach (IListBlobItem item in blobList)
                    {
                        blobs.Add(string.Format("{0}", item.Uri.Segments.Last()));
                    }
                return blobs;

                //IEnumerable<IListBlobItem> subDirectoryList = subDirectory.ListBlobs();
            }

            try
            {
                if (lboxLogs.SelectedItem.ToString().EndsWith("/"))
                {
                    try
                    {
                        lboxLogs.DataSource = ListBlobsInFolder();
                        lboxLogs.DataBind();
                    }
                    catch (System.NullReferenceException)
                    {
                        //do nothing
                    }
                }
            }
            catch (NullReferenceException)
            {
                //do nothing
            }
        }            
        lboxLogs.Attributes.Add("ondblclick", ClientScript.GetPostBackEventReference(lboxLogs, "expand"));
    }

我不确定如何解决此问题,以便双击时目录引用将在必要时来自容器中,而在必要时将位于另一个文件夹中。

1 个答案:

答案 0 :(得分:0)

当谈到Azure blob的文件夹结构时,它当前是一个虚拟文件夹,是访问这些虚拟文件夹中任何内容的方式,它将虚拟目录的名称附加到其中的blob中,例如:

  ['Virtual-Folder/2019-02-06 10_43_04-Access Control - Microsoft Azure.png', 'Virtual-Folder/Boards.png', 'storage2.gif']

当列出包含名为“ Virtual-Folder”的虚拟文件夹的容器中的Blob列表时,如果我尝试通过此名称访问“ Bold”列表中的Blob,则可以通过以下名称访问:“'Virtual-Folder / Boards.png'”仅调用“ Boards.png”将不起作用。

我还使用python SDK在github中编写了一些示例,请随时关注代码示例here