1. ホーム
  2. c#

[解決済み] あるディレクトリのすべてのサブディレクトリをリストアップする方法

2023-03-27 21:15:49

質問

あるプロジェクトで、あるディレクトリ内のすべてのサブディレクトリをリストアップする必要があります。たとえば、c:index.index.com のすべてのサブディレクトリをリストアップするにはどうすればよいでしょうか。

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

使用方法 Directory.GetDirectories で指定されたディレクトリのサブディレクトリを取得するために "your_directory_path"で指定されたディレクトリのサブディレクトリを取得します。 . 結果は文字列の配列になります。

var directories = Directory.GetDirectories("your_directory_path");

デフォルトでは、1階層下のサブディレクトリのみを返します。すべてを再帰的に返すオプションと、結果をフィルタリングするオプションがあります。 で説明されています。 で、Clive の回答で示されています。


UnauthorizedAccessExceptionを回避する。

が発生することは容易にあり得ます。 UnauthorizedAccessException が表示されることがあります。

このように、例外を処理する独自のメソッドを作成する必要があるかもしれません。

public class CustomSearcher
{ 
    public static List<string> GetDirectories(string path, string searchPattern = "*",
        SearchOption searchOption = SearchOption.AllDirectories)
    {
        if (searchOption == SearchOption.TopDirectoryOnly)
            return Directory.GetDirectories(path, searchPattern).ToList();

        var directories = new List<string>(GetDirectories(path, searchPattern));

        for (var i = 0; i < directories.Count; i++)
            directories.AddRange(GetDirectories(directories[i], searchPattern));

        return directories;
    }

    private static List<string> GetDirectories(string path, string searchPattern)
    {
        try
        {
            return Directory.GetDirectories(path, searchPattern).ToList();
        }
        catch (UnauthorizedAccessException)
        {
            return new List<string>();
        }
    }
}

そして、このように呼び出します。

var directories = CustomSearcher.GetDirectories("your_directory_path");

これは、ディレクトリとそのすべてのサブディレクトリを再帰的に走査します。もしアクセスできないサブディレクトリにぶつかったら、その時点で UnauthorizedAccessException を投げるような、アクセスできないサブディレクトリにぶつかったら、 例外を捕らえ、そのアクセスできないディレクトリの空リストを返します。そして、次のサブディレクトリに進みます。