【C#入門】ファイルを高速に検索して一覧で取得する(速度の比較も解説)

こんにちは!エンジニアの中沢です。

C#にはファイルを検索するための「GetFilesメソッド」や「EnumerateFilesメソッド」があります。

指定したフォルダ(ディレクトリ)内のファイルの拡張子を指定して検索したり、サブフォルダも含めて検索することができます。

この記事では、

・ファイルの検索とは
・DirectoryクラスのGetFilesで検索する方法
・DirectoryInfoクラスのEnumerateFilesメソッドで検索する方法

という基本的な内容から、

・サブフォルダも含めて検索する方法
・ワイルドカードで拡張子を指定して検索する方法
・高速に検索する方法

などの応用的な使い方に関しても解説していきます。

今回はこれらの方法を覚えるために、ファイルの検索のさまざまな使い方をわかりやすく解説します!

目次

ファイルの検索とは

ファイルを検索する方法はいくつかあります。

例えば、条件を指定せずにフォルダ内のすべてのファイルのファイル名を取得したい場合や、拡張子を指定してテキストファイルだけを検索したい場合などです。

拡張子を指定する場合には、ワイルドカード(*)を使用します。

また、指定したフォルダの中のサブフォルダも含めて検索する方法もこの記事で解説します。

DirectoryクラスのGetFilesメソッドで検索する方法

フォルダ内を検索する方法

DirectoryクラスGetFilesメソッドで指定したフォルダ内を検索する方法を解説します。

GetFilesメソッドは第1引数にフォルダのパスを指定します。

第2引数に検索パターンを指定します。

第3引数にはサブフォルダも検索する場合には「SearchOption.AllDirectories」を指定します。
サブフォルダを検索しない場合には省略できます。

検索パターンにワイルドカードの"*"を指定することで、すべてのファイルのパスを戻り値として取得することができます。

GetFilesメソッドの使い方を次のプログラムで確認してみましょう。

using System;
using System.IO;

namespace Sample
{
    class Sample
    {
        static void Main()
        {
            string[] files = Directory.GetFiles(@"C:\Samurai", "*");

            foreach (string str in files)
            {
                Console.WriteLine(str);
            }

            Console.ReadKey();
        }
    }
}

実行結果:

C:\Samurai\samurai.jpg
C:\Samurai\samurai.txt

このプログラムでは、指定したフォルダ内すべてのファイルのパスを取得して表示しています。

サブフォルダも含めて検索する方法

サブフォルダも含めて検索するには、GetFilesメソッドの第3引数に「SearchOption.AllDirectories」を指定します。

次のプログラムで確認してみましょう。

using System;
using System.IO;

namespace Sample
{
    class Sample
    {
        static void Main()
        {
            string[] files = Directory.GetFiles(@"C:\Samurai", "*", SearchOption.AllDirectories);

            foreach (string str in files)
            {
                Console.WriteLine(str);
            }

            Console.ReadKey();
        }
    }
}

実行結果:

C:\Samurai\samurai.jpg
C:\Samurai\samurai.txt
C:\Samurai\Test\samurai1.txt
C:\Samurai\Test\samurai2.txt

このプログラムでは、指定したフォルダ内のサブフォルダも含めて、すべてのファイルのパスを取得して表示しています。

DirectoryInfoクラスのEnumerateFilesメソッドで検索する方法

フォルダ内を検索する方法

DirectoryInfoクラスのEnumerateFilesメソッドで検索する方法を解説します。

EnumerateFilesメソッドはGetFilesメソッドと同様に引数を指定して使います。

EnumerateFilesメソッドは第1引数にフォルダのパスを指定します。

第2引数に検索パターンを指定します。

第3引数にはサブフォルダも検索する場合には「SearchOption.AllDirectories」を指定します。
サブフォルダを検索しない場合には省略できます。

検索パターンにワイルドカードの"*"を指定することで、すべてのファイルのパスを戻り値として取得することができます。

EnumerateFilesメソッドの使い方を次のプログラムで確認してみましょう。

using System;
using System.Collections.Generic;
using System.IO;

namespace Sample
{
    class Sample
    {
        static void Main()
        {

            IEnumerable<string> files = Directory.EnumerateFiles(@"C:\Samurai", "*");

            foreach (string str in files)
            {
                Console.WriteLine(str);
            }

            Console.ReadKey();
        }
    }
}

実行結果:

C:\Samurai\samurai.jpg
C:\Samurai\samurai.txt

このプログラムでは、指定したフォルダ内すべてのファイルのパスを取得して表示しています。

サブフォルダも含めて検索する方法

サブフォルダも含めて検索するには、EnumerateFilesメソッドの第3引数に「SearchOption.AllDirectories」を指定します。

次のプログラムで確認してみましょう。

using System;
using System.Collections.Generic;
using System.IO;

namespace Sample
{
    class Sample
    {
        static void Main()
        {

            IEnumerable<string> files = Directory.EnumerateFiles(@"C:\Samurai", "*", SearchOption.AllDirectories);

            foreach (string str in files)
            {
                Console.WriteLine(str);
            }

            Console.ReadKey();
        }
    }
}

実行結果:

C:\Samurai\samurai.jpg
C:\Samurai\samurai.txt
C:\Samurai\Test\samurai1.txt
C:\Samurai\Test\samurai2.txt

このプログラムでは、指定したフォルダ内のサブフォルダも含めて、すべてのファイルのパスを取得して表示しています。

拡張子を指定して検索する方法

検索パターンに拡張子を指定することで、テキストファイルなどのファイル種類を指定して検索することができます。

例えば、テキストファイルを検索する場合にはワイルドカードと拡張子を指定して「*.txt」のように記述します。

拡張子を指定して検索する方法を次のプログラムで確認してみましょう。

using System;
using System.Collections.Generic;
using System.IO;

namespace Sample
{
    class Sample
    {
        static void Main()
        {

            IEnumerable<string> files = Directory.EnumerateFiles(@"C:\Samurai", "*.txt");

            foreach (string str in files)
            {
                Console.WriteLine(str);
            }

            Console.ReadKey();
        }
    }
}

実行結果:

C:\Samurai\samurai.txt

指定したフォルダ内のテキストファイルだけを取得することができました。

高速に検索する方法(速度の比較)

GetFilesメソッドとEnumerateFilesメソッドは似たような動作をするので、どちらを使ってもファイルを検索することができます。

そこで、どちらを使った方が良いのかを調べるために、動作速度の比較をしてみました。

次のプログラムでは、100個のファイルが入ったフォルダの検索を1000回ループさせて処理速度を記録して比較しています。

using System;
using System.Collections.Generic;
using System.IO;

namespace Sample
{
    class Sample
    {
        static void Main()
        {
            var sw = new System.Diagnostics.Stopwatch();
            string[] files1 = null;

            sw.Start();

            for (int i = 1; i < 1000; i++)
            {
                files1 = Directory.GetFiles(@"C:\Samurai\Test", "*.txt");
            }
            sw.Stop();

            Console.WriteLine("GetFilesメソッド");
            Console.WriteLine($"{sw.ElapsedMilliseconds}ミリ秒");

            IEnumerable<string> files2 = null;

            sw.Reset();
            sw.Start();

            for (int i = 1; i < 1000; i++)
            {
                files2 = Directory.EnumerateFiles(@"C:\Samurai\Test", "*.txt");
            }

            Console.WriteLine("EnumerateFilesメソッド");
            Console.WriteLine($"{sw.ElapsedMilliseconds}ミリ秒");

            Console.ReadKey();
        }
    }
}

実行結果:

GetFilesメソッド
3196ミリ秒
EnumerateFilesメソッド
1965ミリ秒

処理速度を比較した結果、EnumerateFilesメソッドの方が速いことがわかりました。

どちらを使ってもよい場合にはEnumerateFilesメソッドを使った方が良いでしょう。

まとめ

いかがでしたか?

今回はGetFilesメソッドとEnumerateFilesメソッドでファイルの検索をする方法を解説しました。

拡張子を指定してテキストファイルだけを取得することなどができるので、ぜひ活用してくださいね。

もし、ファイルを検索する方法を忘れてしまったらこの記事を確認してください!

この記事を書いた人

フリーランスエンジニア。
システム開発からコンテンツ作成まで幅広く対応します。

連絡先はこちらです。
ntakeshi@sejuku.net

目次