逐步解說:在 Visual Basic 中管理檔案和目錄
更新:2007 年 11 月
這個逐步解說將介紹 Microsoft Visual Basic 2005 中 I/O 檔案的基本原則。為了說明功能,逐步解說中會建立一個名為 FileExplorer 的小應用程式,以檢查目錄內的文字檔並提供一些資訊,如屬性 (Attribute)、上次存取時間和檔案的前 80 個字元。它也包含將資訊寫入記錄檔的選項。
注意事項: |
---|
對話方塊中所提供的選項,以及您所看到的功能表命令的名稱和位置,會根據使用中的設定或版本而有所不同,所以可能會和說明中所描述的不一樣。撰寫這個說明網頁時已將 [一般開發設定] 納入考慮。若要變更設定,請從 [工具] 功能表中選擇 [匯入和匯出設定]。如需詳細資訊,請參閱 Visual Studio 設定。 |
建立應用程式
若要開始專案,請建立使用者可以選取目錄的表單,從目錄中選取檔案,並選取他們要從這個檔案擷取的資訊。
若要建立專案
在 [檔案] 功能表上,按一下 [新增專案]。
[新增專案] 對話方塊隨即出現。
在 [專案類型] 窗格中,按一下 [Visual Basic 專案],再按一下 [範本] 窗格內的 [Windows 應用程式]。
在 [名稱] 方塊中,輸入 [FileExplorer] 以設定專案名稱。
Visual Studio 會將專案加入 [方案總管] 中,並開啟 Windows Form 設計工具。
將下表中的控制項加入表單,並設定控制項屬性的對應值。
物件
屬性
值
Name
Text
txtDirectory
目錄
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 陳述式 (Statement),以攔截送出空白或無效路徑時發生的例外狀況。
若要確定有效路徑
在 btnSubmit_Click 事件中新增一行,將 Dim ErrorMessage As String 加入 Dim NewPath As String 程式碼行之後。
將 Try 陳述式加入 My.Computer.FileSystem.CurrentDirectory = NewPath 程式碼行前,使該陳述式自成一行,如下所示。如果您按一下 ENTER 鍵,程式碼編輯器會自動插入 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 的文字檔,第一行如下:
"This is the first line of the first file.The FileExplorer application examines only text files."
在相同的目錄中,建立第二個名為 test2.txt 的文字檔,第一行如下:
"This is the first line of the second file.The FileExplorer application examines only text files."
啟動應用程式。
輸入無效的路徑,然後按一下 [送出]。
出現下列訊息:"You must enter a valid path. If trying to access a different drive, remember to include the drive letter."
輸入存放 text.txt 的目錄路徑,然後按一下 [送出]。
lstFilePickComboBox 會顯示文字檔。
在 lstFilePickComboBox 中選取 test.txt。確定已選取所有的核取方塊,然後按一下 [檢查]。
結果表單會包括上次存取日期和長度。
在 lstFilePickComboBox 中選取 test2.txt,清除所有核取方塊,然後按一下 [檢查]。
出現以下的錯誤訊息:"No file attribute checkboxes selected."
選取 [上次存取] 和 [儲存結果],然後按一下 [檢查]。
結果表單只會顯示上次存取時間。
關閉 FileExplorer。
因為您核取了 [儲存結果] 選項,所以 FileExplorer 會在與文字檔相同的目錄內產生名為 log.txt 的記錄檔。
若要檢查記錄檔
- 在目前的目錄中開啟 log.txt,並確認 FileExplorer 所記錄的資訊正確。