演练:使用 .NET Framework 方法操作文件

更新:2007 年 11 月

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

说明:

对话框中的可用选项以及显示的菜单命令的名称和位置可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。此帮助页是根据“常规开发设置”而编写的。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置

创建应用程序

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

创建项目

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

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

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

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

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

    对象

    属性

    Button

    Name

    Text

    Submit

    提交项

    Button

    Name

    Text

    Clear

    清除项

    TextBox

    Name

    Text

    Multiline

    Entry

    请输入一些文本。

    False

写入文件

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

添加写入功能

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

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

    Imports System
    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 也用于处理文本文件。

在此演练的这一节中,请将下表中的控件添加到窗体上,并将其属性设置为相应的值。

控件

属性 (Property)

TextBox

Name

Visible

Size

Multiline

DisplayEntry

False

120,60

True

Button

Name

Text

Display

显示

Button

Name

Text

GetEntries

获取项

ComboBox

Name

Text

Enabled

PickEntries

选择一项

False

填充组合框

  1. PickEntriesComboBox 用于显示用户提交每一项的日期,这样,用户就可以选择特定日期的项。为 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
    
  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 中。

允许用户删除或修改项

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

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

控件

属性 (Property)

Button

Name

Text

Enabled

DeleteEntry

删除项

False

Button

Name

Text

Enabled

EditEntry

编辑项

False

Button

Name

Text

Enabled

SubmitEdit

提交编辑

False

允许删除和修改项

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

    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 按钮将变为启用状态。在 Display 按钮的 Click 事件中,将以下代码添加到 DisplayEntry.Text = ReadString 之后。

    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,以确认该项是否已删除。

请参见

参考

StreamReader

StreamWriter

其他资源

Visual Basic 语言演练