指定したフォルダ以下のすべてのファイルのパスを取得するには、Directory.GetFilesメソッド(System.IO名前空間)を使用します。GetFilesメソッドは3番目のパラメータを省略(あるいは、SearchOption.TopDirectoryOnlyを指定)すると、指定したフォルダにあるファイルしか取得せず、サブフォルダにあるファイルは取得しません。サブフォルダのファイルも含め、すべてのファイルを取得するには、3番目のパラメータにSearchOption.AllDirectoriesを指定します。
以下の例では、フォルダ"C:\test"以下にあるファイルのパスをすべて取得し、リストボックス(ListBox1)に表示しています。
'"C:\test"以下のファイルをすべて取得する 'ワイルドカード"*"は、すべてのファイルを意味する Dim files As String() = System.IO.Directory.GetFiles( _ "C:\test", "*", System.IO.SearchOption.AllDirectories) 'ListBox1に結果を表示する ListBox1.Items.AddRange(files)
//"C:\test"以下のファイルをすべて取得する //ワイルドカード"*"は、すべてのファイルを意味する string[] files = System.IO.Directory.GetFiles( @"C:\test", "*", System.IO.SearchOption.AllDirectories); //ListBox1に結果を表示する ListBox1.Items.AddRange(files);
補足:VB.NETではMy.Computer.FileSystem.GetFilesメソッドでも同様のことができます。
補足:Directory.GetFileSystemEntriesメソッドを使用すると、指定したフォルダ以下にあるフォルダとファイルの両方を取得することができます。
また、DirectoryInfo.GetFilesメソッドを使っても同じことができます。戻り値は、FileInfoの配列です。
'"C:\test"以下の".txt"ファイルをすべて取得する Dim di As New System.IO.DirectoryInfo("C:\test") Dim files As System.IO.FileInfo() = _ di.GetFiles("*.txt", System.IO.SearchOption.AllDirectories) 'ListBox1に結果を表示する For Each f As System.IO.FileInfo In files ListBox1.Items.Add(f.FullName) Next
//"C:\test"以下の".txt"ファイルをすべて取得する System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"C:\test"); System.IO.FileInfo[] files = di.GetFiles("*.txt", System.IO.SearchOption.AllDirectories); //ListBox1に結果を表示する foreach (System.IO.FileInfo f in files) { ListBox1.Items.Add(f.FullName); }
.NET Framework 4.0からは、Directory.EnumerateFilesメソッドを使っても同様のことができます。EnumerateFilesメソッドの戻り値は、IEnumerable<String>です。
ファイルを一度にすべて取得する場合は、GetFilesメソッドと比べてEnumerateFilesメソッドのメリットはほとんどありません。しかし、ファイルを1つずつ列挙する場合は、メリットがあります。GetFilesメソッドは、必ずすべてのファイルを検索し終えてから結果を返すため、はじめの1つのファイルを取得するだけであっても長時間かかってしまう恐れがあります。それに対してEnumerateFilesメソッドは、ファイルが見つかればすぐに返しますので、ファイルの列挙で長時間ブロックされることがありません。
以下の例では、フォルダ"C:\test"以下にあるファイルをすべて列挙して、1つずつListBox1に追加しています。
'"C:\test"以下のファイルをすべて取得する Dim files As IEnumerable(Of String) = _ System.IO.Directory.EnumerateFiles( _ "C:\test", "*", System.IO.SearchOption.AllDirectories) 'ファイルを列挙する For Each f As String In files ListBox1.Items.Add(f) Next
//"C:\test"以下のファイルをすべて取得する IEnumerable<string> files = System.IO.Directory.EnumerateFiles( @"C:\test", "*", System.IO.SearchOption.AllDirectories); //ファイルを列挙する foreach (string f in files) { ListBox1.Items.Add(f); }
補足:EnumerateFileSystemEntriesメソッドを使用すると、あるフォルダ以下にあるフォルダとファイルの両方を取得することができます。
また、DirectoryInfo.EnumerateFilesメソッドを使っても同じことができます。このメソッドの戻り値は、IEnumerable<FileInfo>です。
'"C:\test"以下のファイルをすべて取得する Dim di As New System.IO.DirectoryInfo("C:\test") Dim files As IEnumerable(Of System.IO.FileInfo) = _ di.EnumerateFiles("*", System.IO.SearchOption.AllDirectories) 'ファイルを列挙する For Each f As System.IO.FileInfo In files ListBox1.Items.Add(f.FullName) Next
//"C:\test"以下のファイルをすべて取得する System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"C:\test"); IEnumerable<System.IO.FileInfo> files = di.EnumerateFiles("*", System.IO.SearchOption.AllDirectories); //ファイルを列挙する foreach (System.IO.FileInfo f in files) { ListBox1.Items.Add(f.FullName); }
.NET Framework 1.1以前では、Directory.GetFilesメソッドに3番目のパラメータがありませんので、サブフォルダのファイルまで取得できません。
例えば次のようなメソッドを作成することで、指定されたフォルダ以下のすべてのファイルを取得することができるようになります。
''' <summary> ''' 指定されたフォルダ以下にあるすべてのファイルを取得する ''' </summary> ''' <param name="folder">ファイルを検索するフォルダ名。</param> ''' <param name="searchPattern">ファイル名検索文字列 ''' ワイルドカード指定子(*, ?)を使用する。</param> ''' <param name="files">見つかったファイル名のリスト</param> Public Sub GetAllFiles(ByVal folder As String, _ ByVal searchPattern As String, ByRef files As ArrayList) 'folderにあるファイルを取得する Dim fs As String() = _ System.IO.Directory.GetFiles(folder, searchPattern) 'ArrayListに追加する files.AddRange(fs) 'folderのサブフォルダを取得する Dim ds As String() = System.IO.Directory.GetDirectories(folder) 'サブフォルダにあるファイルも調べる Dim d As String For Each d In ds GetAllFiles(d, searchPattern, files) Next d End Sub
/// <summary> /// 指定されたフォルダ以下にあるすべてのファイルを取得する /// </summary> /// <param name="folder">ファイルを検索するフォルダ名。</param> /// <param name="searchPattern">ファイル名検索文字列 /// ワイルドカード指定子(*, ?)を使用する。</param> /// <param name="files">見つかったファイル名のリスト</param> public static void GetAllFiles( string folder, string searchPattern, ref ArrayList files) { //folderにあるファイルを取得する string[] fs = System.IO.Directory.GetFiles(folder, searchPattern); //ArrayListに追加する files.AddRange(fs); //folderのサブフォルダを取得する string[] ds = System.IO.Directory.GetDirectories(folder); //サブフォルダにあるファイルも調べる foreach (string d in ds) GetAllFiles(d, searchPattern, ref files); }
次にGetAllFilesメソッドの使い方を示します。ここではフォルダ"C:\test"以下にあるすべてのファイルのフルパスをリストボックス(ListBox1)に表示しています。
Dim files As New ArrayList '"C:\test"以下のファイルをすべて取得 GetAllFiles("C:\test", "*.*", files) 'ListBox1に結果を表示する ListBox1.Items.AddRange(files.ToArray())
ArrayList files = new ArrayList(); //"C:\test"以下のファイルをすべて取得 GetAllFiles(@"C:\test", "*.*", ref files); //ListBox1に結果を表示する ListBox1.Items.AddRange(files.ToArray());