演练:使用 .NET Framework 方法操作文件(Visual Basic)

本演练演示如何使用 StreamReader 类打开和读取文件、检查文件是否被访问、使用类实例 StreamReader 读取的文件内搜索字符串,以及使用该 StreamWriter 类写入文件。

注释

计算机可能会在以下说明中显示某些 Visual Studio 用户界面元素的不同名称或位置。 你拥有的 Visual Studio 版本以及所使用的设置决定了这些元素。 有关更多信息,请参阅 自定义 IDE

创建应用程序

启动 Visual Studio,并通过创建一个表单来开始项目,用户可以使用该表单写入指定文件。

要创建项目

  1. 在“文件”菜单中,选择“新建项目”。

  2. 在“ 新建项目 ”窗格中,单击 “Windows 应用程序”。

  3. 在“ 名称 ”框中,键入 MyDiary 并单击“ 确定”。

    Visual Studio 将项目添加到 解决方案资源管理器,Windows 窗体设计器 随即打开。

  4. 将下表中的控件添加到窗体中,并为其属性设置相应的值。

对象 性能 价值
Button 名称

文字
Submit

提交条目
Button 名称

文字
Clear

清除条目
TextBox 名称

文字

多行
Entry

请输入内容。

False

写入文件

若要添加通过应用程序写入文件的功能,请使用 StreamWriter 该类。 StreamWriter 专用于特定编码中的字符输出,而类 Stream 专为字节输入和输出而设计。 使用StreamWriter将信息行写入标准文本文件。 有关类 StreamWriter 的详细信息,请参阅 StreamWriter

添加写入功能

  1. “视图 ”菜单中,选择 “代码 ”以打开代码编辑器。

  2. 由于应用程序引用了System.IO命名空间,请在代码的最前面、窗体的类声明Public Class Form1开始之前,添加以下语句。

    Imports System.IO
    

    在写入文件之前,必须创建类 StreamWriter 的实例。

  3. “视图 ”菜单中,选择 设计器 以返回到 Windows 窗体设计器。 双击 Submit 按钮以创建 Click 事件处理程序,然后添加以下代码。

    Dim fw As StreamWriter
    

注释

Visual Studio 集成开发环境(IDE)将返回到代码编辑器,并将插入点放置在应在其中添加代码的事件处理程序中。

  1. 若要写入该文件,请使用 Write 类的 StreamWriter 方法。 在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
    
  2. 确保用户无法通过直接在后面 Dim ReadString As String添加以下代码来提交空白条目。

    If (Entry.Text = "" Or Entry.Text = "Please enter something.") Then
        Entry.Text = "Please enter something."
        Return
    End If
    
  3. 由于这是日记,因此用户需要为每个条目分配日期。 将以下代码插入到fw = New StreamWriter("C:\MyDiary.txt", True)之后,以将变量Today设置为当前日期。

    Dim Today As DateTime
    Today = Now
    fw.Write(CStr(Today))
    fw.Write(ControlChars.CrLf)
    
  4. 最后,附加代码以清除 TextBox。 将以下代码添加到 Clear 按钮 Click 的事件。

    Entry.Text = ""
    

向日记中添加显示功能

在本部分中,您将添加一个功能,用于显示DisplayEntryTextBox中的最新条目。 您还可以添加一个 ComboBox,用于显示各种条目,并允许用户选择一个条目在 DisplayEntryTextBox 中显示。 StreamReader 类的实例从 MyDiary.txt 中读取。 与类 StreamWriter 一样, StreamReader 适用于文本文件。

对于本演练的此部分,请将下表中的控件添加到窗体中,并为其属性设置相应的值。

控制 性能 价值观
TextBox 名称

可见

大小

多行
DisplayEntry

False

120,60

True
Button 名称

文字
Display

显示
Button 名称

文字
GetEntries

获取条目
ComboBox 名称

文字

已启用
PickEntries

选择一个条目

False

填充组合框

  1. 用于 PickEntriesComboBox 显示用户提交每个条目的日期,以便用户可以从特定日期中选择一个条目。 创建 Click 按钮的 GetEntries 事件处理程序,并添加以下代码。

    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
    
  2. 若要测试代码,请按 F5 编译应用程序,然后单击“ 获取条目”。 单击其中的下拉箭头 ComboBox 以显示输入日期。

选择并显示个别项

  1. ClickDisplay按钮创建事件处理程序并添加以下代码。

    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
    
  2. 若要测试代码,请按 F5 编译应用程序,然后提交条目。 单击“ 获取条目”,从中选择 ComboBox一个条目,然后单击“ 显示”。 所选条目的内容显示在DisplayEntryTextBox中。

允许用户删除或修改条目

最后,可以包含其他功能,使用户能够使用 DeleteEntry 和按钮删除或修改 EditEntry 条目。 除非显示有项,否则这两个按钮都保持禁用状态。

将下表中的控件添加到窗体中,并为其属性设置相应的值。

控制 性能 价值观
Button 名称

文字

已启用
DeleteEntry

删除条目

False
Button 名称

文字

已启用
EditEntry

编辑条目

False
Button 名称

文字

已启用
SubmitEdit

提交修改

False

允许对条目进行删除和修改

  1. 将以下代码添加到 Display 按钮的 Click 事件中,在 DisplayEntry.Text = ReadString 之后。

    DeleteEntry.enabled = True
    
  2. ClickDeleteEntry按钮创建事件处理程序并添加以下代码。

    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
    
  3. 当用户显示条目时,该 EditEntry 按钮将启用。 在 Click 之后,将以下代码添加到 Display 按钮的 DisplayEntry.Text = ReadString 事件。

    EditEntry.Enabled = True
    
  4. ClickEditEntry按钮创建事件处理程序并添加以下代码。

    Entry.Text = DisplayEntry.Text
    SubmitEdit.Enabled = True
    
  5. ClickSubmitEdit按钮创建事件处理程序并添加以下代码

    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 编译应用程序。 单击“ 获取条目”,选择一个条目,然后单击“ 显示”。 条目将出现在 DisplayEntryTextBox 中。 单击 “编辑条目”。 条目将出现在 EntryTextBox 中。 编辑条目, EntryTextBox 然后单击“ 提交编辑”。 MyDiary.txt打开该文件以确认更正。 现在选择一个条目,然后单击“ 删除条目”。 请求 MessageBox 确认时,单击“ 确定”。 关闭应用程序并打开 MyDiary.txt 以确认删除。

另请参阅