パスを組み立てる
このページの例では、Program.vbの先頭(Moduleより前)に次のImportsを書きます。Path.Combineを使うと、OSごとの区切り文字を意識せずにパスを作れます。
必要なImportsVISUAL BASIC
Imports System.IO
Imports System.Text
Imports System.Text.Jsondataフォルダーを作るVISUAL BASIC
Dim dataDirectory As String = Path.Combine(Environment.CurrentDirectory, "data")
Directory.CreateDirectory(dataDirectory)
Dim filePath As String = Path.Combine(dataDirectory, "memo.txt")
Console.WriteLine(filePath)テキストを読み書きする
少量のテキストは一度に保存・読み込みできます。UTF-8を明示すると文字コードの意図が伝わります。
保存と読み込みVISUAL BASIC
Dim path As String = "memo.txt"
File.WriteAllText(path, "1行目" & Environment.NewLine & "2行目", Encoding.UTF8)
Dim text As String = File.ReadAllText(path, Encoding.UTF8)
Console.WriteLine(text)実行結果OUTPUT
1行目
2行目大きなファイルはStreamReaderで一行ずつ読みます。Usingブロックを使えば、途中で例外が起きてもファイルが閉じられます。
CSVを扱う
CSVには値の中のカンマや引用符という規則があります。単純なSplit(",")ではなく、Visual Basicから使えるTextFieldParserで読みます。
scores.csvを読むVISUAL BASIC
Using parser As New FileIO.TextFieldParser("scores.csv", Encoding.UTF8)
parser.TextFieldType = FileIO.FieldType.Delimited
parser.SetDelimiters(",")
parser.ReadFields() ' 見出しを読み飛ばす
While Not parser.EndOfData
Dim fields() As String = parser.ReadFields()
Console.WriteLine($"{fields(0)}: {fields(1)}点")
End While
End Usingscores.csvCSV
name,score
Aki,82
Mika,91実行結果OUTPUT
Aki: 82点
Mika: 91点JSONを保存して復元する
System.Text.Jsonは.NETに含まれています。オブジェクトをJSON文字列へ変換する処理をシリアライズ、その逆をデシリアライズと呼びます。
Program.vbVISUAL BASIC
Dim item As New ShoppingItem With {.Name = "りんご", .Count = 3}
Dim options As New JsonSerializerOptions With {.WriteIndented = True}
Dim json As String = JsonSerializer.Serialize(item, options)
File.WriteAllText("item.json", json)
Dim loaded As ShoppingItem = JsonSerializer.Deserialize(Of ShoppingItem)(
File.ReadAllText("item.json"))
Console.WriteLine($"{loaded.Name}: {loaded.Count}個")ShoppingItem.vbVISUAL BASIC
Public Class ShoppingItem
Public Property Name As String
Public Property Count As Integer
End Class実行結果OUTPUT
りんご: 3個失敗と安全性を考える
確認すること
File.Existsで存在を確認するIOExceptionやUnauthorizedAccessExceptionを想定する- 利用者入力をそのままパスにしない
- 重要なファイルは一時ファイルへ保存してから置き換える
- パスワードや秘密鍵を公開フォルダーへ保存しない
存在確認VISUAL BASIC
If File.Exists("settings.json") Then
Console.WriteLine(File.ReadAllText("settings.json"))
Else
Console.WriteLine("設定ファイルがありません")
End Ifファイルがない場合OUTPUT
設定ファイルがありませんミニ課題:買い物メモ
商品名と個数をList(Of ShoppingItem)としてJSONへ保存し、次の実行時に読み込んで一覧表示してください。ファイルがない初回は空のリストから始め、不正なJSONには説明を表示します。