次の方法で共有


ウォークスルー : 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 というアプリケーションを作成します。このアプリケーションでは、ディレクトリの参照、ディレクトリ内のファイルに関する情報の確認と表示、およびログ ファイルへの情報の書き込みを行うことができます。アプリケーションが完成したら、プログラムによるファイルの選択、そのファイルに関する情報の抽出、およびログ ファイルへの情報の書き込みが可能になります。

アプリケーションを作成する

プロジェクトを開始するには、ユーザーによるディレクトリの選択、ディレクトリ内のファイルの選択、およびそのファイルについて抽出する情報の選択を行うことができるフォームを作成します。

プロジェクトを作成するには

  1. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

    [新しいプロジェクト] ダイアログ ボックスが表示されます。

  2. [プロジェクトの種類] ペインで [Visual Basic プロジェクト] をクリックします。次に、[テンプレート] ペインで [Windows アプリケーション] をクリックします。

  3. [名前] ボックスに「FileExplorer」と入力して、プロジェクト名を設定します。

    Visual Studio® によってプロジェクトがソリューション エクスプローラに追加され、Windows® フォーム デザイナが開きます。

  4. 次の表のコントロールをフォームに追加し、プロパティに対応する値を設定します。

    オブジェクト プロパティ
    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 関数を使用して現在のパスを示す文字列を返し、表示します。

現在のディレクトリを返すには

  1. txtDirectory テキスト ボックスに現在の場所を表示するには、次のコードを Form1_Load に追加します。

    txtDirectory.Text = CurDir()

  2. プログラムを実行して、CurDir 関数が正しいパスを返すかどうかを確認します。

    txtDirectory テキスト ボックスに現在のディレクトリが表示されます。

ディレクトリを変更する

別のディレクトリにあるファイルを選択する場合は、ChDir 関数を使用してディレクトリを切り替えます。別のディレクトリに変更するには、ユーザーは txtDirectory テキスト ボックスに新しいパスを入力します。

ディレクトリを変更するには

  • 次のコードを btnSubmit_Click に追加します。
    Dim NewPath As String
    ' NewPath には、ユーザーが入力したパスが格納されます。
    NewPath = txtDirectory.Text
    ' 場所を NewPath に変更します。
    ChDir(NewPath)

有効なパスの入力を確認する

ChDir 関数には Path パラメータが必要です。ドライブを指定することもできますが、指定しなくてもかまいません。パスでドライブが指定されていない場合、ChDir は現在のドライブを使用します。混乱を回避するために、Try...Catch ステートメントを組み込んで、パスが指定されないことによって発生する例外をキャッチします。

有効なパスを確保するには

  1. イベント btnSubmit_Click のコード行 Dim NewPath As String の後の新しい行に、Dim ErrorMessage As String を追加します。

  2. コード行 ChDir(NewPath) の前に、次のように Try ステートメントの行を追加します。

         Try

  3. コード行 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 関数を呼び出した場合、前の一致したパターンがそのまま残されるという事実を利用しています。

ディレクトリの内容を表示するには

  1. イベント btnSubmit_Click の最初に Dim ContentItem As String を挿入します。

  2. コード行 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) をオンまたはオフにして、結果をカスタマイズできます。

特定の情報を表示するには

  1. イベント 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 によって返される可能性がある一部の値は無視してもかまいません。

  2. ユーザーがファイルの属性を確認できるようにするには、イベント btnExamine_ClickEnd 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

  3. イベント btnExamine_Click に次のコードを追加します。

         ' 前回のアクセス時刻をチェックします。
    If chkLastAccess.checked = True Then
    LastAccess = FileDateTime(thisFile)
    End If

    FileDateTime 関数は、ファイルの最終アクセス日時を確認します。返される日付の値は、ファイルの作成日時または最終変更日時を示します。

  4. イベント btnExamine_Click に次のコードを追加します。

         ' 長さをチェックします。
    If chkFileLength.checked = True Then
    Length = FileLen(thisFile)
    End If

    FileLen 関数はファイルの長さを確認し、ファイルの長さ (バイト単位) を示す長整数型 (long) の値を返します。

  5. ユーザーがファイルの 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

結果を表示する

このアプリケーションの機能を完了させるため、収集した情報をメッセージ ボックスに表示します。

結果を表示するには

  1. イベント btnExamine_Click の冒頭で、以下の変数を宣言し、開始します。

         Dim stringAttributes As String
    stringAttributes = "ファイルの属性 : "
    Dim stringLastAccess As String
    stringLastAccess = "前回のアクセス時刻 : "
    Dim stringLength As String
    stringLength = "ファイルの長さ (バイト単位) : "
    Dim strFirstLine As String
    strFirstLine = "最初の 80 文字 : "

  2. 次のコードを、chkAttributes チェック ボックスがオンになっているかどうかを確認する If ステートメントの最後の End If の前に追加します。

         ' 結果のメッセージ ボックスに追加します。
    FinalString = stringAttributes + AttributeResult + "." + vbCr

  3. 次のコードを、chkLastAccess チェック ボックスがオンになっているかどうかを確認する If ステートメントの最後の End If の前に追加します。

         ' メッセージ ボックスに追加します。
    FinalString = FinalString + stringLastAccess + LastAccess + "." _

    • vbCr
  4. 次のコードを、chkFileLength チェック ボックスがオンになっているかどうかを確認する If ステートメントの最後の End If の前に追加します。

         ' メッセージ ボックスに追加します。
    FinalString = FinalString + stringLength + CStr(Length) + "." _

    • vbCr
  5. 次のコードを、chkFirstLine チェック ボックスがオンになっているかどうかを確認する If ステートメントの最後の End If の前に追加します。

         ' メッセージ ボックスに追加します。
    FinalString = FinalString + strFirstLine + Firstline + vbCr

  6. 関数の最後の 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

アプリケーションをテストするには

  1. 選択したディレクトリに test.txt という名前のテキスト ファイルを作成し、1 行目に「これは、最初のファイルの 1 行目です。FileExplorer アプリケーションは、テキスト ファイルのみを参照します。」と入力します。同じディレクトリに test2.txt という名前の 2 つ目のテキスト ファイルを作成し、1 行目に「これは、2 つ目のファイルの 1 行目です。FileExplorer アプリケーションは、テキスト ファイルのみを参照します。」と入力します。

  2. アプリケーションを起動します。

  3. 無効なパスを入力し、[送信] をクリックします。

    "有効なパスを入力してください。別のドライブにアクセスする場合、ドライブを指定する必要があります。" というメッセージが表示されます。

  4. test.txt が保存されているディレクトリへのパスを入力し、[送信] をクリックします。

    lstFilePick リスト ボックスにテキスト ファイルが表示されます。

  5. lstFilePick リスト ボックスで [test.txt] を選択します。チェック ボックスがすべてオンになっていることを確認し、[参照] をクリックします。

    結果フォームに、ファイルの属性、前回のアクセス時刻、長さ、および最初の 80 文字が表示されます。

  6. lstFilePick リスト ボックスで [test2.txt] を選択し、チェック ボックスをすべてオフにしてから [参照] をクリックします。

    "チェック ボックスがオンになっていません。" というエラー メッセージが表示されます。

  7. [属性] および [結果を保存する] をオンにし、[参照] をクリックします。

    結果フォームに、ファイルの属性のみが表示されます。

  8. FileExplorer を終了します。

[結果を保存する] チェック ボックスをオンにしたので、テキスト ファイルと同じディレクトリに log.txt という名前のログ ファイルが生成されています。

ログをチェックするには

  • 現在のディレクトリで log.txt を開き、FileExplorer によって正しい情報が記録されていることを確認します。

結論

このウォークスルーでは、Visual Basic .NET のファイル I/O の基礎について説明しました。ただし、これは最初のレベルに過ぎません。ファイル、ディレクトリ、およびドライブを操作するコードを記述する場合、Visual Basic 固有のランタイム関数から離れて、Microsoft Visual Studio .NET のあらゆる言語に共通するクラスを提供する System.IO 名前空間を探索することができます。たとえば、ディレクトリやファイルが変更されたときにイベントを発生させる FileSystemWatcher クラスがあります。詳細については、「入出力操作」 を参照してください。