チュートリアル : .NET Framework のメソッドによるファイル操作
更新 : 2007 年 11 月
このチュートリアルでは、StreamReader クラスによるファイルのオープンと読み取り、ファイルがアクセス中かどうかのチェック、StreamReader クラスのインスタンスによって読み取ったファイルからの文字列の検索、StreamWriter クラスによるファイルへの書き込みの方法を説明します。
メモ : |
---|
使用している設定またはエディションによっては、ダイアログ ボックスで使用可能なオプションや、メニュー コマンドの名前や位置がヘルプに記載されている内容と異なる場合があります。このヘルプ ページは、全般的な開発設定を考慮して記述されています。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。 |
アプリケーションの作成
Visual Studio を起動し、ユーザーが指定のファイルに書き込みを行うためのフォームを作成して、プロジェクトを開始します。
プロジェクトを作成するには
[ファイル] メニューの [新しいプロジェクト] をクリックします。
新しいプロジェクト ペインの [Windows アプリケーション] をクリックします。
[プロジェクト名] ボックスに「MyDiary」と入力し、[OK] をクリックします。
Visual Studio によってプロジェクトがソリューション エクスプローラに追加され、Windows フォーム デザイナが表示されます。
次の表に示すコントロールをフォームに追加し、対応する値をプロパティに設定します。
オブジェクト
プロパティ
値
Name
Text
Submit
Submit Entry
Name
Text
Clear
Clear Entry
Name
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 = ""
日記の表示機能の追加
このセクションでは、DisplayEntryTextBox に最新のエントリを表示する機能を追加します。また、さまざまなエントリを表示する ComboBox を追加し、ユーザーがそこからエントリを選択して DisplayEntryTextBox に表示できるようにします。StreamReader クラスのインスタンスでは、MyDiary.txt から読み込みを行います。StreamReader は、StreamWriter クラスと同じく、テキスト ファイルに対して使用するためのものです。
ここでは、次の表に示すコントロールをフォームに追加し、対応する値をプロパティに設定します。
コントロール |
プロパティ |
値 |
---|---|---|
Name Visible Size Multiline |
DisplayEntry False 120,60 True |
|
Name Text |
Display Display |
|
Name Text |
GetEntries Get Entries |
|
Name Text Enabled |
PickEntries Select an Entry False |
コンボ ボックスの内容を設定するには
PickEntriesComboBox を使用して、ユーザーが各エントリを送信 (Submit) した日付を表示します。ユーザーは、そこから特定の日付のエントリを選択できます。GetEntries ボタンの Click イベント ハンドラを作成し、次のコードを追加します。
Dim fr As StreamReader 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] をクリックします。選択したエントリの内容が DisplayEntryTextBox に表示されます。
ユーザーがエントリを削除または変更できるようにする
DeleteEntry ボタンと EditEntry ボタンを使用してユーザーがエントリを削除または変更できる機能を追加できますエントリが表示されるまでは、どちらのボタンも無効にします。
次の表に示すコントロールをフォームに追加し、対応する値をプロパティに設定します。
コントロール |
プロパティ |
値 |
---|---|---|
Name Text Enabled |
DeleteEntry Delete Entry False |
|
Name Text Enabled |
EditEntry Edit Entry False |
|
Name 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] をクリックします。DisplayEntryTextBox にエントリが表示されます。[Edit Entry] をクリックします。EntryTextBox にエントリが表示されます。EntryTextBox の入力内容を編集し、[Submit Edit] をクリックします。MyDiary.txt ファイルを開いて修正内容を確認します。次に、エントリを選択し、[Delete Entry] をクリックします。確認を求める MessageBox が表示されたら、[OK] をクリックします。アプリケーションを終了し、MyDiary.txt を開いて削除を確認します。