一尘不染

当Directory.GetFiles()被拒绝访问时,忽略文件夹/文件

c#

我正在尝试显示在所选目录(以及可选的任何子目录)中找到的所有文件的列表。我遇到的问题是,当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 {}

阅读 716

收藏
2020-05-19

共1个答案

一尘不染

您将必须手动执行递归;不要使用AllDirectories-
一次查看一个文件夹,然后尝试从子目录获取文件。未经测试,但如下所示(注意使用委托而不是构建数组):

using System;
using System.IO;
static class Program
{
    static void Main()
    {
        string path = ""; // TODO
        ApplyAllFiles(path, ProcessFile);
    }
    static void ProcessFile(string path) {/* ... */}
    static void ApplyAllFiles(string folder, Action<string> fileAction)
    {
        foreach (string file in Directory.GetFiles(folder))
        {
            fileAction(file);
        }
        foreach (string subDir in Directory.GetDirectories(folder))
        {
            try
            {
                ApplyAllFiles(subDir, fileAction);
            }
            catch
            {
                // swallow, log, whatever
            }
        }
    }
}
2020-05-19