PR

VB.NET(VB2022)でファイルを作成してログを保存する方法

VB.NET
本記事はプロモーションが含まれています。

こんにちは、ENGかぴです。

VB.NET(Visual Basic 2022)でファイルを作成することで設定項目やアプリの動作履歴(ログ)を保存することができます。テキストファイルを生成してログを保存する方法とファイルを読み込む方法をまとめました。

設定項目など小規模のデータを保存する方法を下記記事にまとめています。

VB.NET(VB2022)で設定項目を保存して読み出す方法

ファイルを生成して保存する方法は動作履歴(ログ)など容量の大きくなりがちなデータの保存に適した方法です。

Windowsフォームアプリケーション(.NETFramework)を対象としています。以下はVisual Basic 2022をVB2022とします。

VB.NET(VB2022)のデスクトップアプリで動作確認したことを下記リンクにまとめています。

VB.NET(VB2022)のデスクトップアプリ開発でできること

ログの保存を確認するアプリ

ログの保存を確認するアプリ
ログの保存を確認するアプリ

発生したイベント毎にアプリの動作履歴をログとして保存します。イベントが発生するとファイルを開いて発生したイベントの内容とComboBox1及びListBoxの選択項目を保存します。保存するログは以下の通りです。

  1. ComboBox1の選択項目を変更
  2. ListBox1の選択項目を変更
  3. ボタン1~ボタン3をクリック
  4. 履歴のクリアをクリック
  5. アプリが起動した(フォームを読み込んだ)時
  6. アプリを停止した(フォームを閉じた)時

本記事ではアプリのプロジェクトファイルが存在している場所の直下に「LoadFile」のフォルダを作成してログのファイルを保存します。デバッグの場合はプロジェクトファイルのフォルダから見て\bin\Debug内に保存します。

ログの確認は「読み込み」をクリックするとログのファイルを開いてテキストボックスにログを表示します。

「履歴のクリア」をクリックするとログを削除した後に履歴をクリアしたことを示すログ(クリアなのでログを残さない考えもあります)を残します。

「クリア」をクリックするとTextBoxの表示をクリアします。

「ボタン1」、「ボタン2」、「ボタン3」をクリックするとボタンを押したログを残します。

スポンサーリンク

コントロールの実装

コントロールの配置
コントロールの配置

Form1.vb[デザイン]にGroupBox、ComboBox、ListBox、TextBox、Buttonのコントロールを追加します。Form1を任意の名称に変更している場合はForm1を変更した名前に置き換えて下さい。

コントロールはツールボックスのすべてのWindowsフォームまたはカテゴリを選択して追加します。GroupBoxはコンテナーのカテゴリに含まれており、ComboBox、ListBox、TextBox、Buttonはコモンコントロールのカテゴリに含まれています。

最初にGroupBoxを配置します。ツールボックスのGroupBoxを選択するとForm1内でマウスのポインタがGroupBoxのアイコンなります。この状態で左クリックするとGroupBoxが配置できます。また左クリックを維持したままマウスのポインタを操作することでサイズを調整しながら配置することができます。

左クリックである程度のサイズで配置しプロパティを指定して微調整すると効率よく配置できます。

同様にしてGroupBox内にComboBox1、ListBox1、TextBox1、Button1~6を配置します。

GroupBox1のTextプロパティを「操作盤」に変更します。Button1~6のTextプロパティを「ボタン1」「ボタン2」「ボタン3」「クリア」「読み込み」「履歴のクリア」に変更します。

PR:スキマ時間を有効に!スマホで学べる人気のオンライン資格講座【スタディング】まずは気になる講座を無料で体験しよう!

ファイルを開いてログを保存する

Private Sub SaveFile()
    Dim FileName As String = My.Application.Info.DirectoryPath & "\LoadFile\save.txt"
    Dim f_write As IO.StreamWriter

    f_write = New IO.StreamWriter(FileName, True, System.Text.Encoding.UTF8)
    'f_write = New IO.StreamWriter(FileName, True, System.Text.Encoding.GetEncoding("shift_jis"))
    f_write.Write(Date.Now & ",")
    f_write.Write("Button1がクリックされました。"& ",")
    f_write.Write(ComboBox1.Text & ",")
    f_write.WriteLine(ListBox1.Text)
    f_write.Close()
End Sub

ファイルを開いてログを保存するためにネームスペースSystem.IOを使用します。StreamWriterクラスの初期化で引数を指定してインスタンス化します。インスタンス化するとファイルが開くのでf_writeオブジェクトを使用してファイルを操作します。

第1引数にファイルを保存するパス(場所)を指定します。ファイルが存在しない場合はアプリがファイルを生成します。例はアプリのexeファイルの場所の直下にLoadFileフォルダを生成しsave.txtのファイル(save.csvにするとcsvファイルになります)を生成する指定です。

第2引数はファイルを上書きするか内容を追加して書き込むかを指定します。Trueを指定すると内容を追加して書き込みます。

第3引数は保存するテキストのエンコード(文字コード)を指定します。例ではUTF-8を指定しています。Shift-JISを指定したい場合はSystem.TextのEncodingクラスのGetEncoding()メソッドで”shift_jis”を指定します。

f_writeオブジェクト(StreamWriterクラス)のWrite()メソッドの引数に書き込む文字列や数値を指定します。例のように文字列の区切りに”,”を入れてCSVファイルで開いた場合にセルを分割して表示できるようにします。

ListBox1のTextプロパティの書き込みにWriteLine()メソッドを使用することで文字列の最後尾に改行コードを追加し、1行分のログのデータの生成を終了します。

最後にClose()メソッドをf_openオブジェクトで開いているファイルを閉じます。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    SaveFile()
End Sub

Button1のクリックイベントでSaveFile()をコールするとファイルを開きログを追加することができます。他のイベントも同様にしてクリックイベントのログやアプリの起動、アプリを閉じた時のログなどを追加することができます。

広告
マイベスト3年連続1位を獲得した実績を持つ実践型のプログラミングスクール

ファイルを開いてログを読み込む

Private Sub LoadFile()
    Dim FileName As String = My.Application.Info.DirectoryPath & "\LoadFile\save.txt"
    Dim str As String = ""
    Dim f_open As IO.StreamReader

    Try
        f_open = New IO.StreamReader(FileName, System.Text.Encoding.UTF8)

        Do Until f_open.EndOfStream
            str = f_open.ReadLine
            TextBox1.Text &= str & vbCrLf
        Loop

        f_open.Close()
    Catch ex As Exception

    End Try
End Sub

ファイルを開いてデータを読み込むためにネームスペースSystem.IOを使用します。StreamReaderクラスに引数を指定して初期化してインスタンス化した結果をf_openオブジェクトに格納してファイルを操作します。

第1引数にファイルを保存するパス(場所)を指定します。

第2引数は保存するテキストのエンコード(文字コード)を指定します。ファイルを保存した時と同様のエンコードを指定します。例ではUTF-8を指定しています。

StreamReaderクラスのEndOfStreamプロパティはファイルの文末を判断します。文字列が存在する場合はFalseになるのでDo Until~Loopで文末になるまでループさせます。(ループさせるのが目的なのでWhileやDo whileなどでもよいです)

While f_open.EndOfStream = False
    str = f_open.ReadLine
    TextBox1.Text &= str & vbCrLf
End While

Whileで読み込む場合はDo Until~Loopと条件が反対になるためEndOfStreamプロパティがFalseであればループするようにします。

ファイルの内容はRead()メソッドで読み出すことができます。Readline()メソッドを使用すると改行コードまでの文字列を読み込むことができます。

ログのデータは改行コードを入れて1行になるように保存(書き込んでいる)のでReadline()メソッドで1件のログが取得できます。取得した文字列をTextBox1のTextプロパティに指定して表示します。

ファイルの読み込みが終わったら、Close()メソッドでファイルを閉じます。

ファイルを開いてログをクリアする

Private Sub ClearFile()
    Dim FileName As String = My.Application.Info.DirectoryPath & "\LoadFile\save.txt"
    Dim f_write As IO.StreamWriter

    f_write = New IO.StreamWriter(FileName, False, System.Text.Encoding.UTF8)
    f_write.Close()
End Sub

ログのクリアは上書きを許可してファイルを開いて行います。StreamWriter()で初期化してインスタンス化の仕方はファイルを開いて保存すると同様ですが、ファイルの上書きを許可するため第2引数をFalseにします。

ファイルを開いた後、Write()メソッドで何も書き込まない状態でClose()メソッドでファイルを閉じると空のデータで上書きされるためファイルのログがクリアできます。

スポンサーリンク

動作確認(デバッグ)

デバッグは実際のアプリケーションの動作を模擬して実行するものです。デバッグの開始はエディタ上部の「▶開始」をクリックすると開始します。

動作確認の結果
動作確認の結果

デバッグを開始するとComboBox1とListBox1に初期の選択肢が表示します。ComboBox1を変更すると「ComboBoxが選択されました。」のログを残します。ListBox1を変更すると「ListBoxが選択されました。」のログを残します。

「ボタン1」をクリックすると「Button1がクリックされました。」のログを残します。ボタン2、ボタン3もButton番号以外は同様のログを残します。

アプリを起動した時は「アプリを起動しました。」のログを残します。アプリを閉じると「アプリを閉じました。」のログを残します。

「履歴のクリア」をクリックするとログをクリアして、「履歴をクリアしました。」のログを残します。

「クリア」をクリックするとTextBox1の表示をクリアします。「読み込み」をクリックするとログを読み込みTextBox1に表示します。動作確認の結果の通り「読み込み」によりイベントのログが確認できました。

コードのデバッグを行う場合は、コードエディタでブレークポイントを置くことで一時的にプログラムを停止させることができます。

ブレークポイントでデバッグする方法
ブレークポイントでデバッグする方法

ブレークポイントはコードエディターの最左部分をクリックして●マークが表示されれば設置できています。例ではButton1がクリックされた時に発生したイベントの先頭部分にブレークポイントを置いています。この状態でButton1をクリックするとブレークポイントでプログラムが一時停止します。

F11を押すとステップ実行になるため1行ずつ内容を確認しながらデバッグを行うことができます。上部の「▶続行(C)」をクリックするとブレークポイント状態から通常の動作に復帰します。

PR:(即戦力のスキルを身に着ける:DMM WEBCAMP 学習コース(はじめてのプログラミングコース))

ソースコード全体

以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。

Public Class Form1

    Dim fname As String = "\save.txt"
    Dim initflg As Boolean = True

    Enum HIST
        HIST_BUTTON1 = 0
        HIST_BUTTON2
        HIST_BUTTON3
        HIST_COMBOBOX1
        HIST_LISTBOX
        HIST_START
        HIST_CLOSE
        HIST_CLEAR
    End Enum

    Private Sub SaveFile(no As HIST)
        Dim FileName As String = My.Application.Info.DirectoryPath & "\LoadFile" & fname
        Dim f_write As IO.StreamWriter
        Dim str As String

        f_write = New IO.StreamWriter(FileName, True, System.Text.Encoding.UTF8)
        'f_write = New IO.StreamWriter(FileName, True, System.Text.Encoding.GetEncoding("shift_jisJIS"))
        Select Case no
            Case HIST.HIST_BUTTON1
                str = "Button1がクリックされました。"
            Case HIST.HIST_BUTTON2
                str = "Button2がクリックされました。"
            Case HIST.HIST_BUTTON3
                str = "Button1がクリックされました。"
            Case HIST.HIST_COMBOBOX1
                str = "ComboBoxが選択されました。"
            Case HIST.HIST_LISTBOX
                str = "ListBoxが選択されました。"
            Case HIST.HIST_START
                str = "アプリを起動しました。"
            Case HIST.HIST_CLOSE
                str = "アプリを閉じました。"
            Case HIST.HIST_CLEAR
                str = "履歴をクリアしました。"
            Case Else
                str = "範囲外"
        End Select

        f_write.Write(Date.Now & ",")
        f_write.Write(str & ",")
        f_write.Write(ComboBox1.Text & ",")
        f_write.WriteLine(ListBox1.Text)
        f_write.Close()

    End Sub

    Private Sub LoadFile()
        Dim FileName As String = My.Application.Info.DirectoryPath & "\LoadFile" & fname
        Dim str As String = ""
        Dim f_open As IO.StreamReader

        Try
            f_open = New IO.StreamReader(FileName, System.Text.Encoding.UTF8)

            Do Until f_open.EndOfStream
                str = f_open.ReadLine
                TextBox1.Text &= str & vbCrLf
            Loop

            'While f_open.EndOfStream = False
            '    str = f_open.ReadLine
            '    TextBox1.Text &= str & vbCrLf
            'End While

            f_open.Close()
        Catch ex As Exception

        End Try

    End Sub

    Private Sub ClearFile()
        Dim FileName As String = My.Application.Info.DirectoryPath & "\LoadFile" & fname
        Dim f_write As IO.StreamWriter

        f_write = New IO.StreamWriter(FileName, False, System.Text.Encoding.UTF8)
        f_write.Close()
    End Sub

    Private Sub Form1_Closed(sender As Object, e As EventArgs) Handles Me.Closed

        SaveFile(HIST.HIST_CLOSE)
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        ControlInit()
        SaveFile(HIST.HIST_START)
        Timer1.Enabled = True
    End Sub

    Private Sub ControlInit()

        ListBox1.Items.Add("選択肢1")
        ListBox1.Items.Add("選択肢2")
        ListBox1.Items.Add("選択肢3")
        ListBox1.Items.Add("選択肢4")
        ListBox1.SelectedIndex = 2

        ComboBox1.Items.Add("Test1")
        ComboBox1.Items.Add("Test2")
        ComboBox1.Items.Add("Test3")
        ComboBox1.Items.Add("Test4")
        ComboBox1.Text = "Test1"

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        SaveFile(HIST.HIST_BUTTON1)
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        SaveFile(HIST.HIST_BUTTON2)
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        SaveFile(HIST.HIST_BUTTON3)
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        If initflg = False Then
            SaveFile(HIST.HIST_COMBOBOX1)
        End If
    End Sub

    Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
        If initflg = False Then
            SaveFile(HIST.HIST_LISTBOX)
        End If
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        TextBox1.Clear()
    End Sub

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        LoadFile()
    End Sub

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
        ClearFile()
        SaveFile(HIST.HIST_CLEAR)
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Timer1.Enabled = False
        initflg = False
    End Sub
End Class

コントロールの番号やイベントハンドラーなどのプロパティ名などを変更している場合はソースコードのイベントハンドラーをお使いのイベントハンドラーに置き換えてください。

Timer1は初期化時にComboBox1とListBox1のSelectedIndexChangedイベントによるログの保存を防止するために使用しています。Timerの使用方法は下記記事を参考にしてください。

VB.NET(VB2022)のタイマーの実装とイベントの追加方法

本記事では固定した場所にログのファイルを保存していますが、このファイルをダイヤログを使用して保存場所やファイル名を指定する方法を下記記事にまとめています。

VB.NET(VB2022)でファイルの名前を付けて保存する方法

関連リンク

VB.NET(VB2022)のデスクトップアプリで動作確認したことを下記リンクにまとめています。

VB.NET(VB2022)のデスクトップアプリ開発でできること

マイクロソフトはVisual Studio以外にもVSCodeという便利なエディターを提供しています。下記リンクではVSCodeのインストールの仕方からC言語開発環境の作り方までをまとめています。

VSCodeをインストールしてC/C++の開発環境を作る

PR:無料トライアル実施中【PC専用】AIスライド資料作成ツールの利用:イルシル

最後まで、読んでいただきありがとうございました。

タイトルとURLをコピーしました