チュートリアル: .NET Framework のメソッドによるファイル操作 (Visual Basic)

このチュートリアルでは、StreamReader クラスを使用してファイルを開いて読み取り、ファイルがアクセスされているかどうかをチェックし、StreamReader クラスのインスタンスを使用したファイル読み取り内の文字列を検索し、StreamWriter クラスを使用してファイルにデータを書き込む方法について説明します。

注意

次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「IDE をカスタマイズする」をご覧ください。

アプリケーションの作成

Visual Studio を起動し、ユーザーが指定のファイルへの書き込みに使用できるフォームを作成して、プロジェクトを開始します。

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

  1. [ファイル] メニューの [新しいプロジェクト] を選択します。

  2. [新しいプロジェクト] ペインで、[Windows アプリケーション] をクリックします。

  3. [名前] ボックスに MyDiary と入力して、[OK] をクリックします。

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

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

オブジェクト プロパティ Value
Button 名前

Text
Submit

エントリの送信
Button 名前

Text
Clear

エントリのクリア
TextBox 名前

Text

Multiline
Entry

テキストを入力してください。

False

ファイルへの書き込み

アプリケーションを通じてファイルに書き込む機能を追加するには、StreamWriter クラスを使用します。 StreamWriter は、特定のエンコードでの文字出力用に設計されています。これに対し Stream クラスは、バイト入出力用に設計されています。 標準のテキスト ファイルに複数行の情報を書き込む場合には、StreamWriter を使用します。 StreamWriter クラスの詳細については、「StreamWriter」をご覧ください。

書き込み機能を追加するには

  1. [表示] メニューの [コード] を選択してコード エディターを開きます。

  2. アプリケーションで System.IO 名前空間を参照するので、コードの先頭、つまりフォームのクラス宣言 (Public Class Form1 で始まるブロック) よりも前に、次のステートメントを追加します。

    Imports System.IO
    

    ファイルへの書き込みを行う前に、StreamWriter クラスのインスタンスを作成する必要があります。

  3. [表示] メニューの [デザイナー] を選択して、Windows フォーム デザイナーに戻ります。 Submit ボタンをダブルクリックして、ボタンの Click イベント ハンドラーを作成し、次のコードを追加します。

    Dim fw As StreamWriter
    

注意

Visual Studio 統合開発環境 (IDE) の画面がコード エディターに戻り、コードを追加するイベント ハンドラー内にカーソルが配置されます。

  1. ファイルへの書き込みを行うには、StreamWriter クラスの Write メソッドを使用します。 Dim fw As StreamWriter の直後に次のコードを追加します。 ファイルが見つからない場合に例外がスローされることを心配する必要はありません。ファイルまだ存在しない場合は、新規に作成されます。

    Dim ReadString As String
    Try
        'Pass the file path and name to the StreamWriter constructor.
        'Indicate that Append is True, so file will not be overwritten.
        fw = New StreamWriter("C:\MyDiary.txt", True)
        ReadString = Entry.Text
        fw.WriteLine(ReadString)
    Finally
        'Close the file.
        fw.Close()
    End Try
    
  2. ユーザーが空のエントリを送信しないよう、Dim ReadString As String の直後に次のコードを追加します。

    If (Entry.Text = "" Or Entry.Text = "Please enter something.") Then
        Entry.Text = "Please enter something."
        Return
    End If
    
  3. これは日記なので、ユーザーが各エントリに日付を割り当てられようにする必要があります。 fw = New StreamWriter("C:\MyDiary.txt", True) の後に次のコードを挿入して、変数 Today を現在の日付に設定します。

    Dim Today As DateTime
    Today = Now
    fw.Write(CStr(Today))
    fw.Write(ControlChars.CrLf)
    
  4. 最後に、TextBox をクリアするためのコードを追加します。 Clear ボタンの Click イベントに次のコードを追加します。

    Entry.Text = ""
    

日記に表示機能を追加する

このセクションでは、DisplayEntryTextBox に最新のエントリを表示する機能を追加します。 ComboBox を追加することも可能で、これでさまざまなエントリを表示したり、DisplayEntryTextBox に表示するエントリをユーザーが選択できるようにしたりできます。 StreamReader クラスのインスタンスは、MyDiary.txt からデータを読み取ります。 StreamWriter クラスと同様、StreamReader はテキスト ファイル用です。

チュートリアルのこのセクション用に、次の表にあるコントロールをフォームに追加し、それらのプロパティに対応する値を設定します。

コントロール Properties
TextBox 名前

[表示]

[サイズ]

Multiline
DisplayEntry

False

120,60

True
Button 名前

Text
Display

ディスプレイ
Button 名前

Text
GetEntries

エントリの取得
ComboBox 名前

Text

Enabled
PickEntries

エントリの選択

False

コンボ ボックスを設定するには

  1. PickEntriesComboBox は、ユーザーが各エントリを送信する日付を表示するために使用されます。これにより、ユーザーが特定の日付からエントリを選択できるようになります。 GetEntries ボタンの Click イベント ハンドラーを作成し、次のコードを追加します。

    Dim fr As StreamReader = Nothing
    Dim FileString As String
    FileString = ""
    Try
        fr = New System.IO.StreamReader("C:\MyDiary.txt")
        PickEntries.Items.Clear()
        PickEntries.Enabled = True
        Do
            FileString = fr.ReadLine
            If IsDate(FileString) Then
                PickEntries.Items.Add(FileString)
            End If
        Loop Until (FileString Is Nothing)
    Finally
        If fr IsNot Nothing Then
            fr.Close()
        End If
    End Try
    PickEntries.Enabled = True
    
  2. コードをテストするには、F5 キーを押してアプリケーションをコンパイルし、[エントリの取得] をクリックします。 ComboBox でドロップダウンの矢印をクリックして、エントリの日付を表示します。

個別のエントリを選択して表示するには

  1. Display ボタンの Click イベント ハンドラーを作成し、次のコードを追加します。

    Dim fr As StreamReader
    Dim ReadString As String
    'Make sure ReadString begins empty.
    ReadString = ""
    Dim FileString As String
    fr = New StreamReader("C:\MyDiary.txt")
    'If no entry has been selected, show the whole file.
    If PickEntries.Enabled = False Or PickEntries.SelectedText Is Nothing Then
        Do
            'Read a line from the file into FileString.
            FileString = fr.ReadLine
            'add it to ReadString
            ReadString = ReadString & ControlChars.CrLf & FileString
        Loop Until (FileString = Nothing)
    Else
        'An entry has been selected, find the line that matches.
        Do
    
            FileString = fr.ReadLine
        Loop Until FileString = CStr(PickEntries.SelectedItem)
        FileString = CStr(PickEntries.SelectedItem) & ControlChars.CrLf
        ReadString = FileString & fr.ReadLine
    
        'Read from the file until EOF or another Date is found.
        Do Until ((fr.Peek < 0) Or (IsDate(fr.ReadLine)))
            ReadString = ReadString & fr.ReadLine
        Loop
    End If
    fr.Close()
    DisplayEntry.Visible = True
    DisplayEntry.Text = ReadString
    
  2. コードをテストするには、F5 キーを押してアプリケーションをコンパイルし、エントリを送信をクリックします。 [Get Entries] (エントリの取得) をクリックし、ComboBox からエントリを選択して、[表示] をクリックします。 選択したエントリのコンテンツが、DisplayEntryTextBox に表示されます。

ユーザーがエントリの削除や変更を行えるようにする

ユーザーが DeleteEntry ボタンと EditEntry ボタンを使用してエントリを削除したり変更したりできる機能を追加できます。 どちらのボタンも、エントリが表示されているとき以外は無効になります。

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

コントロール Properties
Button 名前

Text

Enabled
DeleteEntry

エントリの削除

False
Button 名前

Text

Enabled
EditEntry

エントリの編集

False
Button 名前

Text

Enabled
SubmitEdit

編集結果の送信

False

エントリの削除と変更を有効にするには

  1. Display ボタンの Click イベント (DisplayEntry.Text = ReadString の後) に、次のコードを追加します。

    DeleteEntry.enabled = True
    
  2. DeleteEntry ボタンの Click イベント ハンドラーを作成し、次のコードを追加します。

    Dim fr As StreamReader
    Dim ReadString As String
    Dim WriteString As String
    Dim ConfirmDelete As MsgBoxResult
    fr = New StreamReader("C:\MyDiary.txt")
    ReadString = fr.ReadLine
    ' Read through the textfile
    Do Until (fr.Peek < 0)
        ReadString = ReadString & vbCrLf & fr.ReadLine
    Loop
    WriteString = Replace(ReadString, DisplayEntry.Text, "")
    fr.Close()
    ' Check to make sure the user wishes to delete the entry
    ConfirmDelete = MsgBox("Do you really wish to delete this entry?",
      MsgBoxStyle.OKCancel)
    If ConfirmDelete = MsgBoxResult.OK Then
        File.Delete("C:\MyDiary.txt")
        Dim fw As StreamWriter = File.CreateText("C:\MyDiary.txt")
        fw.WriteLine(WriteString)
        fw.Close()
        ' Reset controls on the form
        DisplayEntry.Text = ""
        PickEntries.Text = ""
        PickEntries.Items.Clear()
        PickEntries.Enabled = False
        DeleteEntry.Enabled = False
    End If
    
  3. ユーザーがエントリを表示すると、EditEntry ボタンが有効になります。 Display ボタンの Click イベント (DisplayEntry.Text = ReadString の後) に、次のコードを追加します。

    EditEntry.Enabled = True
    
  4. EditEntry ボタンの Click イベント ハンドラーを作成し、次のコードを追加します。

    Entry.Text = DisplayEntry.Text
    SubmitEdit.Enabled = True
    
  5. SubmitEdit ボタンの Click イベント ハンドラーを作成し、次のコードを追加します。

    Dim fr As StreamReader
    Dim ReadString As String
    Dim WriteString As String
    If Entry.Text = "" Then
        MsgBox("Use Delete to Delete an Entry")
        Return
    End If
    fr = New StreamReader("C:\MyDiary.txt")
    ReadString = fr.ReadLine
    Do Until (fr.Peek < 0)
        ReadString = ReadString & vbCrLf & fr.ReadLine
    Loop
    WriteString = Replace(ReadString, DisplayEntry.Text, Entry.Text)
    fr.Close()
    File.Delete("C:\MyDiary.txt")
    Dim fw As StreamWriter = File.CreateText("C:\MyDiary.txt")
    fw.WriteLine(WriteString)
    fw.Close()
    DisplayEntry.Text = Entry.Text
    Entry.Text = ""
    EditEntry.Enabled = False
    SubmitEdit.Enabled = False
    

コードをテストするには、F5 キーを押してアプリケーションをコンパイルします。 [エントリの取得] をクリックし、エントリを選択して、[表示] をクリックします。 DisplayEntryTextBox にエントリが表示されます。 [エントリの編集] をクリックします。 EntryTextBox にエントリが表示されます。 EntryTextBox でエントリを編集し、[Submit Edit] (編集結果の送信) をクリックします。 MyDiary.txt ファイルを開いて修正結果を確認します。 確認したら、エントリを選択し、[エントリの削除] をクリックします。 MessageBox で確認を求められたら、[OK] をクリックします。 アプリケーションを閉じ、MyDiary.txt を開いて削除を確認します。

関連項目