プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

【C#】フォルダを再帰的に探索して指定拡張子のファイルパスリストを作るメソッド

LINQでやろうとしたけど挫折したので普通に再帰

/// <summary>
/// 指定フォルダ以下のすべてのフォルダを探索し、
/// 指定拡張子のファイル名をリストに順次追加していく
/// </summary>
/// <param name="folderPath">探索するフォルダ</param>
/// <param name="list">ファイル名のリスト</param>
/// <param name="extensions">検索する拡張子群</param>
void FolderInsiteSearch(string folderPath, List<string> list, string[] extensions)
{
    //現在のフォルダ内の指定拡張子のファイル名をリストに追加
    foreach (var fileName in Directory.EnumerateFiles(folderPath))
        foreach (var endId in extensions)
            if (fileName.EndsWith(endId))
                list.Add(fileName);
    //現在のフォルダ内のすべてのフォルダパスを取得
    var dirNames = Directory.EnumerateDirectories(folderPath);
    //フォルダがないならば再帰探索終了し、あるなら各フォルダに対して探索実行
    if (dirNames.Count() == 0)
        return;
    else
        foreach (var dirName in dirNames)
            FolderInsiteSearch(dirName, list, extensions);
}

使用例

.csファイルと.exeファイルを以下のVisualStudioのプロジェクトファイルフォルダから検索してみます。
f:id:shirakamisauto:20160322160756p:plain

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
//長いのでエイリアス
using E = System.Environment;

namespace FolderInsiteSearch
{
    class Program
    {
        static void Main(string[] args)
        {
            string folderPath = E.GetFolderPath(E.SpecialFolder.MyDocuments)
                + @"\Visual Studio 2015\Projects\BlogSample1\AutoScreenShot";
            string[] extensions = { ".cs", ".exe"};
            var filePathList = new List<string>();
            FolderInsiteSearch(folderPath, filePathList, extensions);
            filePathList.ForEach(s => Console.WriteLine(Path.GetFileName(s)));

            Console.ReadLine();
        }
        /// <summary>
        /// 指定フォルダ以下のすべてのフォルダを探索し、
        /// 指定拡張子のファイルのファイルパスをリストに順次追加していく
        /// </summary>
        /// <param name="folderPath">探索するフォルダ</param>
        /// <param name="list">ファイル名のリスト</param>
        /// <param name="extensions">検索する拡張子群</param>
        static void FolderInsiteSearch(string folderPath, List<string> list, string[] extensions)
        {
            //現在のフォルダ内の指定拡張子のファイルパスをリストに追加
            foreach (var fileName in Directory.EnumerateFiles(folderPath))
                foreach (var endId in extensions)
                    if (fileName.EndsWith(endId))
                        list.Add(fileName);
            //現在のフォルダ内のすべてのフォルダパスを取得
            var dirNames = Directory.EnumerateDirectories(folderPath);
            //フォルダがないならば再帰探索終了し、あるなら各フォルダに対して探索実行
            if (dirNames.Count() == 0)
                return;
            else
                foreach (var dirName in dirNames)
                    FolderInsiteSearch(dirName, list, extensions);
        }

    }
}

結果

f:id:shirakamisauto:20160322160802p:plain