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