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