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

此演练演示了如何使用 StreamReader 类打开和读取文件,如何查看文件是否正被访问,如何在使用 StreamReader 类实例读取的文件中搜索字符串,以及如何使用 StreamWriter 类写入文件。

注意

以下说明中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 这些元素取决于你所使用的 Visual Studio 版本和你所使用的设置。 有关详细信息,请参阅个性化设置 IDE

创建应用程序

启动 Visual Studio,并创建一个用户可用于写入指定文件的窗体来开始项目。

创建项目

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

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

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

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

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

对象 属性
Button 名称

Text
Submit

提交条目
Button 名称

Text
Clear

清除条目
TextBox 名称

Text

多行
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. 若要写入该文件,请使用 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
    
  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 名称

Visible

大小

多行
DisplayEntry

False

120,60

True
Button 名称

Text
Display

显示器
Button 名称

Text
GetEntries

获取项
ComboBox 名称

Text

Enabled
PickEntries

选择一项

False

填充组合框

  1. PickEntriesComboBox 用于显示用户提交每一项的日期,这样,用户就可以选择特定日期的项。 创建 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
    
  2. 若要测试代码,请按 F5 编译该应用程序,然后单击“获取项”。 单击 ComboBox 中的下拉箭头,以显示条目日期。

选择并显示个别项

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

允许用户删除或修改项

最后,可以包括其他功能,以允许用户使用 DeleteEntryEditEntry 按钮来删除或修改项。 除非显示有项,否则这两个按钮都保持禁用状态。

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

控制 属性
Button 名称

Text

Enabled
DeleteEntry

删除项

False
Button 名称

Text

Enabled
EditEntry

编辑条目

False
Button 名称

Text

Enabled
SubmitEdit

提交编辑

False

允许删除和修改项

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

    DeleteEntry.enabled = True
    
  2. 创建 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
    
  3. 用户显示某一项时,EditEntry 按钮将变为启用状态。 在 DisplayEntry.Text = ReadString 之后,将以下代码添加到 Display 按钮的 Click 事件。

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

    Entry.Text = DisplayEntry.Text
    SubmitEdit.Enabled = True
    
  5. 创建 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 编译该应用程序。 单击“获取项”,选择一项,然后单击“显示”。 条目将出现在 DisplayEntryTextBox 中。 单击“编辑项”。 条目将出现在 EntryTextBox 中。 编辑 EntryTextBox 中的项,然后单击“提交编辑”。 打开 MyDiary.txt 文件以确认所做的更正。 现在,选择一项,然后单击“删除项”。 当 MessageBox 请求确认时,请单击“确定”。 关闭该应用程序,然后打开 MyDiary.txt,以确认该项已删除。

另请参阅