此演练演示了如何使用 StreamReader 类打开和读取文件、如何查看文件是否正被访问、如何在使用 StreamReader 类实例读取的文件中搜索字符串以及如何使用 StreamWriter 类写入文件。
提示
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。
创建应用程序
启动 Visual Studio,并创建一个用户可用于写入指定文件的窗体来开始项目。
创建项目
- 在**“文件”菜单上选择“新建项目”**。 
- 在**“新建项目”窗格中单击“Windows 应用程序”**。 
- 在**“名称”框中,键入 MyDiary,然后单击“确定”**。 - Visual Studio 就会将该项目添加到解决方案资源管理器中,**“Windows 窗体设计器”**也将随即打开。 
- 将下表中的控件添加到窗体中,并给其属性设置相应的值。 
| 对象 | 属性 | 值 | 
| Name 文本 | 提交 提交项 | |
| Name 文本 | Clear 清除项 | |
| Name 文本 Multiline | Entry 请输入一些文本。 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) 将返回代码编辑器,并将插入点放在应在其中添加代码的事件处理程序内。
- 若要写入文件,请使用 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 也用于处理文本文件。
在此演练的这一节中,请将下表中的控件添加到窗体上,并将其属性设置为相应的值。
| 控件 | 属性 | 值 | 
|---|---|---|
| Name Visible 大小 Multiline | DisplayEntry False 120,60 True | |
| Name 文本 | 显示 显示 | |
| Name 文本 | GetEntries 获取项 | |
| Name 文本 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 键编译该应用程序,然后提交一项。 单击**“获取项”,从 ComboBox 中选择一项,然后单击“显示”**。 所选项的内容将出现在 DisplayEntry TextBox 中。 
允许用户删除或修改项
最后,您可以包括其他功能,以允许用户使用 DeleteEntry 和 EditEntry 按钮来删除或修改项。 除非显示有项,否则这两个按钮都保持禁用状态。
将下表中的控件添加到窗体中,并给其属性设置相应的值。
| 控件 | 属性 | 值 | 
|---|---|---|
| Name 文本 Enabled | DeleteEntry 删除项 False | |
| Name 文本 Enabled | EditEntry 编辑项 False | |
| Name 文本 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 中的项,然后单击“提交编辑”。 打开 MyDiary.txt 文件以确认您所做的更正。 现在,选择一项,然后单击“删除项”。 当 MessageBox 请求确认时,单击“确定”**。 关闭该应用程序,然后打开 MyDiary.txt,以确认该项是否已删除。