チュートリアル: .NET Framework のメソッドによるファイル操作 (Visual Basic)
このチュートリアルでは、StreamReader クラスを使用してファイルを開いて読み取り、ファイルがアクセスされているかどうかをチェックし、StreamReader クラスのインスタンスを使用したファイル読み取り内の文字列を検索し、StreamWriter クラスを使用してファイルにデータを書き込む方法について説明します。
注意
次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「IDE をカスタマイズする」をご覧ください。
アプリケーションの作成
Visual Studio を起動し、ユーザーが指定のファイルへの書き込みに使用できるフォームを作成して、プロジェクトを開始します。
プロジェクトを作成するには
[ファイル] メニューの [新しいプロジェクト] を選択します。
[新しいプロジェクト] ペインで、[Windows アプリケーション] をクリックします。
[名前] ボックスに
MyDiary
と入力して、[OK] をクリックします。Visual Studio のソリューション エクスプローラーにプロジェクトが追加され、Windows フォーム デザイナーが開きます。
次の表にあるコントロールをフォームに追加し、それらのプロパティに対応する値を設定します。
オブジェクト | プロパティ | Value |
---|---|---|
Button | 名前 Text |
Submit エントリの送信 |
Button | 名前 Text |
Clear エントリのクリア |
TextBox | 名前 Text Multiline |
Entry テキストを入力してください。 False |
ファイルへの書き込み
アプリケーションを通じてファイルに書き込む機能を追加するには、StreamWriter クラスを使用します。 StreamWriter は、特定のエンコードでの文字出力用に設計されています。これに対し Stream クラスは、バイト入出力用に設計されています。 標準のテキスト ファイルに複数行の情報を書き込む場合には、StreamWriter を使用します。 StreamWriter クラスの詳細については、「StreamWriter」をご覧ください。
書き込み機能を追加するには
[表示] メニューの [コード] を選択してコード エディターを開きます。
アプリケーションで System.IO 名前空間を参照するので、コードの先頭、つまりフォームのクラス宣言 (
Public Class Form1
で始まるブロック) よりも前に、次のステートメントを追加します。Imports System.IO
ファイルへの書き込みを行う前に、StreamWriter クラスのインスタンスを作成する必要があります。
[表示] メニューの [デザイナー] を選択して、Windows フォーム デザイナーに戻ります。
Submit
ボタンをダブルクリックして、ボタンの Click イベント ハンドラーを作成し、次のコードを追加します。Dim fw As StreamWriter
注意
Visual Studio 統合開発環境 (IDE) の画面がコード エディターに戻り、コードを追加するイベント ハンドラー内にカーソルが配置されます。
ファイルへの書き込みを行うには、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
ユーザーが空のエントリを送信しないよう、
Dim ReadString As String
の直後に次のコードを追加します。If (Entry.Text = "" Or Entry.Text = "Please enter something.") Then Entry.Text = "Please enter something." Return End If
これは日記なので、ユーザーが各エントリに日付を割り当てられようにする必要があります。
fw = New StreamWriter("C:\MyDiary.txt", True)
の後に次のコードを挿入して、変数Today
を現在の日付に設定します。Dim Today As DateTime Today = Now fw.Write(CStr(Today)) fw.Write(ControlChars.CrLf)
最後に、TextBox をクリアするためのコードを追加します。
Clear
ボタンの Click イベントに次のコードを追加します。Entry.Text = ""
日記に表示機能を追加する
このセクションでは、DisplayEntry
TextBox に最新のエントリを表示する機能を追加します。 ComboBox を追加することも可能で、これでさまざまなエントリを表示したり、DisplayEntry
TextBox に表示するエントリをユーザーが選択できるようにしたりできます。 StreamReader クラスのインスタンスは、MyDiary.txt
からデータを読み取ります。 StreamWriter クラスと同様、StreamReader はテキスト ファイル用です。
チュートリアルのこのセクション用に、次の表にあるコントロールをフォームに追加し、それらのプロパティに対応する値を設定します。
コントロール | Properties | 値 |
---|---|---|
TextBox | 名前 [表示] [サイズ] Multiline |
DisplayEntry False 120,60 True |
Button | 名前 Text |
Display ディスプレイ |
Button | 名前 Text |
GetEntries エントリの取得 |
ComboBox | 名前 Text Enabled |
PickEntries エントリの選択 False |
コンボ ボックスを設定するには
PickEntries
ComboBox は、ユーザーが各エントリを送信する日付を表示するために使用されます。これにより、ユーザーが特定の日付からエントリを選択できるようになります。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
コードをテストするには、F5 キーを押してアプリケーションをコンパイルし、[エントリの取得] をクリックします。 ComboBox でドロップダウンの矢印をクリックして、エントリの日付を表示します。
個別のエントリを選択して表示するには
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
コードをテストするには、F5 キーを押してアプリケーションをコンパイルし、エントリを送信をクリックします。 [Get Entries] (エントリの取得) をクリックし、ComboBox からエントリを選択して、[表示] をクリックします。 選択したエントリのコンテンツが、
DisplayEntry
TextBox に表示されます。
ユーザーがエントリの削除や変更を行えるようにする
ユーザーが DeleteEntry
ボタンと EditEntry
ボタンを使用してエントリを削除したり変更したりできる機能を追加できます。 どちらのボタンも、エントリが表示されているとき以外は無効になります。
次の表にあるコントロールをフォームに追加し、それらのプロパティに対応する値を設定します。
コントロール | Properties | 値 |
---|---|---|
Button | 名前 Text Enabled |
DeleteEntry エントリの削除 False |
Button | 名前 Text Enabled |
EditEntry エントリの編集 False |
Button | 名前 Text Enabled |
SubmitEdit 編集結果の送信 False |
エントリの削除と変更を有効にするには
Display
ボタンの Click イベント (DisplayEntry.Text = ReadString
の後) に、次のコードを追加します。DeleteEntry.enabled = True
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
ユーザーがエントリを表示すると、
EditEntry
ボタンが有効になります。Display
ボタンの Click イベント (DisplayEntry.Text = ReadString
の後) に、次のコードを追加します。EditEntry.Enabled = True
EditEntry
ボタンの Click イベント ハンドラーを作成し、次のコードを追加します。Entry.Text = DisplayEntry.Text SubmitEdit.Enabled = True
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 キーを押してアプリケーションをコンパイルします。 [エントリの取得] をクリックし、エントリを選択して、[表示] をクリックします。 DisplayEntry
TextBox にエントリが表示されます。 [エントリの編集] をクリックします。 Entry
TextBox にエントリが表示されます。 Entry
TextBox でエントリを編集し、[Submit Edit] (編集結果の送信) をクリックします。 MyDiary.txt
ファイルを開いて修正結果を確認します。 確認したら、エントリを選択し、[エントリの削除] をクリックします。 MessageBox で確認を求められたら、[OK] をクリックします。 アプリケーションを閉じ、MyDiary.txt
を開いて削除を確認します。
関連項目
.NET