VB.NETで、特定フォルダ内にあるファイルの一覧を取得する方法です。
フォルダのファイル一覧を取得する方法
フォルダのファイル一覧を取得する方法は、次の4つです。
- Directory.GetFilesメソッド
- Directory.EnumerateFilesメソッド
- DirectoryInfo.GetFilesメソッド
- FileSystem.GetFilesメソッド
どの方法でも結果は同じですが、それぞれ使い方少し異なります。
とりあえず簡単な画面を作成しました。
各コントロールは次の役割を持たせます。
- 上のテキストボックス…一覧取得したいフォルダ名を入力
- 実行ボタン…ファイル一覧を取得
- 下のテキストボックス…ファイル一覧を表示
では、4つのメソッドそれぞれを使ってファイル一覧を取得する方法を紹介します。
Directory.GetFilesメソッド
最もポピュラーなのは、System.IO の Directory.GetFiles メソッドを使ってファイル一覧を取得する方法です。Directory.GetFiles メソッドは、.NET Framework 2.0以降で使用可能です。
基本は次の様に記述します。
System.IO.Directory.GetFiles("フォルダパス")
戻り値はString型の配列です。Directory.GetFiles メソッドは、必要に応じて、第三引数まで渡すことが可能です。
- 第一引数:フォルダパス
- 第二引数:検索パターン
- 第三引数:サブフォルダを検索するかどうか
特定のフォルダのみのファイル一覧を取得したいのであれば、第一引数にフォルダパスを渡すだけで問題ありません。
サンプルコードはこちら。
Private Sub System_IO_Directory_GetFiles() 'Directory.GetFilesメソッド(.NET Framework 2.0以降) 'ファイル一覧格納用の配列 Dim strArrayFiles As String() = Nothing 'ファイル一覧を配列に格納 'strArrayFiles = System.IO.Directory.GetFiles(txtTargetDir.Text) 'ファイル一覧をテキストボックスに表示 For Each strFile As String In strArrayFiles txtResult.Text += strFile & Environment.NewLine Next End Sub
これを実行します。フォルダの中にファイルを用意しました。
実行結果は、このようになります。
特定のファイルのみを一覧として取得したい場合、第二引数に検索パターンを渡します。
'第二引数を指定して、特定のファイルだけを取得 System.IO.Directory.GetFiles("フォルダパス", "*.txt")
上記の場合、実行するとtxtファイルだけが一覧に表示されます。
サブフォルダの中にあるファイルも一覧取得したい場合は、第三引数に System.IO.SearchOption.AllDirectories を渡します。
'第三引数を指定して、サブフォルダの中身も一覧として取得 System.IO.Directory.GetFiles("フォルダパス", "*", System.IO.SearchOption.AllDirectories)
実行するとサブフォルダの中にあるファイルも一覧として取得できました。
Directory.EnumerateFilesメソッド
System.IO の Directory.EnumerateFiles メソッドでもファイル一覧を取得することが出来ます。.NET Framework 4.0以降で使用可能です。
基本は次の様に記述します。
System.IO.Directory.EnumerateFiles("フォルダパス")
戻り値の型は、IEnumerable(Of String)なので、戻り値を受け取る変数を用意する場合、宣言時の型に注意する必要があります。
Directory.EnumerateFiles メソッドは、必要に応じて、第三引数まで渡すことが可能です。
- 第一引数:フォルダパス
- 第二引数:検索パターン
- 第三引数:サブフォルダを検索するかどうか
特定のフォルダのみのファイル一覧を取得したいのであれば、第一引数にフォルダパスを渡すだけで問題ありません。
サンプルコードはこちら。
Private Sub Directory_EnumerateFiles() 'Directory.EnumerateFilesメソッド(.NET Framework 4.0以降) 'ファイル一覧格納用の配列 Dim strArrayFiles As IEnumerable(Of String) = Nothing 'ファイル一覧を配列に格納 strArrayFiles = System.IO.Directory.EnumerateFiles(txtTargetDir.Text) 'ファイル一覧をテキストボックスに表示 For Each strFile As String In strArrayFiles txtResult.Text += strFile & Environment.NewLine Next End Sub
特定のファイルのみを一覧として取得したい場合、第二引数に検索パターンを渡します。
'第二引数を指定して、特定のファイルだけを取得 System.IO.Directory.EnumerateFiles("フォルダパス", "検索パターン")
サブフォルダの中にあるファイルも一覧取得したい場合は、第三引数に System.IO.SearchOption.AllDirectories を渡します。
'第三引数を指定して、サブフォルダの中身も一覧として取得 System.IO.Directory.EnumerateFiles("フォルダパス", "検索パターン", System.IO.SearchOption.AllDirectories)
先ほど解説した Directory.GetFiles メソッドと Directory.EnumerateFiles メソッドでやってることはほぼ同じです。どっちを使っても結果は同じですし、戻り値がシンプルな Directory.GetFiles メソッドの方が分かりやすいかもしれません。
ただし、大量件数を扱う場合、MSDN的には「EnumerateFiles の方が効率的な場合があります」と記載しています。もし、大量件数を扱う場合に、比較検討として、 Directory.EnumerateFiles メソッドを使ってみるのも手段の一つかもしれません。
DirectoryInfo.GetFilesメソッド
.NET Framework 1.1以降で提供されている System.IO の DirectoryInfo.GetFiles メソッド。インスタンス生成が必要なのと、戻り値の型がSystem.IO.FileInfoの配列なので、少し使い勝手が悪いのと、古すぎて見かける機会は少ないです。
基本は次の様に記述します。
Dim objDI As New System.IO.DirectoryInfo("フォルダパス") objDI.GetFiles()
System.IO.DirectoryInfo の変数宣言時にインスタンスを生成する必要があります。
また、戻り値の型は、System.IO.FileInfo() 配列なので、戻り値を受け取る変数を用意する場合、宣言時の型に注意する必要があります。
引数は第二引数まで存在し、それぞれ、
- 第一引数:検索パターン
- 第二引数:サブフォルダを検索するかどうか
となっています。
サンプルコードはこちら。
Private Sub System_IO_DirectoryInfo_GetFiles() 'DirectoryInfo.GetFilesメソッド(.NET Framework 1.1以降) 'System.IO.DirectoryInfoオブジェクトの作成 Dim objDI As New System.IO.DirectoryInfo(txtTargetDir.Text) 'ファイル一覧格納用の配列 Dim strArrayFiles As System.IO.FileInfo() = Nothing '配列の型がSystem.IO.FileInfo() 'ファイル一覧を配列に格納 'サブフォルダ含む 'strArrayFiles = objDI.GetFiles("*", System.IO.SearchOption.AllDirectories) '指定フォルダのみ strArrayFiles = objDI.GetFiles("*", System.IO.SearchOption.TopDirectoryOnly) '特定パターン 'strArrayFiles = objDI.GetFiles("*.csv") strArrayFiles = objDI.GetFiles() 'ファイル一覧をテキストボックスに表示 For Each strFile As System.IO.FileInfo In strArrayFiles txtResult.Text += strFile.FullName & Environment.NewLine 'ファイル名だけ欲しい場合 'txtResult.Text += strFile.Name & Environment.NewLine Next End Sub
特定のファイルのみを一覧として取得したい場合、第一引数に検索パターンを渡します。
'第一引数を指定して、特定のファイルだけを取得 Dim objDI As New System.IO.DirectoryInfo("フォルダパス") objDI.GetFiles(".txt",)
サブフォルダの中にあるファイルも一覧取得したい場合は、第二引数に System.IO.SearchOption.AllDirectories を渡します。
'第二引数を指定して、サブフォルダの中身も一覧として取得 System.IO.Directory.EnumerateFiles("フォルダパス", "*", System.IO.SearchOption.AllDirectories)
FileSystem.GetFilesメソッド
VBAで見かけるであろう、My.Computer.FileSystem.GetFilesメソッドでもファイル一覧を取得することが可能です。C#で使えないため、VB.NET固有のメソッドです。
基本は次の様に記述します。
My.Computer.FileSystem.GetFiles("フォルダパス")
ちょっと面倒なのが、戻り値が ReadOnlyCollection(Of String) のため、ToArray メソッドや ToList メソッドを用いて配列やリストにしないと使い勝手が悪いことです。
引数は以下。
- 第一引数:フォルダパス
- 第二引数:サブフォルダを検索するかどうか
- 第三引数:検索パターン
サンプルコードはこちら。
Private Sub FileSystem_GetFiles() 'FileSystem.GetFiles メソッド 'ファイル一覧格納用の配列 Dim strArrayFiles As String() = Nothing 'ファイル一覧を配列に格納(ToArrayで配列に変換) strArrayFiles = My.Computer.FileSystem.GetFiles(txtTargetDir.Text).ToArray 'ファイル一覧をテキストボックスに表示 For Each strFile As String In strArrayFiles txtResult.Text += strFile & Environment.NewLine Next End Sub
サブフォルダの中にあるファイルも一覧取得したい場合は、第二引数に System.IO.SearchOption.AllDirectories を渡します。
'第二引数を指定して、サブフォルダの中身も一覧として取得 My.Computer.FileSystem.GetFiles("フォルダパス", Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories)
特定のファイルのみを一覧として取得したい場合、第三引数に検索パターンを渡します。
'第三引数を指定して、特定のファイルだけを取得 My.Computer.FileSystem.GetFiles("フォルダパス", Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, "検索パターン")
参考リンク
Directory.GetFiles メソッド (System.IO) | Microsoft Docs
.