【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メソッドでファイルの検索をする方法を解説しました。

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

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

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

中沢 丈

中沢 丈

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

連絡先はこちらです。
[email protected]