結論前置:檔名和檔案內容是獨立不相關聯的,而檔案格式與檔案內容是相關的。檔名字尾僅用於提供給系統 shell 一個關於檔案型別的「暗示」。更改檔案字尾名不會改變檔案的「格式」,只會影響「系統預設開啟這個檔案的方式」。檔案是什麼?檔案是儲存在系統儲存空間(如磁碟)中的一段資料。一個檔案由一個特定程式建立,包含了對這個程式有特定含義的一段位元組序列,因此每次這個程式開啟這同一個檔案的時候,獲取到的資訊是一樣的。其它能夠與上述程式以同樣方式理解這段內容的程式也可以從這個檔案中獲取完全一樣的資訊。這個「理解這段內容的方法」就是檔案格式。同一段內容可以有不同的解讀方法,那麼我們可以認為它是同時屬於幾種有效格式。譬如下面一段
結論前置:檔名和檔案內容是獨立不相關聯的,而檔案格式與檔案內容是相關的。檔名字尾僅用於提供給系統 shell 一個關於檔案型別的「暗示」。更改檔案字尾名不會改變檔案的「格式」,只會影響「系統預設開啟這個檔案的方式」。檔案是什麼?檔案是儲存在系統儲存空間(如磁碟)中的一段資料。一個檔案由一個特定程式建立,包含了對這個程式有特定含義的一段位元組序列,因此每次這個程式開啟這同一個檔案的時候,獲取到的資訊是一樣的。其它能夠與上述程式以同樣方式理解這段內容的程式也可以從這個檔案中獲取完全一樣的資訊。這個「理解這段內容的方法」就是檔案格式。同一段內容可以有不同的解讀方法,那麼我們可以認為它是同時屬於幾種有效格式。譬如下面一段
全部由可讀的 ASCII 字元組成,所以它是一個純文字檔案;但熟悉 C 語言的人都可以看出這是一段 C 程式碼;認為它是 C++ 程式碼一樣不會出錯。檔名是什麼?由於磁碟本身空間巨大,且有大量程式共同訪問,一段內容儲存在磁碟中可能不是連續的,可能位置會發生改變;且磁碟地址並非人類可以輕易理解的內容,所以有了檔名和路徑。檔名和路徑用於幫助人(透過程式)查詢到某個特定的檔案;同時檔名本身也可以作為一個「標籤」告訴使用者檔案的內容,比如 README.txt 可以看出是一份說明文件。副檔名 txt 的部分也是類似,它只是這個檔案的名字的一部分,用於告訴使用者「這是一個 txt 檔案」。副檔名有什麼用?一個程式通常(或,預設)以一種特定的方式去讀取使用者要求它讀取的檔案。譬如記事簿 notepad.exe 和 vi 編輯器會預設將使用者要求它開啟的檔案作為「純文字格式」開啟——即,檔案中所有內容都是 ascii 編碼、或其它系統預設編碼下可以直接被人類閱讀的文字。使用者開啟一個檔案的時候,可以是先進入某個程式再選擇開啟這個程式(File -> Open)或者在進入某個程式的時候同時開啟某個檔案(如 vi info.txt 命令);也可以透過在「檔案管理器」或者其它 shell 程式中「雙擊」這個檔案——讓系統幫助「找到」合適開啟這個檔案的方式。Windows 系統會根據副檔名部分,在一個數據庫中查詢「可以開啟這個副檔名檔案的程式」,譬如 .doc 可以用 Word 開啟,那麼使用者在雙擊一個 .doc 檔案的時候,系統會自動啟動 Word 程式,並通知 Word 去載入這個檔案。OS X 一方面參考檔案的副檔名,一方面會參考檔案的屬性(可執行許可權)和檔案內容(magic bits)去尋找合適的做法。從這裡可以看出,Windows 系統在開啟一個檔案的時候,只根據檔名中的副檔名就可以找到對應的程式。第一段中的例子如果被命名為 hello.c,則系統可以呼叫 Visual C++ 開啟;而如果命名為 hello.txt,則系統會呼叫記事簿開啟。這也就是為什麼會有人認為,為什麼改了一個檔案的副檔名是更改了這個檔案的型別。實際上發生了變更的只是這個檔案在系統中的預設開啟方式;如果檔案本身內容不符合程式對檔案內容格式的預期,仍然是會出錯的。同時,如果有幾個副檔名都預設使用同一個程式開啟,則副檔名與檔案格式不符的情況能否正確開啟取決於程式本身。如我將一個 .jpg 檔案的副檔名改為 .png,而兩者預設開啟方式都是某影象瀏覽器,則系統仍然會呼叫這個影象瀏覽器開啟這個檔案;而這個瀏覽器是否對檔案內容和副檔名不匹配的情況作出相容處理還是報錯,則完全取決於程式本身。Windows 使用者有一個「令人震驚」的習慣,即:右鍵單擊桌面 -> 新建 -> 新建文字檔案,然後將檔名改為 xxx.doc,雙擊開啟。這個操作實際上只是提示 Word 去開啟這個檔案;而 Word 恰好對於一個剛建立的,內容完全為空(一個字元都沒有)的偽・doc 檔案不報錯而已。這種「相容性」實際上誤導了許多人對「檔名」和「檔案格式」這個基本概念的理解。-