1. 前言
檔案 就是一塊資料,實際上存放在某個儲存裝置上:硬碟、SSD、隨身碟,甚至是軟碟(幫你阿公問聲好!)。對使用者來說,檔案就是可以打開、讀取、修改和儲存的東西。
在程式設計裡,檔案就是一串有名字和位置的位元組,而對你這個程式設計師來說,它就是一個有名字、有路徑(像地址)、大小、建立日期等等屬性的物件。最重要的是:檔案是一種 持久(不會消失)的資料儲存方式。程式執行時記憶體裡的東西,通常程式結束就沒了,但檔案會留下來。
什麼是檔案系統?
檔案系統 就是用來在磁碟上儲存和組織檔案的方法。它負責回答:檔案在哪裡、怎麼找、誰可以用、資料夾(目錄)怎麼設計、怎麼找到檔名和內容。
想像一個超大櫃子,裡面有很多抽屜。每個抽屜可以有資料夾,每個資料夾裡有文件(檔案)。你要找 C# 筆記,就要打開櫃子、找到抽屜、拿出資料夾,然後在裡面找到那張紙。檔案系統就是這樣幫你整理資訊的。
常見的檔案系統
- NTFS — Windows 的「原生」檔案系統。
- FAT32、exFAT — 用在隨身碟、SD 卡、外接硬碟。
- EXT4 — Linux 很常見。
- APFS、HFS+ — macOS。
對 C# 程式設計師來說通常沒差:.NET 幫你把細節都藏起來,你只要用「檔案/資料夾」這個抽象概念就好。但有時候知道一點還是有幫助。比如 NTFS 檔名可以有空格和很多特殊符號,FAT32 就不行。
2. 目錄(資料夾)是怎麼運作的
目錄(或資料夾)是一種特殊的檔案,裡面存著其他檔案和/或目錄的清單。目錄樹(檔案階層)就是你熟悉的從根目錄到檔案的路徑,比如 C:\Users\Иван\Documents\MyFile.txt。
- 根目錄 — 就是磁碟的最上層(C:\)。
- 裡面有資料夾(子資料夾),裡面可以放檔案或其他資料夾。
簡單圖示:
C:\
└── Users\
└── Иван\
├── Documents\
│ └── MyFile.txt
└── Pictures\
└── Cat.jpg
3. 什麼是檔案路徑(file path)?
檔案路徑 就是檔案在目錄樹裡的「地址」。靠它你才能精確找到要的檔案或資料夾。
絕對路徑和相對路徑
- 絕對路徑: 從檔案系統的根目錄開始。
Windows: C:\Users\Иван\Documents\MyFile.txt
Linux/macOS: /home/ivan/Documents/MyFile.txt - 相對路徑: 從目前的位置(目前目錄)開始。
比如你的程式是從 C:\Users\Иван 資料夾啟動的,那相對路徑 Documents\MyFile.txt 也會指向同一個檔案。
目前目錄 是個很特別的概念:它是所有相對路徑的「起點」。通常就是你 .exe 檔案所在的資料夾,或你開啟終端機時的位置。
圖解:絕對路徑 vs 相對路徑
絕對路徑 相對路徑
C:\Projects\MyApp\logs\output.txt logs\output.txt
└─ 磁碟根目錄 (C:) └─ 以 MyApp 啟動位置為基準
路徑分隔符號:\ 和 /
Windows 用反斜線(\),Linux/macOS 通常用正斜線(/)。
現在的 .NET 兩種都支援,但最好不要混用在同一個專案裡。要組合路徑時,記得用專門的 API(應用程式介面),不要自己手動拼字串。
4. 程式怎麼看檔案
.NET 有一堆工具可以處理檔案,最常用的有:
- System.IO.File:靜態方法,快速讀寫、刪除、檢查檔案有沒有存在等等。
- System.IO.Directory:跟資料夾有關的類似方法。
- System.IO.FileInfo 和 System.IO.DirectoryInfo:物件導向包裝,可以拿到檔案/資料夾的 metadata。
- System.IO.Path:處理路徑的好幫手(組合路徑、抓副檔名、檔名等等)。
來點範例
檢查檔案是否存在
using System.IO;
if (File.Exists("data.txt"))
{
Console.WriteLine("檔案找到了!");
}
else
{
Console.WriteLine("檔案沒找到!");
}
取得檔案大小
var info = new FileInfo("data.txt");
Console.WriteLine($"檔案大小:{info.Length} 位元組");
這些範例我們之後的課會細講。現在先看看就好,享受一下:)。
5. 實用小細節
檔案 metadata:名稱、副檔名、大小、日期等等
你在處理檔案時,不只會關心內容,還有「檔案的身分證」:
- 名稱 — 給人看的檔名。
- 副檔名 — .txt、.jpg、.exe、.cs 等等:有時候可以猜裡面是什麼。
- 大小 — 幾個位元組。
- 建立/修改時間 — 可以知道檔案什麼時候出現、最後一次改動。
- 屬性 — 例如:唯讀、隱藏、系統檔案。
.NET 處理這些很方便的類別有 FileInfo、DirectoryInfo(之後的課會講)。
副檔名和檔案格式
副檔名 就是檔名後面那一段。例如 document.txt 的副檔名是 txt。作業系統會用副檔名來決定要用什麼程式打開(像 .jpg 用圖片程式,.xls 用 Excel 等等)。
但對程式設計師來說,副檔名只是個提示。真正的 檔案格式 是看內容。你可以把 MyCat.jpg 當文字檔打開,看到一堆亂碼(奇怪的符號,絕對不是圖片)。所以要記得:副檔名不是保證,只是約定俗成。
檔案讀寫怎麼運作:基本概念
檔案就是一串位元組。C# 處理檔案通常會:
- 打開檔案 讀或寫(或兩者)。
- 讀取 資料到記憶體。
- 寫入 新資料到磁碟。
- 關閉 檔案 — 很重要,不然你會佔著系統資源(別人就不能刪這個檔案,因為你還開著)。
現在的 .NET API 很貼心:像 File 這個類別可以打開、讀完馬上關掉。但如果你用 stream(Stream)或處理大檔案時,這點要很小心(之後的課會講)。
跨平台要注意什麼
現在的 C# 幾乎在 Windows、Linux、macOS 都一樣跑。但還是有些小差異。最常見的就是分隔符號(\ vs /),還有檔名長度和禁止的符號。
所以像 Path.Combine 這種 API 和 System.IO.Path 裡的方法就是你的好朋友。它們會幫你在任何作業系統都組出正確的路徑。千萬不要這樣寫:
var filePath = "C:\\Users\\Ivan\\data.txt"; // 只適用 Windows!
應該這樣:
var filePath = Path.Combine("Users", "Ivan", "data.txt");
怎麼知道目前工作目錄?
有時候你要知道檔案到底會存在哪裡。這時有個專用類別:
string currentDir = Environment.CurrentDirectory;
Console.WriteLine($"目前目錄:{currentDir}");
對了,如果要讓使用者選路徑,記得用檔案/資料夾選擇對話框或指令列參數。
GO TO FULL VERSION