如何跳过未经授权的文件获取目录中的所有文件?
c#
我需要获取 C 驱动器中允许写入和读取的所有文件的列表,所以我尝试如下:
string[] files = Directory.GetFiles(@"C:", "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
Console.WriteLine(file);
}
但我立即得到UnauthorizedAccess Exception
回答
如果您使用 .NET Core 2.1 或更高版本,您应该能够使用Directory.GetFiles(String, String, EnumerationOptions)并通过EnumerationOptions.IgnoreInaccessible:
获取或设置一个值,该值指示在拒绝访问时是否跳过文件或目录(例如,UnauthorizedAccessException 或 SecurityException)。
var files = Directory.GetFiles(@"C:", "*.*",
new EnumerationOptions {
IgnoreInaccessible = true,
RecurseSubdirectories = true,
});
笔记:
-
由于您是递归搜索,您也可以考虑切换到
Directory.EnumerateFiles(String, String, EnumerationOptions)性能:EnumerateFiles 和 GetFiles 方法的区别如下: 当您使用 EnumerateFiles 时,您可以在返回整个集合之前开始枚举名称集合;使用 GetFiles 时,必须等待整个名称数组返回,然后才能访问该数组。因此,当您处理许多文件和目录时,EnumerateFiles 会更高效。
-
在您写的标题中,如何获取目录中的所有文件并跳过未经授权的文件?但是在您写的问题中,我需要获取 C 驱动器中允许写入和读取的所有文件的列表。
仅仅因为文件由
Directory.GetFiles()with返回IgnoreInaccessible = true,并不意味着您可以断定该文件实际上是可写和可读的。为此,您需要查看文件的有效权限。请参阅检查 .NET 中的目录和文件写入权限。或者你可以只尝试打开该文件,并检查CanRead和CanWrite流的属性,请参阅C#文件状态(可读,可写的,是文件,是目录)由兹比格涅夫了解详情。