演练:在 Visual Basic 中操作文件和目录

更新:2007 年 11 月

此演练介绍有关 Microsoft Visual Basic 2005 中文件 I/O 的基本知识。为便于演示各项功能,将创建一个名为 FileExplorer 的小应用程序。该应用程序检查某个目录中的文本文件,并提供属性、上次访问时间以及文件的前 80 个字符等信息。它还包括一个将上述信息写入日志文件的选项。

说明:

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

创建应用程序

项目开始时,先创建一个窗体。用户可以通过该窗体选择目录、从目录中选择文件以及选择要检索该文件的哪些信息。

创建项目

  1. 在“文件”菜单上,单击“新建项目”。

    出现“新建项目”对话框。

  2. 在“项目类型”窗格中单击“Visual Basic 项目”,然后单击“模板”窗格中的“Windows 应用程序”。

  3. 在“名称”框中,键入 FileExplorer 以设置项目名称。

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

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

    对象

    属性

    TextBox

    Name

    Text

    txtDirectory

    Directory

    Button

    Name

    Text

    btnSubmit

    Submit

    Button

    Name

    Text

    btnExamine

    Examine

    ComboBox

    Name

    Text

    lstFilePick

    Select A File

    CheckBox

    Name

    Text

    Checked

    chkFileLength

    File Length

    True

    CheckBox

    Name

    Text

    Checked

    chkLastAccess

    Last Access Time

    True

    CheckBox

    Name

    Text

    Checked

    chkSave

    Save Results

    False

显示当前目录

FileExplorer 应用程序需要一个起始点。因此 txtDirectoryTextBox 使用 My.Computer.FileSystem.CurrentDirectory 函数来返回并显示一个表示当前路径的字符串。

返回当前目录

  1. 双击该窗体,为 Form1_Load 事件创建一个事件处理程序。

    代码编辑器打开。

  2. 添加以下代码,使 txtDirectoryTextBox 显示当前位置。

    txtDirectory.Text = My.Computer.FileSystem.CurrentDirectory
    
  3. 运行该程序以确认返回的路径是否正确。

    txtDirectoryTextBox 显示当前目录。

更改目录

由于用户可能需要选择其他目录中的文件,因此该应用程序使用相同的属性来切换目录。若要更改到其他目录,用户需要在 txtDirectoryTextBox 中输入一个新路径。

更改目录

  1. 双击窗体上的 btnSubmit 按钮,为该控件创建一个 Click 事件处理程序。

    代码编辑器打开。

  2. 将以下代码添加到 Click 事件处理程序中。

    Dim NewPath As String
    ' NewPath holds the path the user has entered.
    NewPath = txtDirectory.Text
    ' Change the location to NewPath.
    My.Computer.FileSystem.CurrentDirectory = NewPath
    

验证输入的路径是否有效

使用 Try...Catch 语句来捕获因提交空白或无效路径而引发的异常。

确保路径有效

  1. 在 btnSubmit_Click 事件中,将 Dim ErrorMessage As String 作为新行添加到代码行 Dim NewPath As String 之后。

  2. 在代码行 My.Computer.FileSystem.CurrentDirectory = NewPath 之前,添加一条 Try 语句(位于同一行),如下所示。如果您按回车键,代码编辑器将自动插入 Catch ex As Exception 和 End Try 语句。移除这些语句;您将在下一步中添加自己的语句。

    Try
    
  3. 在代码行 My.Computer.FileSystem.CurrentDirectory = NewPath 后添加以下语句。

        ' This checks to make sure the path is not blank.
    Catch ex As Exception When NewPath = ""
        ErrorMessage = "You must enter a path."
        ' This catches errors caused by a path that is not valid.
    Catch
        ErrorMessage = "You must enter a valid path.  If trying " & _
        "to access a different drive, remember to include the drive " & _
        "letter."
    Finally
        ' Display the error message only if one exists.
        If ErrorMessage <> Nothing Then
            MsgBox(ErrorMessage)
        End If
    End Try
    

在组合框中显示目录的内容

若要允许应用程序显示当前目录的内容,可以使用 My.Computer.FileSystem.GetFiles 方法;该方法返回一个字符串的集合,这些字符串表示目录中文件的名称。可以将通配符与 GetFiles 一起使用,以便只选择特定模式的文件。在本例中,只返回扩展名为 .txt 的文件。

显示目录内容

  1. 在 btnSubmit_Click 事件的开头插入以下语句。

    Dim fileList As System.Collections.ObjectModel.ReadOnlyCollection(Of String).

  2. 在 End Try 行之后插入以下语句。

    fileList = My.Computer.FileSystem.GetFiles( _
        My.Computer.FileSystem.CurrentDirectory, _
        FileIO.SearchOption.SearchTopLevelOnly, "*.txt")
    For Each foundFile As String In fileList
        lstFilePick.Items.Add(foundFile)
    Next
    

    所收集的信息显示在 lstFilePickComboBox 中,您可以从中选择一个要检查的特定文件。

首先对一个不包含任何 .txt 文件的目录运行该应用程序,然后对一个包含多个 .txt 文件的目录运行该应用程序,对其进行测试。第一种情况下,该应用程序显示相应的错误信息。第二种情况下,该应用程序在 ComboBox 中创建一个列表,列出在 txtDirectoryTextBox 中指定的目录内的所有 .txt 文件。

使用户可以选择要检查的文件

虽然 lstFilePickComboBox 显示一个目录中的所有文件,但用户很可能需要选择并检查某个特定文件。

允许选择特定文件

  • 为 btnExamine_Click 事件创建一个 Click 事件处理程序,然后添加以下代码来确认文件选择。

    Dim thisFile As System.IO.FileInfo
    thisFile = My.Computer.FileSystem.GetFileInfo(CStr(lstFilePick.SelectedItem))
    

使用户可以决定收集哪些信息

现在,文件已经显示在 lstFilePickComboBox 中,可以添加代码让用户能够指定要报告的信息。例如,一个用户可能只需要了解上次访问文件的日期,而另一个用户可能还需要了解文件的大小。用户可以通过选择或清除复选框(chkLastAccess、chkFileLength)来自定义结果。

显示特定信息

  1. 在 btnExamine_Click 事件开头中的 (lstFilePick.SelectedItem) 语句之后声明这些变量:

    Dim stringlength As String
    stringLength = "The file's length, in bytes, is: "
    Dim stringLastAccess As String
    stringLastAccess = "The file was last accessed on: "
    Dim LastAccess As Date
    Dim Length As Long
    Dim FirstLine As String = ""
    Dim FinalString As String = ""
    Dim NewName As String
    NewName = CType(lstFilePick.SelectedItem, String)
    
    If NewName = Nothing Then
        MsgBox("You must select a file to examine.")
        Exit Sub
    End If
    

    My.Computer.FileSystem.GetFileInfo 方法返回一个 FileInfo 对象,可以查询该对象以获取有关某个文件的信息。

  2. 将以下代码添加到 btnExamine_Click 事件的末尾。

    ' Check last access time.
    If chkLastAccess.Checked = True Then
        LastAccess = thisFile.LastAccessTime
    End If
    

LastAccessTime 属性用于确定上次访问该文件的时间。返回的 Date 值表示创建或上次修改该文件的日期和时间。

  1. 将以下代码添加到 btnExamine_Click 事件的末尾。

    ' Check Length.
    If chkFileLength.Checked = True Then
        Length = thisFile.Length
    End If
    

Length 属性用于确定文件的长度。它返回一个 Long 值,以字节为单位指定该文件的长度。

显示结果

为使该应用程序功能完善,可以添加一个 MsgBox 来报告所收集的信息。

显示结果

  1. 在确定是否选中 chkLastAccessCheckBox 的 If 语句的末尾,将以下语句添加到最终的 End If 之前。

    ' Add to the messagebox.
    FinalString = FinalString & stringLastAccess & LastAccess & "." _
    & vbCrLf
    
  2. 在确定是否选中 chkFileLengthCheckBox 的 If 语句的末尾,将以下语句添加到最终的 End If 之前。

    ' Add to the messagebox.
    FinalString = FinalString & stringlength & CStr(Length) & "." _
    & vbCrLf
    
  3. 在确定是否选中 chkFirstLineCheckBox 的 If 语句的末尾,将以下语句添加到最终的 End If 之前。

    ' Add to the messagebox.
    FinalString &= FirstLine & vbCrLf
    

保存结果

用户可能需要保存文件检查结果。因此,需要添加相应的代码来检查日志文件是否存在,必要时创建一个日志文件,然后将结果写入该文件。

创建日志文件

  • 在 btnExamine_Click 事件的末尾添加以下代码。

    ' Check to see if results should be saved.
    If chkSave.Checked = True And FinalString <> "" Then
        My.Computer.FileSystem.WriteAllText("log.txt", FinalString, True)
    End If
    

测试应用程序

  1. 在您选择的目录中,创建一个名为 test.txt 的文本文件,其第一行如下:

    “这是第一个文件的第一行。文件资源管理器应用程序只检查文本文件。”

  2. 在同一目录中,创建另一个名为 test2.txt 的文本文件,其第一行如下:

    “这是第二个文件的第一行。文件资源管理器应用程序只检查文本文件。”

  3. 启动应用程序。

  4. 键入一个无效路径,然后单击 Submit。

    将出现以下信息:“You must enter a valid path.If trying to access a different drive, remember to include the drive letter.”

  5. 键入存储 test.txt 文件的目录路径,然后单击“Submit”。

    lstFilePickComboBox 将显示这两个文本文件。

  6. 在 lstFilePickComboBox 中选择 test.txt。确保选中所有复选框,然后单击“Examine”。

    结果窗体中包括上次访问日期和长度。

  7. 在 lstFilePickComboBox 中选择 test2.txt,清除所有复选框,然后单击“Examine”。

    将出现以下错误信息:“No file attribute checkboxes selected.”

  8. 选中“Last Access”和“Save Results”,然后单击“Examine”。

    所结果窗体中仅显示上次访问时间。

  9. 关闭 FileExplorer。

    由于您选中了“Save Results”选项,因此 FileExplorer 将在那些文本文件所在的目录中生成一个名为 log.txt 的日志文件。

检查日志

  • 在当前目录中,打开 log.txt,然后确认 FileExplorer 记录的信息是否正确。

请参见

参考

My.Computer.FileSystem.CurrentDirectory 属性

My.Computer.FileSystem.GetFileInfo 方法