Visual Basic

ファイルとJSON

データをプログラムの終了後にも残し、安全に読み書きする方法を学びます。

01

パスを組み立てる

このページの例では、Program.vbの先頭(Moduleより前)に次のImportsを書きます。Path.Combineを使うと、OSごとの区切り文字を意識せずにパスを作れます。

必要なImportsVISUAL BASIC
Imports System.IO
Imports System.Text
Imports System.Text.Json
dataフォルダーを作る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)
02

テキストを読み書きする

少量のテキストは一度に保存・読み込みできます。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ブロックを使えば、途中で例外が起きてもファイルが閉じられます。

03

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 Using
scores.csvCSV
name,score
Aki,82
Mika,91
実行結果OUTPUT
Aki: 82点
Mika: 91点
04

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個
05

失敗と安全性を考える

確認すること
  • File.Existsで存在を確認する
  • IOExceptionUnauthorizedAccessExceptionを想定する
  • 利用者入力をそのままパスにしない
  • 重要なファイルは一時ファイルへ保存してから置き換える
  • パスワードや秘密鍵を公開フォルダーへ保存しない
存在確認VISUAL BASIC
If File.Exists("settings.json") Then
    Console.WriteLine(File.ReadAllText("settings.json"))
Else
    Console.WriteLine("設定ファイルがありません")
End If
ファイルがない場合OUTPUT
設定ファイルがありません
PRACTICE

ミニ課題:買い物メモ

商品名と個数をList(Of ShoppingItem)としてJSONへ保存し、次の実行時に読み込んで一覧表示してください。ファイルがない初回は空のリストから始め、不正なJSONには説明を表示します。