【问题标题】:Read all files and folders in C drive via c#通过c#读取C盘中的所有文件和文件夹
【发布时间】:2021-04-03 21:04:48
【问题描述】:

我想获取 Drive C 中的所有文件和文件夹。 事实上,我想要一个驱动器上所有文件的列表。所有文件及其路径。 我使用此代码。但遇到错误。

static void Main(string[] args)
    {
       
        System.IO.DriveInfo di = new System.IO.DriveInfo(@"C:\");
        System.IO.DirectoryInfo dirInfo = di.RootDirectory;

        System.IO.FileInfo[] fileNames = dirInfo.GetFiles("*.*");
        System.IO.DirectoryInfo[] dirInfos = dirInfo.GetDirectories("*.*");

        foreach (System.IO.DirectoryInfo d in dirInfos)
        {
            string[] filePaths = Directory.GetFiles(d.FullName, "*.*", 
            SearchOption.AllDirectories);
        }
    }

【问题讨论】:

  • 这能回答你的问题吗? Why is access to the path denied?
  • 是的,但我认为该帖子没有提供完整准确的答案来解决此问题。
  • 尝试其他帖子的一些建议。我不认为有人能帮助你。看看你有没有杀毒软件。查看权限。这篇文章提供了很多有用的信息。我认为这是没有答案的原因,因为它背后没有一个原因。
  • 如果可用,在 .Net 5 中,DirectoryDirectoryInfo 类都支持新的 EnumerationOption 参数,该参数可以处理 Inaccessible Paths or Files、特殊目录并具有扩展的匹配属性。跨度>
  • @Jimi,我找不到这样的例子。你能解释更多吗?

标签: c# file directory path drive


【解决方案1】:

您需要做的第一件事是使用要求 root 权限的清单文件编译您的 C# 应用程序(遵循来自:How do I force my .NET application to run as administrator? 的说明)。 接下来,您应该做的是获得具有管理员权限的任何类型的用户/运行应用程序,并让它启动您的 C# 应用程序。 我认为,如果您通过具有 root 权限的应用程序执行上述操作,那么当 C# 应用程序启动时,不会向用户弹出 UAC。

如果您的应用没有 root 权限,您将无法读取未经授权文件夹的目录树。 C# 是一种托管语言,这意味着 C# 依靠操作系统来运行,因此它不能绕过操作系统。即使拥有 root 权限,操作系统也会知道您的应用操作。

但是如果你的目标是弄清楚 C# dll 是否可以恶意读取 C 盘的文件夹树,我认为这是可能的:

  1. 您需要将 C# 代码编译成带有清单的 exe 文件,如上所述。
  2. 然后,创建一个批处理文件,该文件将以 root 权限启动 CLR 进程(它可能会通过 UAC 提示提醒用户,但普通用户不会怀疑 CLR)。
  3. 确保您的批处理将以用户权限而不是默认权限运行,否则下一步将无法工作。
  4. 您的批处理应该告诉 clr 加载 C# exe,我相信要么不会提示 UAC,要么批处理可以在没有任何提示的情况下代表用户接受。 4'。如果我错了,也许https://www.codeproject.com/Articles/607352/Injecting-NET-Assemblies-Into-Unmanaged-Processes#PuttingItAllTogether 文章会帮助您将 exe 注入到 clr 中而无需 UAC 提示。

如果您按照我的建议继续研究,请告诉我,结果如何 :-)

【讨论】:

    【解决方案2】:

    您可以简单地排除您无法访问的目录,方法是逐个搜索它们并使用 try-catch 块包围所有搜索。这是一个例子:

    Console.WriteLine("Input search pattern (or empty to search all):");
            string pattern = Console.ReadLine();
            if (pattern == "")
            {
                pattern = "*";
            }
            List<string> allDirectories = new List<string>{ @"C:\" });
            Stack<string> directories = new Stack<string>(allDirectories);
            List<string[]> allFiles = new List<string[]>();
            while (directories.Count > 0)
            {
                try
                {
                    Console.WriteLine("Searching " + directories.Peek() + " for " + pattern);
                    foreach (string dir in Directory.GetDirectories(directories.Pop()))
                    {
                        directories.Push(dir);
                        allDirectories.Add(dir);
                        try
                        {
                            allFiles.Add(Directory.GetFiles(dir, pattern, SearchOption.TopDirectoryOnly));
                        }
                        catch (UnauthorizedAccessException e)
                        {
                            Console.WriteLine(e.Message);
                        }
                    }
                }
                catch (UnauthorizedAccessException e)
                {
                    Console.WriteLine(e.Message);
                }
            }
            Console.WriteLine("FINISHED");
    

    这会将所有文件收集到 allFiles 列表中(作为路径),并将目录收集到 allDirectories 列表中。 这对我来说运行了大约 10 分钟,所以不要调试很多次。

    【讨论】:

    • 这更像是一个建议而不是一个答案。当然,OP 想要收集所有(无论是否被拒绝)文件。这是缩小范围的好方法!
    • 谢谢。但是我们没有权限访问一些文件和文件夹,比如((Document and Setting))。这个问题怎么解决?
    猜你喜欢
    • 1970-01-01
    • 2021-04-29
    • 2011-02-24
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多