こんにちは、ENGかぴです。
VB.NET(Visual Basic 2022)でファイルを作成することで設定項目やアプリの動作履歴(ログ)を保存することができます。テキストファイルを生成してログを保存する方法とファイルを読み込む方法をまとめました。
設定項目など小規模のデータを保存する方法を下記記事にまとめています。
VB.NET(VB2022)で設定項目を保存して読み出す方法
ファイルを生成して保存する方法は動作履歴(ログ)など容量の大きくなりがちなデータの保存に適した方法です。
Windowsフォームアプリケーション(.NETFramework)を対象としています。以下はVisual Basic 2022をVB2022とします。
VB.NET(VB2022)のデスクトップアプリで動作確認したことを下記リンクにまとめています。
VB.NET(VB2022)のデスクトップアプリ開発でできること
ログの保存を確認するアプリ
発生したイベント毎にアプリの動作履歴をログとして保存します。イベントが発生するとファイルを開いて発生したイベントの内容とComboBox1及びListBoxの選択項目を保存します。保存するログは以下の通りです。
- ComboBox1の選択項目を変更
- ListBox1の選択項目を変更
- ボタン1~ボタン3をクリック
- 履歴のクリアをクリック
- アプリが起動した(フォームを読み込んだ)時
- アプリを停止した(フォームを閉じた)時
本記事ではアプリのプロジェクトファイルが存在している場所の直下に「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言語開発環境の作り方までをまとめています。
PR:無料トライアル実施中【PC専用】AIスライド資料作成ツールの利用:イルシル
最後まで、読んでいただきありがとうございました。