【C#】フォルダ配下の全ファイルからファイル情報(ファイル名、サイズ、タイムスタンプ)を取り出すには

当ページのリンクには広告が含まれています。

C#を使って、指定したフォルダの配下にある全てのファイルについて、ファイル名、ファイルサイズ、タイムスタンプを取り出す方法について解説します。

本記事の応用として「【ソース公開】指定したフォルダ配下のファイル名や日付を取得するコマンドを作ってみた」という記事も公開しています。こちらはコマンドとして作成しており、ソースコード一式もダウンロードできるようにしていますので、興味のある方は併せてご覧下さい。

目次

フォルダ配下にある全ファイルを取り出すには

DirectoryInfoクラスにある GetFiles メソッド、もしくは EnumerateFiles メソッドを使うことで、指定したフォルダ配下の全ファイルの情報を取得することが可能です。

このクラスは名前空間 System.IO にあるので、ソースコードの冒頭で using System.IO を記述しておきます。

両者の違いは、戻り値が FileInfo[] か IEnumerable<FileInfo> の違いです。

もう少し詳しく説明すると、GetFiles は全てのファイル検索が終了した時点で、その結果をまとめて配列で返してくるのに対し、EnumerableFiles は検索にヒットしたファイルをその都度返してくれます。

もしファイル取得の途中でキーボードにり中断したい場合や、例外発生時に処理を行いたい場合は、EnuerableFiles を使う必要があります。

それでは、詳しく見ていきましょう。

GetFilesによるファイル情報の取得

GetFilesを使うには、あらかじめ DirectoryInfo の引数に対象となるフォルダを指定して、インスタンスを生成しておく必要があります。

  DirectoryInfo info = new DirectoryInfo(検索対象のパス);

例えば、Dドライブ直下を指定する場合は次のように記述します。

この例では info というインスタンスを生成していますが、この info にある GetFiles メソッドを呼び出します。

GetFileの第1引数で指定する serchPattern は、ファイルを検索する際の検索パターンであり、”*.txt” や “data0??.csv” などの様にワイルドカードが使用できます。

第2引数は検索範囲を指定するためのもので、SearchOption.TopDirectoryOnly を指定するとトップディレクトリのみ、SearchOption.AllDirectoriesを指定すると配下にある全てのディレクトリが対象となります。

GetFiles(string searchPattern, SearchOption searchOption)

以下は path で指定したフォルダ配下にある全てのファイルの情報を配列として返す関数のサンプルです。

このサンプルでは、DirectoriInfo のインスタンス生成と GetFiles の呼び出しを1行で行っています。

また、第1引数の searchPattern に “*” を記述していますので、すべてのファイルが対象となります。

EnumerateFilesによるファイル情報の取得 

EnumerableFilesを使う場合も、GetFilesと同様、あらかじめ DirectoryInfo の引数に対象となるフォルダを指定して、インスタンスを生成しておきます。

 EnumerateFiles(string searchPattern, SearchOption searchOption)

引数は GetFiles と全く同じであり、第1引数には検索パターン、第2引数には検索範囲を指定します。

以下は path で指定したフォルダ配下にある全てのファイルの情報を配列として返す関数のサンプルですが、GetFiles の部分が EnuerateFiles に代わっている以外は全く同じです。

ちなみに、この関数を使って取得したファイル情報を一括して配列に入れたい場合は、必ず ToArray() を末尾に付加することを忘れないでください。

でないと、いつまでたっても配列に結果が格納されません。

アクセス権の無いフォルダでもエラーを発生させない方法

指定したフォルダの中にアクセス権が無いフォルダが含まれていた場合、その時点でエラーになり処理が止まってしまいます。

自分が作成したフォルダ配下で自分自身のアクセス権が無いという事態は極めて稀ですが、フォルダを指定せずドライブだけを指定した場合、ほぼ確実にエラーが発生してファイル情報が取得できません。

下記はGetFiles で Dドライブ直下( @”d:\”) を指定した場合のエラーです。

各ドライブのルートには、RECYCLE.BIN というゴミ箱用の隠しフォルダが作られていて、通常はこのフォルダへのアクセス権はありません。

この対策をするには EnumerableFiles を使ってファイル情報を1つづつ取り出し、アクセス権の無いフォルダに対してはエラーを握りつぶすという方法が一番簡単です。

以下のサンプルは、引数で指定されたフォルダ名(ディレクトリ名)直下のファイル情報を取得した後に、SearchOption.AllDirectories が指定されていた場合は直下のフォルダに対してもファイル情報を取得するようにしたものです。

また、IEnumerable<FileInfo> で逐次結果を返していますので、EnumerableFiles と同じように扱うことが可能です。

このままコピー&ペーストして頂ければすぐに使えます。

FileInfo からファイル情報を取り出すには

今までの方法でフォルダ配下のファイル情報を取り出すことができました。

次は、このファイル情報(FileInfo)から必要な値を取り出す方法を説明します。

FileInfo には様々なメソッドやプロパティが用意されていますので、詳しく知りたい方は こちら の記事をご覧ください。

ここでは、一般的によく使うであろうプロパティのみを記載致します。

プロパティ名内容
stringFullNameファイルのフルパス(絶対パス)
stringDirectoryNameディレクトリ名
stringNameファイル名
stringExtention拡張子(.txt,.csvなど)
longLengthファイルサイズ(バイト)
DateTimeCreationTime作成日時
DateTimeLastWriteTime更新日時
DateTimeLastAccessTimeアクセス日時

以下は、path で指定したフォルダに対して、DirectoryInfo の EnuerateFiles を使ってすべてのファイル情報を取得し、ファイル名のフルパス、ファイルサイズ、作成日時、更新日時、アクセス日時をカンマ区切りでコンソール出力する例です。

まとめ

今回は指定したフォルダに対して、その配下にある全てのファイル情報の取得と、ファイル情報からファイル名やファイルサイズ、ファイルスタンプを取得する方法を解説致しました。

また、検索フォルダにドライブのみを指定した場合、ゴミ箱用の隠しフォルダをアクセスした時点でアクセス権無しのエラーが発生するため、これを回避するサンプルプログラムについても解説致しました。

コピぺして使えるように関数化していますので、是非ご活用下さい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次