C# 安全获取用户文件夹下的所有文件(包括文档下的文件等)

C# 安全获取用户文件夹下的所有文件(包括文档下的文件等),c#,.net,file,C#,.net,File,我想要一种安全的方法来获取嵌套在用户文件夹下的所有文件(名义上是C:\Users\TheUsersName)。问题是那里的大多数文件夹都有重分析点,因此仅对文件夹的文件夹进行迭代/递归不会返回这些文件夹,因此也不会返回文件夹下的文件 简单但不需要的解决方案是 硬编码那些文件夹从来都不是个好主意。如果将来添加或删除一个新的会怎么样 仅对于UserProfile文件夹,检索任何 重新分析它下面的点指向。-不安全-可能会循环 总之,有没有安全的方法来获取用户文件夹下的所有文件,包括那些嵌套在重分析点下

我想要一种安全的方法来获取嵌套在用户文件夹下的所有文件(名义上是
C:\Users\TheUsersName
)。问题是那里的大多数文件夹都有重分析点,因此仅对文件夹的文件夹进行迭代/递归不会返回这些文件夹,因此也不会返回文件夹下的文件

简单但不需要的解决方案是

  • 硬编码那些文件夹从来都不是个好主意。如果将来添加或删除一个新的会怎么样
  • 仅对于UserProfile文件夹,检索任何 重新分析它下面的点指向。-不安全-可能会循环
  • 总之,有没有安全的方法来获取用户文件夹下的所有文件,包括那些嵌套在重分析点下的文件

    因为(从评论来看)这似乎不清楚。我将明确指出:


    我不想得到重分析点的目标。不仅仅是在UserProfile的特定情况下。因为可能有一个指向UserProfile本身或包含它的文件夹。我想要一些普通的(虽然不是“真实的”)文件夹列表,这些文件夹就像“文档”(我假设它不会指向包含UserProfile的文件夹,因此不会循环)。或其他清洁溶液。

    这样的简单循环:

    foreach (var dir in new DirectoryInfo(@"c:\users\smo").GetDirectories())
    {
        .... 
    }
    
    应返回c:\users\smo中的所有文件夹


    另外,请注意,文件夹不能作为重分析点。重分析点是与文件或文件夹关联的一些可选二进制数据。该数据有一个类型(“”),指示如何处理此额外信息。一种类型的重分析点是“装载点”,用于功能。也有使用重分析点的NTFS。我想你在这里谈论的是符号链接。

    标题状态获取所有文件夹。。。但内容说明了获取所有文件的安全方法。。。我现在该怎么办?@ΦXocę웃Пepeúpaツ 嗯,我想要这些文件,但问题在于文件夹。但我明白你的意思。我现在正在想一个解决方案。你可以使用Environment.UserFolder,将它插入FolderInfo,然后从那里开始。这就是你的意思吗?@Yaron你的意思是
    DirectoryInfo
    。问题是,该文件夹的“文件夹”并不都是真实的文件夹。从“GetFiles和GetDirectory等.NET Framework方法不会返回重分析点下的任何子目录。”。(这是一件好事。)请看:谷歌查询的结果是:c#获取文件夹重分析点我认为真正的问题是,当你深入到%USERPROFILE%这样的文件夹时,如何避免无限递归。例如AppData\Local\Application Data\Application Data\Application Data\Application Data\Application Data…谢谢。(系统告诉我我还不能授予奖金。)在Windows7中,可能是因为“库”,我在尝试获取某些文件夹(如文档)的子目录时会遇到异常。现在看来,我只能从“我的文档”中得到一个错误,而不是从“文档”中得到一个错误。@shurik谢谢。我最初认为我会有这些递归陷阱,因为我认为我需要经过重新分析点。但是,由于我没有-我只是不会,因此操作系统会注意避免重分析点,比如说“GetFiles和GetDirectory等.NET Framework方法不会在重分析点下返回任何子目录”。@ispiro-您首先是如何获得这些异常的?从浏览器用户界面?从,代码这也将工作
    newdirectoryinfo(@“c:\documents and settings\all users”)。GetDirectories()
    我读了文档,不确定,可能是我遗漏了什么。我在C#中创建了一个连接和一个快速POC,对我来说,它会返回连接下的子目录。foreach(Directory.GetDirectories(@“d:\Temp\tptest”,“*”,System.IO.SearchOption.AllDirectories)){Console.WriteLine(d);}打印:d:\Temp\tptest\dir d:\Temp\tptest\junction d:\Temp\tptest\dir\dir2 d:\Temp\tptest\junction\dir2