C# 拒绝访问目录.GetFiles()时忽略文件夹/文件

C# 拒绝访问目录.GetFiles()时忽略文件夹/文件,c#,getfiles,C#,Getfiles,我试图显示在所选目录(以及任意子目录)中找到的所有文件的列表。我遇到的问题是,当GetFiles()方法遇到它无法访问的文件夹时,它会抛出一个异常,进程停止 如何忽略此异常(并忽略受保护的文件夹/文件)并继续向列表中添加可访问的文件 try { if (cbSubFolders.Checked == false) { string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);

我试图显示在所选目录(以及任意子目录)中找到的所有文件的列表。我遇到的问题是,当GetFiles()方法遇到它无法访问的文件夹时,它会抛出一个异常,进程停止

如何忽略此异常(并忽略受保护的文件夹/文件)并继续向列表中添加可访问的文件

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;
    }