2025年9月8日 星期一

29.VB.NET 檔案 (File) 筆記 (進階篇)

VB.NET File (檔案) 筆記 (進階篇)

VB.NET File (檔案) 筆記 (進階篇)

在 VB.NET 中,File 類別是用來處理檔案操作的重要工具。無論是讀取文字檔、寫入資料、檢查檔案是否存在,還是複製刪除檔案,File 類別都能幫助輕鬆完成這些工作。瞭解 File 類別的基本用法,可以讓程式與電腦中的檔案系統進行有效的互動,實現資料的儲存、讀取和管理功能。

認識 File 類別

File 類別: File 是 .NET Framework 中專門用來處理檔案操作的類別,它提供了許多靜態方法來執行檔案相關的操作。這些方法不需要建立物件就能直接使用,就像是一套現成的檔案處理工具。File 類別主要處理的是檔案層級的操作,如讀取整個檔案內容、寫入資料到檔案、檢查檔案屬性等。

使用 File 類別之前,必須先引用 System.IO 命名空間。這個命名空間包含了所有檔案和目錄操作相關的類別。引用後就可以直接使用 File.方法名稱來進行各種檔案操作。

Imports System.IO

Public Class Form1
    ' 程式中就可以直接使用 File.方法名稱
End Class

File 類別具有以下重要特性。首先是靜態方法,所有方法都是靜態的,可以直接透過類別名稱呼叫,不需要建立物件。就像使用公用的工具,不需要先建立工具箱就能直接使用。第二是簡單易用,方法名稱直觀明確,容易理解和使用。比如 ReadAllText 就是讀取全部文字,WriteAllText 就是寫入全部文字,命名非常直觀。

File 類別還提供完整的檔案操作功能,涵蓋檔案的建立、讀取、寫入、刪除、複製等各種操作。就像一個全方位的檔案管理員,能處理所有常見的檔案操作需求。另外,許多方法會自動處理檔案的開啟和關閉,就像自動門一樣,使用完畢後會自動關閉。這樣可以避免忘記關閉檔案而造成記憶體問題,讓程式更加穩定可靠。

File 類別通常用在以下場景:讀取設定檔或資料檔案的內容、將程式產生的資料儲存到檔案中、檢查特定檔案是否存在於系統中、複製、移動或刪除檔案,以及獲取檔案的屬性資訊,如建立時間、大小等。使用 File 類別時需要注意檔案路徑的正確性。檔案路徑可以是絕對路徑(完整的檔案位置)或相對路徑(相對於程式執行位置的路徑)。此外,進行檔案操作時應該適當地處理可能發生的例外狀況,如檔案不存在、沒有權限存取等問題。

基本檔案操作

File 類別提供了許多實用的方法來處理檔案操作。以下透過具體範例來學習最常用的基本操作。

範例:檢查檔案是否存在

在進行任何檔案操作之前,通常需要先檢查檔案是否存在。使用 File.Exists() 方法可以檢查指定路徑的檔案是否存在。此方法會返回布林值,根據結果在標籤中顯示不同的訊息,並用顏色區分成功和失敗的狀態,提升使用者體驗。

這個範例需要使用以下控制項:Button1(檢查檔案按鈕)、TextBox1(輸入檔案路徑)、Label1(顯示檢查結果)。在表單載入事件中初始化控制項的預設值,讓使用者了解應該輸入什麼格式的路徑。

Imports System.IO

Public Class Form1
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Text = "C:\temp\test.txt"
        Label1.Text = "請輸入檔案路徑後點擊檢查"
    End Sub
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim filePath As String = TextBox1.Text
        
        If File.Exists(filePath) Then
            Label1.Text = "檔案存在:" & filePath
            Label1.ForeColor = Color.Green
        Else
            Label1.Text = "檔案不存在:" & filePath
            Label1.ForeColor = Color.Red
        End If
    End Sub
End Class

此範例展示了檔案存在性檢查的基本流程。首先在表單載入事件中初始化控制項的預設值,讓使用者了解應該輸入什麼格式的路徑。在按鈕點擊事件中,從文字方塊取得使用者輸入的檔案路徑,然後使用 File.Exists() 方法進行檢查。這個方法會返回布林值,根據結果在標籤中顯示不同的訊息,並用顏色區分成功和失敗的狀態,提升使用者體驗。

範例:讀取檔案內容

File 類別提供了多種讀取檔案的方法,最常用的是 File.ReadAllText(),可以一次讀取整個文字檔案的內容。這個方法會自動處理檔案的開啟和關閉,避免資源洩漏問題。

此範例使用的控制項包括:Button1(讀取檔案按鈕)、TextBox1(輸入檔案路徑)、TextBox2(顯示檔案內容,設定為多行)、Label1(顯示操作狀態)。在表單載入時將內容顯示用的文字方塊設定為多行模式並啟用捲軸,以便顯示較長的檔案內容。

Imports System.IO

Public Class Form1
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Text = "C:\temp\readme.txt"
        TextBox2.Multiline = True
        TextBox2.ScrollBars = ScrollBars.Both
        TextBox2.Text = "檔案內容將顯示在這裡"
        Label1.Text = "請選擇檔案並點擊讀取"
    End Sub
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim filePath As String = TextBox1.Text
        
        Try
            If File.Exists(filePath) Then
                Dim content As String = File.ReadAllText(filePath)
                TextBox2.Text = content
                Label1.Text = "檔案讀取成功"
                Label1.ForeColor = Color.Green
            Else
                Label1.Text = "指定的檔案不存在"
                Label1.ForeColor = Color.Red
                TextBox2.Text = ""
            End If
        Catch ex As Exception
            Label1.Text = "讀取檔案時發生錯誤:" & ex.Message
            Label1.ForeColor = Color.Red
        End Try
    End Sub
End Class

此範例示範了完整的檔案讀取流程。在表單載入時,將內容顯示用的文字方塊設定為多行模式並啟用捲軸,以便顯示較長的檔案內容。在讀取檔案時,先用 File.Exists() 檢查檔案是否存在,然後使用 File.ReadAllText() 一次性讀取整個檔案。整個操作包含在 Try-Catch 區塊中,以處理可能的例外情況,如權限不足或檔案被其他程式佔用等。

範例:寫入檔案內容

使用 File.WriteAllText() 可以將文字內容寫入檔案。如果檔案不存在會自動建立,如果檔案已存在則會覆蓋原有內容。這個方法同樣會自動處理檔案的開啟和關閉,確保資源得到正確釋放。

使用的控制項包括:Button1(寫入檔案按鈕)、TextBox1(輸入檔案路徑)、TextBox2(輸入要寫入的內容,設定為多行)、Label1(顯示操作狀態)。程式會先檢查使用者是否輸入了有效的檔案路徑,然後將文字方塊中的內容寫入指定檔案。

Imports System.IO

Public Class Form1
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Text = "C:\temp\output.txt"
        TextBox2.Multiline = True
        TextBox2.ScrollBars = ScrollBars.Both
        TextBox2.Text = "請在此輸入要寫入檔案的內容..."
        Label1.Text = "輸入內容後點擊寫入檔案"
    End Sub
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim filePath As String = TextBox1.Text
        Dim content As String = TextBox2.Text
        
        Try
            If String.IsNullOrEmpty(filePath) Then
                Label1.Text = "請輸入有效的檔案路徑"
                Label1.ForeColor = Color.Orange
                Return
            End If
            
            File.WriteAllText(filePath, content)
            Label1.Text = "檔案寫入成功:" & filePath
            Label1.ForeColor = Color.Green
        Catch ex As UnauthorizedAccessException
            Label1.Text = "沒有權限寫入此位置"
            Label1.ForeColor = Color.Red
        Catch ex As DirectoryNotFoundException
            Label1.Text = "指定的目錄不存在"
            Label1.ForeColor = Color.Red
        Catch ex As Exception
            Label1.Text = "寫入檔案時發生錯誤:" & ex.Message
            Label1.ForeColor = Color.Red
        End Try
    End Sub
End Class

此範例展示了檔案寫入的完整過程。程式首先檢查使用者是否輸入了有效的檔案路徑,然後使用 File.WriteAllText() 方法將文字方塊中的內容寫入指定檔案。特別注意的是例外處理部分,針對常見的錯誤情況如權限不足、目錄不存在等提供了具體的錯誤訊息,幫助使用者了解問題所在。如果指定的檔案不存在,此方法會自動建立新檔案;如果檔案已存在,則會完全覆蓋原有內容。

範例:複製和移動檔案

File 類別提供了 File.Copy() 和 File.Move() 方法來進行檔案的複製和移動操作。複製操作會在目標位置建立檔案的副本,而移動操作則會將檔案從原位置轉移到新位置,原始檔案將被刪除。

使用的控制項包括:Button1(複製檔案按鈕)、Button2(移動檔案按鈕)、TextBox1(來源檔案路徑)、TextBox2(目標檔案路徑)、Label1(顯示操作狀態)、CheckBox1(是否覆蓋現有檔案)。透過 CheckBox 讓使用者選擇是否覆蓋現有檔案。

Imports System.IO

Public Class Form1
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Text = "C:\temp\source.txt"
        TextBox2.Text = "C:\temp\destination.txt"
        CheckBox1.Checked = False
        CheckBox1.Text = "覆蓋現有檔案"
        Label1.Text = "請輸入來源和目標路徑"
    End Sub
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim sourceFile As String = TextBox1.Text
        Dim destFile As String = TextBox2.Text
        Dim overwrite As Boolean = CheckBox1.Checked
        
        Try
            If Not File.Exists(sourceFile) Then
                Label1.Text = "來源檔案不存在"
                Label1.ForeColor = Color.Red
                Return
            End If
            
            File.Copy(sourceFile, destFile, overwrite)
            Label1.Text = "檔案複製成功"
            Label1.ForeColor = Color.Green
        Catch ex As IOException
            Label1.Text = "複製失敗:" & ex.Message
            Label1.ForeColor = Color.Red
        Catch ex As Exception
            Label1.Text = "發生錯誤:" & ex.Message
            Label1.ForeColor = Color.Red
        End Try
    End Sub
    
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim sourceFile As String = TextBox1.Text
        Dim destFile As String = TextBox2.Text
        
        Try
            If Not File.Exists(sourceFile) Then
                Label1.Text = "來源檔案不存在"
                Label1.ForeColor = Color.Red
                Return
            End If
            
            File.Move(sourceFile, destFile)
            Label1.Text = "檔案移動成功"
            Label1.ForeColor = Color.Green
        Catch ex As IOException
            Label1.Text = "移動失敗:" & ex.Message
            Label1.ForeColor = Color.Red
        Catch ex As Exception
            Label1.Text = "發生錯誤:" & ex.Message
            Label1.ForeColor = Color.Red
        End Try
    End Sub
End Class

這個範例展示了檔案複製和移動的操作方法。複製操作使用 File.Copy() 方法,該方法有三個參數:來源路徑、目標路徑和是否覆蓋現有檔案。移動操作使用 File.Move() 方法,移動後原始檔案會被刪除。程式透過 CheckBox 讓使用者選擇是否覆蓋現有檔案。兩個操作都包含完整的錯誤檢查,確保來源檔案存在,並處理各種可能的例外情況。

檔案操作應用範例

以下是一個完整的應用程式範例,整合了多種檔案操作功能,展示如何在實際專案中使用 File 類別。這個範例建立一個簡單的檔案管理工具,包含檔案的基本操作功能,如檢視檔案資訊、讀取內容、寫入資料等。

範例:檔案管理工具

這個範例建立一個簡單的檔案管理工具,包含檔案的基本操作功能,如檢視檔案資訊、讀取內容、寫入資料等。程式包含四個主要功能按鈕,每個都對應不同的檔案操作。開啟檔案功能使用 File.ReadAllText() 讀取內容並顯示在文字方塊中。儲存功能使用 File.WriteAllText() 將編輯後的內容寫入檔案。

使用的控制項包括:TextBox1(檔案路徑輸入)、TextBox2(檔案內容顯示和編輯,多行)、Button1(開啟檔案按鈕)、Button2(儲存檔案按鈕)、Button3(顯示檔案資訊按鈕)、Button4(刪除檔案按鈕)、Label1(檔案路徑標籤)、Label2(檔案大小標籤)、Label3(修改時間標籤)、Label4(操作狀態標籤)。

Imports System.IO

Public Class Form1
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Text = "C:\temp\example.txt"
        TextBox2.Multiline = True
        TextBox2.ScrollBars = ScrollBars.Both
        TextBox2.Height = 200
        Label1.Text = "檔案路徑:未選擇"
        Label2.Text = "檔案大小:--"
        Label3.Text = "修改時間:--"
        Label4.Text = "請選擇檔案進行操作"
    End Sub
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim filePath As String = TextBox1.Text
        
        Try
            If File.Exists(filePath) Then
                Dim content As String = File.ReadAllText(filePath)
                TextBox2.Text = content
                Label1.Text = "檔案路徑:" & filePath
                Label4.Text = "檔案開啟成功"
                Label4.ForeColor = Color.Green
                UpdateFileInfo(filePath)
            Else
                Label4.Text = "檔案不存在:" & filePath
                Label4.ForeColor = Color.Red
                TextBox2.Text = ""
            End If
        Catch ex As Exception
            Label4.Text = "開啟檔案失敗:" & ex.Message
            Label4.ForeColor = Color.Red
        End Try
    End Sub
    
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim filePath As String = TextBox1.Text
        Dim content As String = TextBox2.Text
        
        Try
            File.WriteAllText(filePath, content)
            Label4.Text = "檔案儲存成功"
            Label4.ForeColor = Color.Green
            UpdateFileInfo(filePath)
        Catch ex As Exception
            Label4.Text = "儲存檔案失敗:" & ex.Message
            Label4.ForeColor = Color.Red
        End Try
    End Sub
    
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Dim filePath As String = TextBox1.Text
        UpdateFileInfo(filePath)
    End Sub
    
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Dim filePath As String = TextBox1.Text
        
        Try
            If File.Exists(filePath) Then
                File.Delete(filePath)
                Label4.Text = "檔案已刪除"
                Label4.ForeColor = Color.Orange
                TextBox2.Text = ""
                Label1.Text = "檔案路徑:未選擇"
                Label2.Text = "檔案大小:--"
                Label3.Text = "修改時間:--"
            Else
                Label4.Text = "檔案不存在,無法刪除"
                Label4.ForeColor = Color.Red
            End If
        Catch ex As Exception
            Label4.Text = "刪除檔案失敗:" & ex.Message
            Label4.ForeColor = Color.Red
        End Try
    End Sub
    
    Private Sub UpdateFileInfo(filePath As String)
        Try
            If File.Exists(filePath) Then
                Dim fileInfo As New FileInfo(filePath)
                Label2.Text = "檔案大小:" & fileInfo.Length.ToString() & " 位元組"
                Label3.Text = "修改時間:" & fileInfo.LastWriteTime.ToString()
                Label4.Text = "檔案資訊更新完成"
                Label4.ForeColor = Color.Blue
            Else
                Label2.Text = "檔案大小:--"
                Label3.Text = "修改時間:--"
                Label4.Text = "檔案不存在"
                Label4.ForeColor = Color.Red
            End If
        Catch ex As Exception
            Label4.Text = "取得檔案資訊失敗:" & ex.Message
            Label4.ForeColor = Color.Red
        End Try
    End Sub
End Class

這個完整的檔案管理工具展示了 File 類別的多種應用。程式包含四個主要功能按鈕,每個都對應不同的檔案操作。開啟檔案功能使用 File.ReadAllText() 讀取內容並顯示在文字方塊中。儲存功能使用 File.WriteAllText() 將編輯後的內容寫入檔案。檔案資訊功能透過 FileInfo 類別取得檔案的詳細屬性如大小和修改時間。刪除功能使用 File.Delete() 移除檔案。

特別值得注意的是 UpdateFileInfo() 私用方法,它被多個功能共用來更新檔案資訊顯示,體現了程式碼重用的概念。整個程式都包含完整的例外處理,確保各種錯誤情況都能得到適當的處理和使用者提示。

檔案操作錯誤處理

檔案操作時可能會遇到各種錯誤情況,適當的錯誤處理可以讓程式更加穩定可靠。以下範例展示如何處理常見的檔案操作例外情況,建立健全的錯誤處理機制,針對不同類型的例外提供適當的處理方式。

範例:完整的錯誤處理機制

這個範例示範了如何建立健全的錯誤處理機制,針對不同類型的例外提供適當的處理方式。程式會分別處理檔案不存在、目錄不存在、權限不足、輸入輸出相關等各種例外情況,並為每種錯誤提供明確的說明和建議解決方法。

使用的控制項包括:TextBox1(檔案路徑輸入)、TextBox2(檔案內容顯示)、Button1(測試檔案操作按鈕)、Label1(錯誤類型顯示)、Label2(錯誤訊息顯示)、Label3(建議解決方法顯示)。程式會根據不同的例外類型,在三個標籤中分別顯示錯誤類型、詳細訊息和建議的解決方法。

Imports System.IO

Public Class Form1
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Text = "C:\temp\test.txt"
        TextBox2.Multiline = True
        TextBox2.ScrollBars = ScrollBars.Both
        Label1.Text = "錯誤類型:無"
        Label2.Text = "錯誤訊息:無"
        Label3.Text = "建議解決方法:無"
    End Sub
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim filePath As String = TextBox1.Text
        ClearErrorMessages()
        
        Try
            Dim content As String = File.ReadAllText(filePath)
            TextBox2.Text = content
            Label1.Text = "狀態:操作成功"
            Label1.ForeColor = Color.Green
        Catch ex As FileNotFoundException
            HandleFileNotFound(filePath)
        Catch ex As DirectoryNotFoundException
            HandleDirectoryNotFound(filePath)
        Catch ex As UnauthorizedAccessException
            HandleUnauthorizedAccess(filePath)
        Catch ex As IOException
            HandleIOException(ex, filePath)
        Catch ex As ArgumentException
            HandleArgumentException(ex, filePath)
        Catch ex As Exception
            HandleGenericException(ex)
        End Try
    End Sub
    
    Private Sub ClearErrorMessages()
        Label1.Text = "錯誤類型:無"
        Label1.ForeColor = Color.Black
        Label2.Text = "錯誤訊息:無"
        Label2.ForeColor = Color.Black
        Label3.Text = "建議解決方法:無"
        Label3.ForeColor = Color.Black
    End Sub
    
    Private Sub HandleFileNotFound(filePath As String)
        Label1.Text = "錯誤類型:檔案不存在"
        Label1.ForeColor = Color.Red
        Label2.Text = "錯誤訊息:找不到指定的檔案"
        Label2.ForeColor = Color.Red
        Label3.Text = "建議解決方法:請檢查檔案路徑是否正確"
        Label3.ForeColor = Color.Blue
    End Sub
    
    Private Sub HandleDirectoryNotFound(filePath As String)
        Label1.Text = "錯誤類型:目錄不存在"
        Label1.ForeColor = Color.Red
        Label2.Text = "錯誤訊息:指定路徑的目錄不存在"
        Label2.ForeColor = Color.Red
        Label3.Text = "建議解決方法:請先建立相關目錄"
        Label3.ForeColor = Color.Blue
    End Sub
    
    Private Sub HandleUnauthorizedAccess(filePath As String)
        Label1.Text = "錯誤類型:存取權限不足"
        Label1.ForeColor = Color.Red
        Label2.Text = "錯誤訊息:沒有足夠權限存取此檔案"
        Label2.ForeColor = Color.Red
        Label3.Text = "建議解決方法:以系統管理員身分執行程式"
        Label3.ForeColor = Color.Blue
    End Sub
    
    Private Sub HandleIOException(ex As IOException, filePath As String)
        Label1.Text = "錯誤類型:輸入輸出錯誤"
        Label1.ForeColor = Color.Red
        Label2.Text = "錯誤訊息:" & ex.Message
        Label2.ForeColor = Color.Red
        Label3.Text = "建議解決方法:檢查檔案是否被其他程式使用"
        Label3.ForeColor = Color.Blue
    End Sub
    
    Private Sub HandleArgumentException(ex As ArgumentException, filePath As String)
        Label1.Text = "錯誤類型:路徑格式錯誤"
        Label1.ForeColor = Color.Red
        Label2.Text = "錯誤訊息:檔案路徑包含無效字元"
        Label2.ForeColor = Color.Red
        Label3.Text = "建議解決方法:請使用有效的檔案路徑格式"
        Label3.ForeColor = Color.Blue
    End Sub
    
    Private Sub HandleGenericException(ex As Exception)
        Label1.Text = "錯誤類型:未知錯誤"
        Label1.ForeColor = Color.Red
        Label2.Text = "錯誤訊息:" & ex.Message
        Label2.ForeColor = Color.Red
        Label3.Text = "建議解決方法:請聯絡系統管理員"
        Label3.ForeColor = Color.Blue
    End Sub
End Class

這個範例展示了完整的錯誤處理架構。程式使用多層次的 Catch 區塊來捕捉不同類型的例外,每種例外都有對應的處理方法。透過將錯誤處理邏輯分離到不同的私用方法中,程式碼變得更加清晰和可維護。每個錯誤處理方法都會更新三個標籤:錯誤類型、錯誤訊息和建議解決方法,為使用者提供清楚的問題診斷資訊。

這種結構化的錯誤處理方式可以應用到任何檔案操作程式中。透過詳細的例外分類和使用者友善的錯誤訊息,不僅能提高程式的穩定性,還能幫助使用者更好地理解和解決遇到的問題。

檔案操作最佳實務:

始終使用 Try-Catch 區塊包圍檔案操作程式碼,處理可能的例外情況。在進行檔案操作前先檢查檔案或目錄是否存在,可以避免許多錯誤。提供有意義的錯誤訊息,幫助使用者理解問題的原因和解決方法。避免在迴圈中頻繁進行檔案操作,這可能會影響程式效能。

考慮使用相對路徑或設定檔來管理檔案位置,增加程式的彈性。對於重要檔案,考慮建立備份機制以防資料遺失。注意檔案路徑中特殊字元的處理,避免路徑格式錯誤。當處理大型檔案時,考慮使用串流讀寫方式以節省記憶體使用量。