更新:2007 年 11 月
此演练介绍有关 Microsoft Visual Basic 2005 中文件 I/O 的基本知识。为便于演示各项功能,将创建一个名为 FileExplorer 的小应用程序。该应用程序检查某个目录中的文本文件,并提供属性、上次访问时间以及文件的前 80 个字符等信息。它还包括一个将上述信息写入日志文件的选项。
| .gif) 说明: | 
|---|
| 对话框中的可用选项以及显示的菜单命令的名称和位置可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。此帮助页是根据“常规开发设置”而编写的。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置。 | 
创建应用程序
项目开始时,先创建一个窗体。用户可以通过该窗体选择目录、从目录中选择文件以及选择要检索该文件的哪些信息。
创建项目
- 在“文件”菜单上,单击“新建项目”。 - 出现“新建项目”对话框。 
- 在“项目类型”窗格中单击“Visual Basic 项目”,然后单击“模板”窗格中的“Windows 应用程序”。 
- 在“名称”框中,键入 FileExplorer 以设置项目名称。 - Visual Studio 将该项目添加到“解决方案资源管理器”中,Windows 窗体设计器随即打开。 
- 将下表中的控件添加到窗体中,并给其属性设置相应的值。 - 对象 - 属性 - 值 - Name - Text - txtDirectory - Directory - Name - Text - btnSubmit - Submit - Name - Text - btnExamine - Examine - Name - Text - lstFilePick - Select A File - Name - Text - Checked - chkFileLength - File Length - True - Name - Text - Checked - chkLastAccess - Last Access Time - True - Name - Text - Checked - chkSave - Save Results - False 
显示当前目录
FileExplorer 应用程序需要一个起始点。因此 txtDirectoryTextBox 使用 My.Computer.FileSystem.CurrentDirectory 函数来返回并显示一个表示当前路径的字符串。
返回当前目录
- 双击该窗体,为 Form1_Load 事件创建一个事件处理程序。 - 代码编辑器打开。 
- 添加以下代码,使 txtDirectoryTextBox 显示当前位置。 - txtDirectory.Text = My.Computer.FileSystem.CurrentDirectory
- 运行该程序以确认返回的路径是否正确。 - txtDirectoryTextBox 显示当前目录。 
更改目录
由于用户可能需要选择其他目录中的文件,因此该应用程序使用相同的属性来切换目录。若要更改到其他目录,用户需要在 txtDirectoryTextBox 中输入一个新路径。
更改目录
- 双击窗体上的 btnSubmit 按钮,为该控件创建一个 Click 事件处理程序。 - 代码编辑器打开。 
- 将以下代码添加到 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 语句来捕获因提交空白或无效路径而引发的异常。
确保路径有效
- 在 btnSubmit_Click 事件中,将 Dim ErrorMessage As String 作为新行添加到代码行 Dim NewPath As String 之后。 
- 在代码行 My.Computer.FileSystem.CurrentDirectory = NewPath 之前,添加一条 Try 语句(位于同一行),如下所示。如果您按回车键,代码编辑器将自动插入 Catch ex As Exception 和 End Try 语句。移除这些语句;您将在下一步中添加自己的语句。 - Try
- 在代码行 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 的文件。
显示目录内容
- 在 btnSubmit_Click 事件的开头插入以下语句。 - Dim fileList As System.Collections.ObjectModel.ReadOnlyCollection(Of String). 
- 在 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)来自定义结果。
显示特定信息
- 在 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 对象,可以查询该对象以获取有关某个文件的信息。 
- 将以下代码添加到 btnExamine_Click 事件的末尾。 - ' Check last access time. If chkLastAccess.Checked = True Then LastAccess = thisFile.LastAccessTime End If
LastAccessTime 属性用于确定上次访问该文件的时间。返回的 Date 值表示创建或上次修改该文件的日期和时间。
- 将以下代码添加到 btnExamine_Click 事件的末尾。 - ' Check Length. If chkFileLength.Checked = True Then Length = thisFile.Length End If
Length 属性用于确定文件的长度。它返回一个 Long 值,以字节为单位指定该文件的长度。
显示结果
为使该应用程序功能完善,可以添加一个 MsgBox 来报告所收集的信息。
显示结果
- 在确定是否选中 chkLastAccessCheckBox 的 If 语句的末尾,将以下语句添加到最终的 End If 之前。 - ' Add to the messagebox. FinalString = FinalString & stringLastAccess & LastAccess & "." _ & vbCrLf
- 在确定是否选中 chkFileLengthCheckBox 的 If 语句的末尾,将以下语句添加到最终的 End If 之前。 - ' Add to the messagebox. FinalString = FinalString & stringlength & CStr(Length) & "." _ & vbCrLf
- 在确定是否选中 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
测试应用程序
- 在您选择的目录中,创建一个名为 test.txt 的文本文件,其第一行如下: - “这是第一个文件的第一行。文件资源管理器应用程序只检查文本文件。” 
- 在同一目录中,创建另一个名为 test2.txt 的文本文件,其第一行如下: - “这是第二个文件的第一行。文件资源管理器应用程序只检查文本文件。” 
- 启动应用程序。 
- 键入一个无效路径,然后单击 Submit。 - 将出现以下信息:“You must enter a valid path.If trying to access a different drive, remember to include the drive letter.” 
- 键入存储 test.txt 文件的目录路径,然后单击“Submit”。 - lstFilePickComboBox 将显示这两个文本文件。 
- 在 lstFilePickComboBox 中选择 test.txt。确保选中所有复选框,然后单击“Examine”。 - 结果窗体中包括上次访问日期和长度。 
- 在 lstFilePickComboBox 中选择 test2.txt,清除所有复选框,然后单击“Examine”。 - 将出现以下错误信息:“No file attribute checkboxes selected.” 
- 选中“Last Access”和“Save Results”,然后单击“Examine”。 - 所结果窗体中仅显示上次访问时间。 
- 关闭 FileExplorer。 - 由于您选中了“Save Results”选项,因此 FileExplorer 将在那些文本文件所在的目录中生成一个名为 log.txt 的日志文件。 
检查日志
- 在当前目录中,打开 log.txt,然后确认 FileExplorer 记录的信息是否正确。