通过c#读取C盘所有文件和文件夹

问题描述

我想获取驱动器 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);
        }
    }

enter image description here

解决方法

您可以简单地排除无法访问的目录,方法是一一搜索它们并使用 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 分钟,所以不要调试很多次。

,

您需要做的第一件事是使用要求 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会帮助你在没有 UAC 提示的情况下将 exe 注入到 clr 中。

让我知道你是否按照我的建议继续研究以及结果是什么:-)