列出系统驱动器以外的驱动器中的所有文件会抛出UnauthorizedAccessException
。
我该如何解决这个问题?
有没有办法授予我的应用程序所需的访问权限?
Directory.GetFiles("S:\\", ...)
答案 0 :(得分:2)
这是一个可以工作的课程:
public static class FileDirectorySearcher
{
public static IEnumerable<string> Search(string searchPath, string searchPattern)
{
IEnumerable<string> files = GetFileSystemEntries(searchPath, searchPattern);
foreach (string file in files)
{
yield return file;
}
IEnumerable<string> directories = GetDirectories(searchPath);
foreach (string directory in directories)
{
files = Search(directory, searchPattern);
foreach (string file in files)
{
yield return file;
}
}
}
private static IEnumerable<string> GetDirectories(string directory)
{
IEnumerable<string> subDirectories = null;
try
{
subDirectories = Directory.EnumerateDirectories(directory, "*.*", SearchOption.TopDirectoryOnly);
}
catch (UnauthorizedAccessException)
{
}
if (subDirectories != null)
{
foreach (string subDirectory in subDirectories)
{
yield return subDirectory;
}
}
}
private static IEnumerable<string> GetFileSystemEntries(string directory, string searchPattern)
{
IEnumerable<string> files = null;
try
{
files = Directory.EnumerateFileSystemEntries(directory, searchPattern, SearchOption.TopDirectoryOnly);
}
catch (UnauthorizedAccessException)
{
}
if (files != null)
{
foreach (string file in files)
{
yield return file;
}
}
}
}
您可以像这样使用它:
IEnumerable<string> filesOrDirectories = FileDirectorySearcher.Search(@"C:\", "*.txt");
foreach (string fileOrDirectory in filesOrDirectories)
{
// Do something here.
}
它是递归的,但是使用yield会使内存占用空间很小(在我的测试中不到10KB)。如果您只想要与模式匹配的文件而不是目录,只需将EnumerateFileSystemEntries
替换为EnumerateFiles
。
答案 1 :(得分:1)
你是否允许访问该驱动器?程序是否可以在不从Visual Studio运行时访问驱动器?是否在项目的“安全性”页面(“Security Page, Project Designer”)中定义了限制性权限?
答案 2 :(得分:0)
我解决了这个问题。不是真的,但至少是来源。
导致异常的是SearchOption.AllDirectories选项。
但是,当我使用Directories.GetFiles列出直接文件时,它可以正常工作。
这对我来说已经足够了。
任何解决递归列表问题的方法?
答案 3 :(得分:0)
在.net核心中,您可以执行以下操作。它可以以良好的性能递归搜索所有子目录,而无需访问即可忽略路径。 我也尝试了其他方法 How to resolve "key not found: :ciphers"?和 How to quickly check if folder is empty (.NET)?和 Is there a faster way than this to find all the files in a directory and all sub directories?
public static IEnumerable<string> ListFiles(string baseDir)
{
EnumerationOptions opt = new EnumerationOptions();
opt.RecurseSubdirectories = true;
opt.ReturnSpecialDirectories = false;
//opt.AttributesToSkip = FileAttributes.Hidden | FileAttributes.System;
opt.AttributesToSkip = 0;
opt.IgnoreInaccessible = true;
var tmp = Directory.EnumerateFileSystemEntries(baseDir, "*", opt);
return tmp;
}