CodeGym /課程 /C# SELF /檔案、檔案系統與路徑的概念

檔案、檔案系統與路徑的概念

C# SELF
等級 35 , 課堂 0
開放

1. 前言

檔案 就是一塊資料,實際上存放在某個儲存裝置上:硬碟、SSD、隨身碟,甚至是軟碟(幫你阿公問聲好!)。對使用者來說,檔案就是可以打開、讀取、修改和儲存的東西。

在程式設計裡,檔案就是一串有名字和位置的位元組,而對你這個程式設計師來說,它就是一個有名字、有路徑(像地址)、大小、建立日期等等屬性的物件。最重要的是:檔案是一種 持久(不會消失)的資料儲存方式。程式執行時記憶體裡的東西,通常程式結束就沒了,但檔案會留下來。

什麼是檔案系統?

檔案系統 就是用來在磁碟上儲存和組織檔案的方法。它負責回答:檔案在哪裡、怎麼找、誰可以用、資料夾(目錄)怎麼設計、怎麼找到檔名和內容。

想像一個超大櫃子,裡面有很多抽屜。每個抽屜可以有資料夾,每個資料夾裡有文件(檔案)。你要找 C# 筆記,就要打開櫃子、找到抽屜、拿出資料夾,然後在裡面找到那張紙。檔案系統就是這樣幫你整理資訊的。

常見的檔案系統

  • NTFS — Windows 的「原生」檔案系統。
  • FAT32exFAT — 用在隨身碟、SD 卡、外接硬碟。
  • EXT4 — Linux 很常見。
  • APFSHFS+ — 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.FileInfoSystem.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 處理這些很方便的類別有 FileInfoDirectoryInfo(之後的課會講)。

副檔名和檔案格式

副檔名 就是檔名後面那一段。例如 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}");

對了,如果要讓使用者選路徑,記得用檔案/資料夾選擇對話框或指令列參數。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION