[.NET Core][Tips] System.IO.Directory 編(3)

はじめに

本記事は、.NET Core における System.IO.Directory クラス の 逆引き Tips です。

今回は、以下を紹介します。

指定したディレクトリ内に存在するファイルを取得するには?

指定したディレクトリ内に存在するファイルを取得するには、GetFiles メソッド または EnumerateFiles メソッドを使用します。

GetFiles(string) 引数で指定したパスに存在するディレクトリを配列で返します。
EnumerateFiles(string) 引数で指定したパスに存在するディレクトリをコレクションで返します。

GetFiles も EnumerateFiles もファイルの一覧を列挙しますが、EnumerateFiles はキャッシュを持たないという点で異なります。EnumerateFiles は全てのファイルを列挙する前に取り出しを開始することができます。一方 GetFiles は全てファイルを一括で配列に返すため、多くのディレクトリを取得するのには向いていません。

以下に GetFiles と EnumerateFiles の使用例を示します。

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

namespace IOSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = "/Users/hiroki/Projects";

            try
            {
                // ファイルを取得する
                string[] files1 = Directory.GetFiles(path);

                foreach (var file in files1)
                {
                    Console.WriteLine(file);
                }

                Console.WriteLine();

                // ファイルを取得する
                List<string> files2 = new List<string>(Directory.EnumerateFiles(path));

                foreach (var file in files2)
                {
                    Console.WriteLine(file);
                }

            }
            catch (IOException ex)
            {
                Console.WriteLine(ex.Message);
            }

        }
    }
}

指定したディレクトリから検索パターンに一致するファイル名を列挙するには?

指定したディレクトリから検索パターンに一致するディレクトリを取得するには、GetFiles メソッド または EnumerateFiles メソッドを使用します。


GetFiles(string, string)

 

指定したパスから検索パターンに一致するファイルを配列で返します。

第1引数:取得対象のファイルが存在するディレクトリパス
第2引数:対象となるファイルを検索するパターン。ワイルドカード文字(* または ?)を使用することができますが、正規表現はサポートしていません。

EnumerateFiles(string, string)

指定したパスから検索パターンに一致するディレクトリをコレクションで返します。

第1引数:取得対象のファイルが存在するディレクトリパス
第2引数:対象となるファイルを検索するパターン。ワイルドカード文字(* または ?)を使用することができますが、正規表現はサポートしていません。

以下に検索パターンを指定してファイルの一覧を取得する例を示します。この例では「My*.txt」のパータンに一致するファイルをの一覧を取得します。

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

namespace IOSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = "/Users/hiroki/Projects";

            try
            {
                // ファイルを取得する
                string[] files1 = Directory.GetFiles(path, "My*.txt");

                foreach (var file in files1)
                {
                    Console.WriteLine(file);
                }

                Console.WriteLine();

                // ファイルを取得する
                List<string> files2 = new List<string>(Directory.EnumerateFiles(path, "My*.txt"));

                foreach (var file in files2)
                {
                    Console.WriteLine(file);
                }

            }
            catch (IOException ex)
            {
                Console.WriteLine(ex.Message);
            }

        }
    }
}

指定したディレクトリ(サブディレクトリも含める)に存在する、検索パターンに一致するファイルを取得するには?

指定したディレクトリに含まれるサブディレクトリ以下も含めて、検索パターンに一致するファイルを検索したい場合は、検索オプションが指定可能な、GetFiles メソッド または EnumerateFiles メソッドを使用します。

GetFiles(String, String, SearchOption) 指定したパスから検索パターンに一致するディレクトリを配列で返します。 第1引数:取得対象のディレクトリが存在するパス
第2引数:対象ディレクトリを検索するパターン。ワイルドカード文字(* または ?)を使用することができますが、正規表現はサポートしていません。
第3引数:以下に示すSearchOption列挙体を参照してください。
EnumerateFiles(String, String, SearchOption) 指定したパスから検索パターンに一致するディレクトリをコレクションで返します。 第1引数:取得対象のディレクトリが存在するパス
第2引数:対象ディレクトリを検索するパターン。ワイルドカード文字(* または ?)を使用することができますが、正規表現はサポートしていません。
第3引数:以下に示すSearchOption列挙体を参照してください。

 

第3引数に指定可能な SearchOption 列挙体を以下に示します。

AllDirectories 現在のディレクトリとすべてのサブディレクトリも対象とします。 このオプションを指定した場合、検索範囲に、マウントされたドライブやシンボリック リンクのようなリパース ポイントも対象にします。
TopDirectoryOnly 検索操作を現在のディレクトリのみにします。

以下に使用例を示します。この例では「My」で始まるディレクトリとその下にある「My」で始まるサブディレクトリのみを取得します。

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

namespace IOSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = "/Users/hiroki/Projects";

            try
            {
                // ファイルを取得する
                string[] dirs1 = Directory.GetFiles(path, "My*.txt", SearchOption.AllDirectories);

                foreach (var dir in dirs1)
                {
                    Console.WriteLine(dir);
                }

                Console.WriteLine();

                // ディレクトリをす取得する
                List<string> dirs2 = new List<string>(Directory.EnumerateFiles(path, "My*.txt", SearchOption.AllDirectories));

                foreach (var dir in dirs2)
                {
                    Console.WriteLine(dir);
                }

            }
            catch (IOException ex)
            {
                Console.WriteLine(ex.Message);
            }

        }
    }
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください