文件后綴名和文件類型是什么關系、改后綴是否可以改變文件格式?


結論前置:文件名和文件內容是獨立不相關聯的,而文件格式與文件內容是相關的。文件名后綴僅用於提供給系統 shell 一個關於文件類型的「暗示」。更改文件后綴名不會改變文件的「格式」,只會影響「系統默認打開這個文件的方式」。

文件是什么?

文件是存儲在系統存儲空間(如磁盤)中的一段數據。一個文件由一個特定程序創建,包含了對這個程序有特定含義的一段字節序列,因此每次這個程序打開這同一個文件的時候,獲取到的信息是一樣的。其它能夠與上述程序以同樣方式理解這段內容的程序也可以從這個文件中獲取完全一樣的信息。這個「理解這段內容的方法」就是文件格式。同一段內容可以有不同的解讀方法,那么我們可以認為它是同時屬於幾種有效格式。譬如下面一段

int main() {return 0;} 

全部由可讀的 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 系統在打開一個文件的時候,只根據文件名中的擴展名就可以找到對應的程序。第一段中的例子

int main() { return 0; } 


如果被命名為 hello.c,則系統可以調用 Visual C++ 打開;而如果命名為 hello.txt,則系統會調用記事簿打開。

這也就是為什么會有人認為,為什么改了一個文件的擴展名是更改了這個文件的類型。實際上發生了變更的只是這個文件在系統中的默認打開方式;如果文件本身內容不符合程序對文件內容格式的預期,仍然是會出錯的。

同時,如果有幾個擴展名都默認使用同一個程序打開,則文件擴展名與文件格式不符的情況能否正確打開取決於程序本身。如我將一個 .jpg 文件的擴展名改為 .png,而兩者默認打開方式都是某圖像瀏覽器,則系統仍然會調用這個圖像瀏覽器打開這個文件;而這個瀏覽器是否對文件內容和擴展名不匹配的情況作出兼容處理還是報錯,則完全取決於程序本身。

Windows 用戶有一個「令人震驚」的習慣,即:右鍵單擊桌面 -> 新建 -> 新建文本文件,然后將文件名改為 xxx.doc,雙擊打開。這個操作實際上只是提示 Word 去打開這個文件;而 Word 恰好對於一個剛創建的,內容完全為空(一個字符都沒有)的偽・doc 文件不報錯而已。這種「兼容性」實際上誤導了許多人對「文件名」和「文件格式」這個基本概念的理解(轉)

                                                                                        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM