C# 拒绝访问目录.GetFiles()时忽略文件夹/文件
我试图显示在所选目录(以及任意子目录)中找到的所有文件的列表。我遇到的问题是,当GetFiles()方法遇到它无法访问的文件夹时,它会抛出一个异常,进程停止 如何忽略此异常(并忽略受保护的文件夹/文件)并继续向列表中添加可访问的文件C# 拒绝访问目录.GetFiles()时忽略文件夹/文件,c#,getfiles,C#,Getfiles,我试图显示在所选目录(以及任意子目录)中找到的所有文件的列表。我遇到的问题是,当GetFiles()方法遇到它无法访问的文件夹时,它会抛出一个异常,进程停止 如何忽略此异常(并忽略受保护的文件夹/文件)并继续向列表中添加可访问的文件 try { if (cbSubFolders.Checked == false) { string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);
try
{
if (cbSubFolders.Checked == false)
{
string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);
foreach (string fileName in files)
ProcessFile(fileName);
}
else
{
string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories);
foreach (string fileName in files)
ProcessFile(fileName);
}
lblNumberOfFilesDisplay.Enabled = true;
}
catch (UnauthorizedAccessException) { }
finally {}
您必须手动执行递归;不要使用所有目录-一次查看一个文件夹,然后尝试从子目录获取文件。未测试,但如下所示(注意使用委托而不是构建数组):
使用系统;
使用System.IO;
静态类程序
{
静态void Main()
{
字符串路径=”;//TODO
applyallfile(路径、进程文件);
}
静态无效进程文件(字符串路径){/*…*/}
静态void ApplyAllFiles(字符串文件夹、动作文件动作)
{
foreach(Directory.GetFiles(文件夹)中的字符串文件)
{
文件操作(文件);
}
foreach(Directory.GetDirectories(文件夹)中的字符串subDir)
{
尝试
{
ApplyAllFiles(subDir、fileAction);
}
抓住
{
//燕子,圆木,随便什么
}
}
}
}
您必须手动执行递归;不要使用所有目录-一次查看一个文件夹,然后尝试从子目录获取文件。未测试,但如下所示(注意使用委托而不是构建数组):
使用系统;
使用System.IO;
静态类程序
{
静态void Main()
{
字符串路径=”;//TODO
applyallfile(路径、进程文件);
}
静态无效进程文件(字符串路径){/*…*/}
静态void ApplyAllFiles(字符串文件夹、动作文件动作)
{
foreach(Directory.GetFiles(文件夹)中的字符串文件)
{
文件操作(文件);
}
foreach(Directory.GetDirectories(文件夹)中的字符串subDir)
{
尝试
{
ApplyAllFiles(subDir、fileAction);
}
抓住
{
//燕子,圆木,随便什么
}
}
}
}
这应该可以回答这个问题。我忽略了遍历子目录的问题,我想你已经明白了
当然,您不需要为此使用单独的方法,但您可能会发现它是一个很有用的地方,可以验证路径是否有效,并处理调用GetFiles()时可能遇到的其他异常
希望这有帮助
private string[] GetFiles(string path)
{
string[] files = null;
try
{
files = Directory.GetFiles(path);
}
catch (UnauthorizedAccessException)
{
// might be nice to log this, or something ...
}
return files;
}
private void Processor(string path, bool recursive)
{
// leaving the recursive directory navigation out.
string[] files = this.GetFiles(path);
if (null != files)
{
foreach (string file in files)
{
this.Process(file);
}
}
else
{
// again, might want to do something when you can't access the path?
}
}
这应该能回答问题。我忽略了遍历子目录的问题,我想你已经明白了 当然,您不需要为此使用单独的方法,但您可能会发现它是一个很有用的地方,可以验证路径是否有效,并处理调用GetFiles()时可能遇到的其他异常 希望这有帮助
private string[] GetFiles(string path)
{
string[] files = null;
try
{
files = Directory.GetFiles(path);
}
catch (UnauthorizedAccessException)
{
// might be nice to log this, or something ...
}
return files;
}
private void Processor(string path, bool recursive)
{
// leaving the recursive directory navigation out.
string[] files = this.GetFiles(path);
if (null != files)
{
foreach (string file in files)
{
this.Process(file);
}
}
else
{
// again, might want to do something when you can't access the path?
}
}
有关处理UnauthorizedAccessException问题的解决方案,请参阅
如果对GetFiles()或GetDirectories()的任何调用都位于具有混合权限的文件夹上,则上述所有解决方案都将丢失文件和/或目录。有关处理UnauthorizedAccessException问题的解决方案,请参阅
如果对GetFiles()或GetDirectories()的任何调用都位于具有混合权限的文件夹上,则上述所有解决方案都将丢失文件和/或目录。此简单函数运行良好,满足问题要求
private List<string> GetFiles(string path, string pattern)
{
var files = new List<string>();
var directories = new string[] { };
try
{
files.AddRange(Directory.GetFiles(path, pattern, SearchOption.TopDirectoryOnly));
directories = Directory.GetDirectories(path);
}
catch (UnauthorizedAccessException) { }
foreach (var directory in directories)
try
{
files.AddRange(GetFiles(directory, pattern));
}
catch (UnauthorizedAccessException) { }
return files;
}
private List GetFiles(字符串路径、字符串模式)
{
var files=新列表();
var directories=新字符串[]{};
尝试
{
files.AddRange(Directory.GetFiles(path、pattern、SearchOption.TopDirectoryOnly));
目录=Directory.GetDirectories(路径);
}
捕获(UnauthorizedAccessException){}
foreach(目录中的var目录)
尝试
{
AddRange(GetFiles(目录,模式));
}
捕获(UnauthorizedAccessException){}
归还文件;
}
此简单功能运行良好,满足提问要求
private List<string> GetFiles(string path, string pattern)
{
var files = new List<string>();
var directories = new string[] { };
try
{
files.AddRange(Directory.GetFiles(path, pattern, SearchOption.TopDirectoryOnly));
directories = Directory.GetDirectories(path);
}
catch (UnauthorizedAccessException) { }
foreach (var directory in directories)
try
{
files.AddRange(GetFiles(directory, pattern));
}
catch (UnauthorizedAccessException) { }
return files;
}
private List GetFiles(字符串路径、字符串模式)
{
var files=新列表();
var directories=新字符串[]{};
尝试
{
files.AddRange(Directory.GetFiles(path、pattern、SearchOption.TopDirectoryOnly));
目录=Directory.GetDirectories(路径);
}
捕获(UnauthorizedAccessException){}
foreach(目录中的var目录)
尝试
{
AddRange(GetFiles(目录,模式));
}
捕获(UnauthorizedAccessException){}
归还文件;
}
一种简单的方法是使用文件列表和目录队列。
它保存内存。
如果使用递归程序执行相同的任务,则可能抛出OfMemory异常。
输出:添加到列表中的文件根据自上而下(宽度优先)目录树进行组织
public static List<string> GetAllFilesFromFolder(string root, bool searchSubfolders) {
Queue<string> folders = new Queue<string>();
List<string> files = new List<string>();
folders.Enqueue(root);
while (folders.Count != 0) {
string currentFolder = folders.Dequeue();
try {
string[] filesInCurrent = System.IO.Directory.GetFiles(currentFolder, "*.*", System.IO.SearchOption.TopDirectoryOnly);
files.AddRange(filesInCurrent);
}
catch {
// Do Nothing
}
try {
if (searchSubfolders) {
string[] foldersInCurrent = System.IO.Directory.GetDirectories(currentFolder, "*.*", System.IO.SearchOption.TopDirectoryOnly);
foreach (string _current in foldersInCurrent) {
folders.Enqueue(_current);
}
}
}
catch {
// Do Nothing
}
}
return files;
}
public静态列表GetAllFilesFromFolder(字符串根,bool搜索子文件夹){
队列文件夹=新队列();
列表文件=新列表();
文件夹。排队(根);
while(folders.Count!=0){
字符串currentFolder=folders.Dequeue();
试一试{
字符串[]filesInCurrent=System.IO.Directory.GetFiles(currentFolder,“*.*”,System.IO.SearchOption.TopDirectoryOnly);
files.AddRange(files);
}
抓住{
//无所事事
}
试一试{
如果(搜索子文件夹){
字符串[]foldersInCurrent=System.IO.Directory.GetDirectories(currentFolder,“***”,System.IO.SearchOption.TopDirectoryOnly);
foreach(foldersInCurrent中的字符串_current){
文件夹。排队(_当前);
}
}
}
抓住{
//D
var filePaths = Directory.EnumerateFiles(@"C:\my\files", "*.xml", new EnumerationOptions
{
IgnoreInaccessible = true,
RecurseSubdirectories = true
});
// search file in every subdirectory ignoring access errors
static List<string> list_files(string path)
{
List<string> files = new List<string>();
// add the files in the current directory
try
{
string[] entries = Directory.GetFiles(path);
foreach (string entry in entries)
files.Add(System.IO.Path.Combine(path,entry));
}
catch
{
// an exception in directory.getfiles is not recoverable: the directory is not accessible
}
// follow the subdirectories
try
{
string[] entries = Directory.GetDirectories(path);
foreach (string entry in entries)
{
string current_path = System.IO.Path.Combine(path, entry);
List<string> files_in_subdir = list_files(current_path);
foreach (string current_file in files_in_subdir)
files.Add(current_file);
}
}
catch
{
// an exception in directory.getdirectories is not recoverable: the directory is not accessible
}
return files;
}