次の方法で共有


Visual Basic 6.0 と Visual Basic .NET とのフォルダやファイルの列挙方法の違いについて

Cc440866.download(ja-jp,MSDN.10).gif サンプル コードのダウンロード (vbmigtips_File.exe, 94.7 KB)

ディレクトリ内のフォルダやファイルを検索したい場合があると思います。そこで今回、Viusal Baic 6.0 と Visual Basic .NET それぞれでのディレクトリ内のファイルを列挙する方法について紹介します。今回は、取得したフォルダやファイルのパスをリストボックスに表示します (図1)。

 Cc440866.File_fig01(ja-jp,MSDN.10).gif
 図1

Visual Basic 6.0 では、FileSystemObject の Files プロパティを使い、指定したディレクトリ内のすべてのファイルを取得します。実装コードは以下のとおりです (事前に、[プロジェクト] メニューの [参照設定] で「Microsoft Scripting Runtime」にチェックを付けておく必要があります)。

Private Sub Command1_Click()
Dim lIndex As Long
Dim hFolder As Folder
Dim hFile As File
Dim Fso As FileSystemObject

List1.Clear

Set Fso = New FileSystemObject
Set hFolder = Fso.GetFolder("C:\Foo\")
lIndex = 0
For Each hFile In hFolder.Files
List1.List(lIndex) = hFile.Path
lIndex = lIndex + 1
Next hFile

Set Fso = Nothing
Set hFile = Nothing
Set hFolder = Nothing
End Sub

リスト1

上記 (リスト1) のコードでは、C ドライブ内の Foo フォルダの中にあるすべてのファイルを取得し、「List1.List(lIndex) = hFile.Path」で取得したファイル名のパスをリストボックスに追加します。上記を実装し、図1 の「File Only」ボタンをクリックすると、図2 のように Foo フォルダの中にあるすべてのファイルが表示されます。

 Cc440866.File_fig02(ja-jp,MSDN.10).gif
 図2

リスト1 では、ファイルを取得しましたが、SubFolders メソッドを使用することで指定したディレクトリ内のすべてのサブフォルダを取得することができます。実装コードは以下のとおりです。

For Each subFolder In hFolder.SubFolders
List1.List(lIndex) = subFolder.Path
lIndex = lIndex + 1
Next subFolder

リスト2

上記 (リスト2) は、C ドライブの Foo フォルダ内にあるすべてのフォルダを取得し、リストボックスに追加します。上記を実装し、図1 の「Folder Only」ボタンをクリックすると、図3 のように Foo フォルダの中にあるすべてのフォルダが表示されます。

 Cc440866.File_fig03(ja-jp,MSDN.10).gif
 図3

一方、Visual Basic .NET では、Directory クラスに GetFiles メソッドが用意されています。GetFiles メソッドは、特定のフォルダ、およびファイルを検索するだけでなく、ある条件を満たしたすべてのフォルダやファイルを列挙することもできます。

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
ListBox1.Items.Clear()
For Each strPath As String In System.IO.Directory.GetFiles("C:\Foo\", "*")
ListBox1.Items.Add(strPath)
Next strPath
End Sub

リスト3

上記 (リスト3) のコードでは、C ドライブ内の Foo フォルダの中にあるすべてのファイルを取得し、「ListBox1.Items.Add(strPath)」で取得したファイル名のパスをリストボックスに追加します。上記を実装し、図1 の「File Only」ボタンをクリックすると、図2 のように Foo フォルダの中にあるすべてのファイルが表示されます。

今回は、すべてのファイルを取得しましたが、たとえば、GetFiles メソッドの第2 パラメータに "*.txt" を設定すると、指定したパスの配下にあるすべての txt ファイルを取得することができ、"test.txt" と設定すると、指定したフォルダ内にある test.txt ファイルを検索します。
また、GetDirectories メソッドを使用することで 指定したディレクトリ内のサブフォルダを取得することができます。指定したディレクトリ内のすべてのサブフォルダとファイルを取得する場合は、GetFileSystemEntries メソッドを使用します。GetFileSystemEntries メソッドの実装コードは以下のとおりです。

For Each strPath As String In System.IO.Directory.GetFileSystemEntries("C:\Foo\", "*")
ListBox1.Items.Add(strPath)
Next strPath

リスト4

上記 (リスト4) は、C ドライブの Foo 内にあるすべてのフォルダとファイルを取得し、リストボックスにそのフォルダまたはファイルのパス名を追加しています。上記を実装し、「ALL」ボタンをクリックすると、図4 のように Foo フォルダ内のすべてのフォルダとファイルのパスが表示されます。

 Cc440866.File_fig04(ja-jp,MSDN.10).gif
 図4

このように、Visual Basic 6.0 では Folder の SubFolders メソッドや Files メソッドを、Visual Basic .NET では GetFiles メソッド、GetFileSystemEntries メソッドを使用することで、指定したフォルダ内にあるすべてのフォルダやファイルに対し検索を行うことができました。しかし、これらのメソッドは、サブフォルダ内のファイルを検索できません。そのため、サブフォルダ内のファイルも検索したい場合には再帰呼び出し等を行い独自で実装する必要があります。