1. ホーム
  2. c#

Directory.GetFiles() がアクセス拒否された場合、フォルダー/ファイルを無視する。

2023-08-20 02:14:44

質問

選択されたディレクトリ (およびオプションで任意のサブディレクトリ) で見つかったすべてのファイルのリストを表示しようとしています。私が抱えている問題は、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 {}

どのように解決するのですか?

AllDirectories を使用しないでください。一度に 1 つのフォルダを検索し、サブディレクトリからファイルを取得してみてください。未検証ですが、次のようなものがあります (配列を構築するのではなく、デリゲートを使用することに注意してください)。

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