Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过C读取C驱动器中的所有文件和文件夹#_C#_File_Directory_Path_Drive - Fatal编程技术网

C# 通过C读取C驱动器中的所有文件和文件夹#

C# 通过C读取C驱动器中的所有文件和文件夹#,c#,file,directory,path,drive,C#,File,Directory,Path,Drive,我想获取驱动器C中的所有文件和文件夹。 事实上,我想要一个驱动器上所有文件的列表。所有文件及其路径。 我使用此代码。但遇到错误 static void Main(string[] args) { System.IO.DriveInfo di = new System.IO.DriveInfo(@"C:\"); System.IO.DirectoryInfo dirInfo = di.RootDirectory;

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

您可以通过逐个搜索无法访问的目录,并用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");
Console.WriteLine(“输入搜索模式(或清空以搜索全部):”;
字符串模式=Console.ReadLine();
如果(模式==“”)
{
pattern=“*”;
}
List allDirectories=新列表{@“C:\”});
堆栈目录=新堆栈(所有目录);
List allFiles=新列表();
而(directories.Count>0)
{
尝试
{
Console.WriteLine(“搜索”+目录.Peek()+”以查找“+模式”);
foreach(Directory.GetDirectories(directories.Pop())中的字符串dir)
{
目录推送(dir);
添加(dir);
尝试
{
Add(Directory.GetFiles(dir,pattern,SearchOption.TopDirectoryOnly));
}
捕获(未经授权的访问例外)
{
控制台写入线(e.Message);
}
}
}
捕获(未经授权的访问例外)
{
控制台写入线(e.Message);
}
}
控制台。写入线(“完成”);
这会将所有文件收集到allFiles列表(作为路径)中,并将目录收集到AllDirectory列表中。
这对我来说会运行约10分钟,所以不要调试很多次。

您需要做的第一件事是使用请求根权限的清单文件编译您的C#应用程序(按照以下说明进行操作:)。 接下来,你应该做的是实现任何类型的具有管理员权限的用户/运行应用程序,并让它启动你的C#应用程序。 我认为,如果您通过具有root权限的应用程序执行上述操作,那么当C#app启动时,不会向用户弹出UAC

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

但如果你的目标是找出一个C#dll是否可以恶意读取C驱动器的文件夹树,我认为这是可能的:

  • 您需要将您的C#代码编译成带有清单的exe文件,正如我前面所述
  • 然后,创建一个批处理文件,该文件将以root权限启动CLR进程(它可能会向用户发出UAC提示,但普通用户不会怀疑CLR)
  • 确保批处理将以用户权限而不是默认权限运行,否则下一步将无法工作
  • 您的批处理应该告诉clr加载C#exe,我相信要么不会提示UAC,要么批处理可以在没有任何提示的情况下接受用户的行为。 4'. 如果我错了,也许这篇文章可以帮助您在没有UAC提示的情况下将exe注入clr

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

    这是否回答了您的问题?是的,但我认为这篇文章并没有提供一个完整准确的答案来解决这个问题。试着从另一篇文章中得到一些建议。我认为没有人能帮助你。看看你有没有防病毒软件。查看权限。这篇文章提供了很多有用的信息。我认为这是没有答案的,因为它背后没有一个推理。如果它可用,在.Net 5中,
    Directory
    DirectoryInfo
    类都支持一个新的参数,该参数可以处理特殊的目录并具有扩展的匹配属性。@Jimi,我找不到这样的例子。你能解释更多吗?这更多的是一个建议而不是一个答案。当然OP想要收集所有的文件,不管是否被拒绝。不过,这是缩小范围的好方法!谢谢但是我们没有访问某些文件和文件夹的权限。例如((文档和设置))。如何解决此问题?