使用C#在多级文件夹结构中查找Azure存储容器中的Blob

zyfwsgd6  于 2022-12-19  发布在  C#
关注(0)|答案(2)|浏览(201)

我的文件夹结构如下

(Container)->(1)School->(2)Staffs
                            ->(2.a)OfficeStaffs
                                     -> (2.a.i)Admin ->(Blobs)
                                     -> (2.a.ii)Clerk->(Blobs)
                    
                            ->(2.b)Teachers
                                     ->(2.b.i)SeniorStudents ->(Year)->AttendanceReport.xlx
                                                                     ->ExamReport.xlx   
                                     ->(2.b.ii)JuniorStudents ->(Year)->AttendanceReport.xlx 
                                                                     ->ExamReport.xlx

学校是我的父文件夹,所有其他文件夹都是子文件夹。现在我需要使用文件夹名称查找blob。文件夹名称可能会保留在中间。例如,用户可以在UI中按员工类型或教师或学生类型或按年份搜索选项。没有按文件夹级别逐个搜索blob的强制选项。如果用户选择教师,我需要显示所有教师和学生文件夹中各自的blob。如果用户选择年份,我们需要得到属于特定年份文件夹的所有blob。在这种情况下,我们将从用户接收“年”值。2我们将不知道它的父文件夹。3我们只需要根据年份来检索。4如果用户选择“办公室职员”和“教师”,我们需要从两个文件夹中检索所有子文件夹和blob。
我试着用Blob前缀来获取中间文件夹,但没有运气。它总是期望初始文件夹路径和下一个文件夹的顺序基础。无法获取中间文件夹。

BlobContainerClient client = new BlobContainerClient(connectionString, containerName);
        List<FileData> files = new List<FileData>();
        
        await foreach (BlobItem file in client.GetBlobsAsync(prefix: "SeniorStudents"))
        {

            files.Add(new FileData
            {
                FileName = file.Name                  
            }   
        }

这不是在SeniorStudents文件夹下获取blob。返回的是空的。请帮助我。谢谢。

pu3pd22g

pu3pd22g1#

  • 正在从容器中获取文件夹 *
string connectionString = "Connection String";
            List<string> dir = new List<string>();
            BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
            string containerName = "containerName";
            BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName);
            var blobitem = containerClient.GetBlobs(prefix: "test");
            List<FileData> files = new List<FileData>();

            foreach (var file in blobitem)
            {
                Console.WriteLine(file.Name);
                string[] sub_names = file.Name.Split('/');
                Console.WriteLine(sub_names.Length);

                files.Add(new FileData
                {
                    FileName = file.Name
                });

                if (sub_names.Length > 1 && !dir.Contains(sub_names[sub_names.Length - 1]))
                {
                    dir.Add(sub_names[sub_names.Length - 1]);
                }
            }
            foreach (var item in dir)
            {
                Console.WriteLine(item);
            }
  • 使用代码获取文件和文件夹结构 *

  • 使用C#代码的示例输出 *

  • 资源管理器中的Blob存储 *

  • 在Azure门户中 *

ecbunoof

ecbunoof2#

我的文件夹结构如下
不需要。除非启用了分层命名空间,否则您看到的所有(子)文件夹都是虚拟的。这些文件夹由blob的名称定义。每个/在存储资源管理器中都将被视为虚拟文件夹。
在您的示例中,容器中有多个blob:

  1. School/Staffs/OfficeStaffs/Admin/Blob1.ext
  2. School/Staffs/OfficeStaffs/Clerk/Blob2.ext
    1.学校/教职工/教师/学长/2022/考勤报表. xlx
    1.学校/教职工/教师/高年级学生/2022/考试报告. xlx
    1.学校/教职工/教师/大三学生/2022/考勤报表. xlx
    1.学校/教职工/教师/大三学生/2022/考试报告. xlx
    正如你所看到的,它是一个平面列表,当你试图根据前缀查找blob时,你需要记住它就像是用C#string.StartsWith方法匹配一个字符串。
    因此,使用前缀School/Staffs/OfficeStaffs/Admin/,您将找到blob 1,使用前缀School/Staffs/Teachers,您将找到blob 3到6。前缀Staffs不列出任何blob,因为没有名称开头带有文本 * staff * 的blob。
    在您的示例中,这意味着您必须获取 * all * blob,并使用string. split()拆分它们的名称。例如,下面的代码查找以某种方式位于名为SeniorStudents的文件夹中的所有blob,而不管该虚拟文件夹位于哪个级别:
class FileData
    {
        public string FileName { get;set;}
        public IEnumerable<string> Folders => FileName.Split('/').SkipLast(1);
    }

...

    await foreach (BlobItem file in client.GetBlobsAsync())
    {
        files.Add(new FileData
        {
            FileName = file.Name
        });
    }
    
    var targetFiles = files.Where(f => f.Folders.Contains(("SeniorStudents")));

在上面的示例中,如果您想要所有教师的所有2022文件,可以执行以下操作:

var targetFiles = files.Where(f => f.Folders.Contains("Teachers") && f.Folders.Contains("2022"));

备选

如果你有很多的blob,上面的方法将迫使你执行一个低效的查询来从2000个blob中得到5个结果,因为你需要在确定它们是否匹配标准之前得到所有的blob。
作为一种选择,你可以给你的blob添加tags,每个标签代表一个文件夹或类别,这样就很容易找到所有有特定标签的blob。注意限制,一个给定的blob上最多可以定义10个标签,请参阅文档。

相关问题