ウォークスルー : Visual Basic .NET でファイルおよびフォルダを操作する
Cat Francis
Visual Studio Team
Microsoft Corporation
January 2002
日本語版最終更新日 2003 年 5 月 6 日
要約 : このウォークスルーでは、Microsoft® Visual Basic® .NET におけるファイル I/O の基礎について説明します。機能を具体的に説明するために、ディレクトリ内のテキスト ファイルを参照する小規模なアプリケーションを作成し、ファイルの属性、前回のアクセス時刻、最初の 80 文字などの情報を表示します。また、ログ ファイルに情報を書き込むこともできます。
目次
はじめに
アプリケーションを作成する
現在のディレクトリを表示する
ディレクトリを変更する
有効なパスの入力を確認する
リスト ボックスにディレクトリの内容を表示する
ユーザーによる参照ファイルの選択を可能にする
結果を表示する
結果を保存する
アプリケーションをテストするには
結論
はじめに
開発者であれば、どこかの段階で必ずファイルとディレクトリに対する操作を行わなければなりません。アプリケーションの開発過程においては、以下のような基本タスクが考えられます。
- ログ ファイルへの結果の書き込み。ログ ファイルがあるかどうかの確認と (ない場合は作成します)、収集した情報の追加を含みます。
- ファイルの最新アクセス日時やサイズなど、ファイルに関する情報の収集。
- ディレクトリ内のファイル一覧の生成と表示。1 つのディレクトリから別のディレクトリへの移動が必要な場合もあります。
これらのタスクに携わる開発者は、使用可能なメソッドとクラスについて理解している必要があります。このウォークスルーでは、Microsoft Visual Basic .NET のファイル I/O 機能を使用して FileExplorer というアプリケーションを作成します。このアプリケーションでは、ディレクトリの参照、ディレクトリ内のファイルに関する情報の確認と表示、およびログ ファイルへの情報の書き込みを行うことができます。アプリケーションが完成したら、プログラムによるファイルの選択、そのファイルに関する情報の抽出、およびログ ファイルへの情報の書き込みが可能になります。
アプリケーションを作成する
プロジェクトを開始するには、ユーザーによるディレクトリの選択、ディレクトリ内のファイルの選択、およびそのファイルについて抽出する情報の選択を行うことができるフォームを作成します。
プロジェクトを作成するには
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されます。
[プロジェクトの種類] ペインで [Visual Basic プロジェクト] をクリックします。次に、[テンプレート] ペインで [Windows アプリケーション] をクリックします。
[名前] ボックスに「FileExplorer」と入力して、プロジェクト名を設定します。
Visual Studio® によってプロジェクトがソリューション エクスプローラに追加され、Windows® フォーム デザイナが開きます。
次の表のコントロールをフォームに追加し、プロパティに対応する値を設定します。
オブジェクト プロパティ 値 TextBox Name Text
txtDirectory ディレクトリ
Button Name Text
btnSubmit 送信(&S)
Button Name Text
btnExamine 確認(&E)
ListBox Name lstFilePick CheckBox Name Text
Checked
chkAttributes 属性
True
CheckBox Name Text
Checked
chkFileLength ファイルの長さ
True
CheckBox Name Text
Checked
chkLastAccess 前回のアクセス時刻
True
CheckBox Name Text
Checked
chkFirstLine 1 行目を表示する
True
CheckBox Name Text
Checked
chkSave 結果を保存する
False
現在のディレクトリを表示する
どの開発プロセスにも開始地点があります。txtDirectory テキスト ボックスでは、CurDir 関数を使用して現在のパスを示す文字列を返し、表示します。
現在のディレクトリを返すには
txtDirectory テキスト ボックスに現在の場所を表示するには、次のコードを
Form1_Load
に追加します。txtDirectory.Text =
CurDir()
プログラムを実行して、CurDir 関数が正しいパスを返すかどうかを確認します。
txtDirectory テキスト ボックスに現在のディレクトリが表示されます。
ディレクトリを変更する
別のディレクトリにあるファイルを選択する場合は、ChDir 関数を使用してディレクトリを切り替えます。別のディレクトリに変更するには、ユーザーは txtDirectory テキスト ボックスに新しいパスを入力します。
ディレクトリを変更するには
- 次のコードを
btnSubmit_Click
に追加します。Dim NewPath As String ' NewPath には、ユーザーが入力したパスが格納されます。 NewPath = txtDirectory.Text ' 場所を NewPath に変更します。
ChDir(NewPath)
有効なパスの入力を確認する
ChDir 関数には Path パラメータが必要です。ドライブを指定することもできますが、指定しなくてもかまいません。パスでドライブが指定されていない場合、ChDir は現在のドライブを使用します。混乱を回避するために、Try...Catch ステートメントを組み込んで、パスが指定されないことによって発生する例外をキャッチします。
有効なパスを確保するには
イベント
btnSubmit_Click
のコード行Dim NewPath As String
の後の新しい行に、Dim ErrorMessage As String
を追加します。コード行
ChDir(NewPath)
の前に、次のように Try ステートメントの行を追加します。Try
コード行
ChDir(NewPath)
の後に、次のコードを追加します。' パスが空白でないかどうかをチェックします。 Catch ex As Exception When NewPath = "" ErrorMessage = "パスを入力してください。" ' 無効なパスによって発生したエラーをキャッチします。 Catch ErrorMessage = "有効なパスを入力してください。別の ドライブにアクセスする場合、ドライブ名を指定する必要が あります。" Finally ' エラー メッセージがある場合のみ表示します。 If ErrorMessage <> "" Then MsgBox(ErrorMessage) End If End Try
リスト ボックスにディレクトリの内容を表示する
現在のディレクトリの内容を表示するには、指定されたパターンと一致するファイル、ディレクトリ、またはフォルダの名前を示す文字列を返す Dir 関数を使用できます。Dir 関数は最初に一致したアイテムのみを返すので、各アイテムをチェックするには Do Until...Loop を組み込みます。また、[送信] ボタンに次のコードを追加すると、.txt ファイルのみを一覧表示することができます。
注 : このプロセスでは、引数を指定しないで Dir 関数を呼び出した場合、前の一致したパターンがそのまま残されるという事実を利用しています。
ディレクトリの内容を表示するには
イベント
btnSubmit_Click
の最初にDim ContentItem As String
を挿入します。コード行
End Try
の後に、次のコードを挿入します。LstFilePick.Items.Clear ' .txt ファイルのみを表示します。 ContentItem =
Dir("*.txt")
If ContentItem = "" Then ErrorMessage = "テキスト ファイルが見つかりません。" MsgBox(ErrorMessage) End If ' ディレクトリの内容を反復します。Do Until
ContentItem = "" ' 一覧に追加します。lstFilePick.Items.Add(ContentItem)
' 次のテキスト ファイルに移動します。 ContentItem = Dir()Loop
収集された情報が lstFilePick リスト ボックスに表示され、特定のファイルを選択して参照できるようになります。
アプリケーションをテストするには、まず .txt ファイルがないディレクトリでアプリケーションを実行して、次に複数の .txt ファイルがあるディレクトリで実行します。.txt ファイルがないディレクトリでアプリケーションを実行した場合、その内容を示すエラー メッセージが表示されます。.txt ファイルが複数あるディレクトリで実行した場合は、txtDirectory テキスト ボックスで指定したディレクトリ内の .txt ファイルがすべて表示されます。
ユーザーによる参照ファイルの選択を可能にする
ユーザーは、lstFilePick リスト ボックスに表示されるディレクトリ内のすべてのファイルの中から特定のファイルを選択し、内容を確認することができます。
- ファイルの選択を確認するには、イベント
btnExamine_Click
の最初に次のコードを追加します。Dim thisFile As Object
thisFile = lstFilePick.SelectedItem
' ファイルが選択されているかどうかをチェックします。 If thisFile Is Nothing Then MsgBox("ファイルが選択されていません。") Exit Sub End If
収集する情報をユーザーが決定できるようにする
lstFilePick リスト ボックスにファイルが表示されたら、コードを追加して、収集する情報をユーザーが指定できるようにします。たとえば、ファイルの最終アクセス日時のみを参照することができます。また、同時にファイルのサイズを参照することもできます。ユーザーは、チェック ボックス (chkAttributes、chkLastAccess、chkFileLength、chkFirstLine) をオンまたはオフにして、結果をカスタマイズできます。
特定の情報を表示するには
イベント
btnExamine_Click
の最初で、以下の変数を宣言します。Dim Attributes As FileAttribute Dim AttributeResult As String Dim LastAccess As Date Dim Length As Long Dim FirstLine As String Dim FinalString As String Dim ErrorMessage As String
GetAttr 関数は、ファイル、ディレクトリ、またはフォルダの属性を示す FileAttribute 列挙のメンバを返します。返される値は、列挙値の合計です。設定されている属性を確認するには、And 演算子を使用して、GetAttr によって返された値と必要なファイル属性の値とのビット比較を実行します。このアプリケーションではテキスト ファイルのみが調べられるので、ディレクトリやシステムなど、GetAttr によって返される可能性がある一部の値は無視してもかまいません。
ユーザーがファイルの属性を確認できるようにするには、イベント
btnExamine_Click
のEnd If
の後に次のコードを追加します。' 属性をチェックします。 If chkAttributes.Checked = True Then Attributes = GetAttr(thisFile) If Attributes = 2 Then AttributeResult = "ReadOnly" ElseIf Attributes = 32 Then AttributeResult = "Archive" ElseIf Attributes = 34 Then AttributeResult = "ReadOnly and Archive" Else AttributeResult = "Normal" End If ' 結果のメッセージ ボックスに追加します。 stringAttributes = "ファイル属性 : " FinalString = stringAttributes + AttributeResult + "." + _ vbCr End If
イベント
btnExamine_Click
に次のコードを追加します。' 前回のアクセス時刻をチェックします。 If chkLastAccess.checked = True Then LastAccess =
FileDateTime(thisFile)
End IfFileDateTime 関数は、ファイルの最終アクセス日時を確認します。返される日付の値は、ファイルの作成日時または最終変更日時を示します。
イベント
btnExamine_Click
に次のコードを追加します。' 長さをチェックします。 If chkFileLength.checked = True Then Length =
FileLen(thisFile)
End IfFileLen 関数はファイルの長さを確認し、ファイルの長さ (バイト単位) を示す長整数型 (long) の値を返します。
ユーザーがファイルの 1 行目を取得できるようにするには、イベント
btnExamine_Click
に次のコードを追加します。' 1 行目をチェックします。 If chkFirstLine.Checked = True Then Try FileOpen(1, thisFile, OpenMode.Input) FirstLine = (InputString(1, 80)) Catch ex As Exception ErrorMessage = "確認しようとしているファイルにエラーが 発生しています。テキスト ファイルが空でないことを 確認してください。" MsgBox (ErrorMessage) Exit Sub End Try FileClose(1) End If
結果を表示する
このアプリケーションの機能を完了させるため、収集した情報をメッセージ ボックスに表示します。
結果を表示するには
イベント
btnExamine_Click
の冒頭で、以下の変数を宣言し、開始します。Dim stringAttributes As String stringAttributes = "ファイルの属性 : " Dim stringLastAccess As String stringLastAccess = "前回のアクセス時刻 : " Dim stringLength As String stringLength = "ファイルの長さ (バイト単位) : " Dim strFirstLine As String strFirstLine = "最初の 80 文字 : "
次のコードを、
chkAttributes
チェック ボックスがオンになっているかどうかを確認するIf
ステートメントの最後のEnd If
の前に追加します。' 結果のメッセージ ボックスに追加します。 FinalString = stringAttributes + AttributeResult + "." + vbCr
次のコードを、
chkLastAccess
チェック ボックスがオンになっているかどうかを確認するIf
ステートメントの最後のEnd If
の前に追加します。' メッセージ ボックスに追加します。 FinalString = FinalString + stringLastAccess + LastAccess + "." _
- vbCr
次のコードを、
chkFileLength
チェック ボックスがオンになっているかどうかを確認するIf
ステートメントの最後のEnd If
の前に追加します。' メッセージ ボックスに追加します。 FinalString = FinalString + stringLength + CStr(Length) + "." _
- vbCr
次のコードを、
chkFirstLine
チェック ボックスがオンになっているかどうかを確認するIf
ステートメントの最後のEnd If
の前に追加します。' メッセージ ボックスに追加します。 FinalString = FinalString + strFirstLine + Firstline + vbCr
関数の最後の
End Sub
の前に、次のコードを追加します。If FinalString = "" Then MsgBox("チェック ボックスがオンになっていません。") Else MsgBox(FinalString) End If
結果を保存する
ユーザーは、ファイルの確認結果を保存することもできます。そのためには、ログ ファイルがあるかどうかを確認し (必要に応じて作成し)、ログ ファイルに結果を書き込むコードを追加します。
ログ ファイルを作成するには
イベント btnExamine_Click
の最後に、次のコードを追加します。
' 結果を保存する必要があるかどうかをチェックします。
If chkSave.Checked = True
Then
' ファイルがない場合、FileOpen を使用してファイルを作成します。
FileOpen(1, "log.txt", OpenMode.Append)
Writeline (1, finalString)
FileClose(1)
End If
アプリケーションをテストするには
選択したディレクトリに test.txt という名前のテキスト ファイルを作成し、1 行目に「これは、最初のファイルの 1 行目です。FileExplorer アプリケーションは、テキスト ファイルのみを参照します。」と入力します。同じディレクトリに test2.txt という名前の 2 つ目のテキスト ファイルを作成し、1 行目に「これは、2 つ目のファイルの 1 行目です。FileExplorer アプリケーションは、テキスト ファイルのみを参照します。」と入力します。
アプリケーションを起動します。
無効なパスを入力し、[送信] をクリックします。
"有効なパスを入力してください。別のドライブにアクセスする場合、ドライブを指定する必要があります。" というメッセージが表示されます。
test.txt が保存されているディレクトリへのパスを入力し、[送信] をクリックします。
lstFilePick リスト ボックスにテキスト ファイルが表示されます。
lstFilePick リスト ボックスで [test.txt] を選択します。チェック ボックスがすべてオンになっていることを確認し、[参照] をクリックします。
結果フォームに、ファイルの属性、前回のアクセス時刻、長さ、および最初の 80 文字が表示されます。
lstFilePick リスト ボックスで [test2.txt] を選択し、チェック ボックスをすべてオフにしてから [参照] をクリックします。
"チェック ボックスがオンになっていません。" というエラー メッセージが表示されます。
[属性] および [結果を保存する] をオンにし、[参照] をクリックします。
結果フォームに、ファイルの属性のみが表示されます。
FileExplorer を終了します。
[結果を保存する] チェック ボックスをオンにしたので、テキスト ファイルと同じディレクトリに log.txt という名前のログ ファイルが生成されています。
ログをチェックするには
- 現在のディレクトリで log.txt を開き、FileExplorer によって正しい情報が記録されていることを確認します。
結論
このウォークスルーでは、Visual Basic .NET のファイル I/O の基礎について説明しました。ただし、これは最初のレベルに過ぎません。ファイル、ディレクトリ、およびドライブを操作するコードを記述する場合、Visual Basic 固有のランタイム関数から離れて、Microsoft Visual Studio .NET のあらゆる言語に共通するクラスを提供する System.IO 名前空間を探索することができます。たとえば、ディレクトリやファイルが変更されたときにイベントを発生させる FileSystemWatcher クラスがあります。詳細については、「入出力操作」 を参照してください。