From:http://blog.csdn.net/absurd/
我們知道在Windows下,雙擊一個可執行檔,檔案管理工具會自動運行這個應用程式。而雙擊一個資料檔案時,檔案管理工具會用與之相關 App程式開啟它。資料檔案與應用程式之間的關聯是通過註冊表來實現的:檔案管理工具查詢註冊表,找到資料檔案對應的應用程式,然後運行這個應用程式,並把資料檔案的檔案名稱作為命令列參數傳給它。
這種檔案關聯的方式非常好用,省去了先起動應用程式再開啟檔案的麻煩。Linux下的案頭環境也有類似的功能,而且實現方式更合理。最近負責開發一個資源管理員,本來GNOME有一個功能強大的資源管理員Nautilus,只是它過於龐大,不但有超過10萬行的代碼,還依賴於libgnome、gnome-vfs和CORBA等,故不適合於嵌入式應用。最終我們決定自己開發一個簡化的資源管理員,但又要盡量相容現有的應用程式,這要瞭解相關標準,檔案關聯方式是其中之一。把這幾天學到的知識做個筆記吧,供有興趣的朋友參考:
首先讓我們看看檔案關聯要做些什麼。
1.
資料檔案與應用程式的關聯。一個應用程式通常只能開啟一些特定的資料檔案,比片瀏覽工具可以開啟PNG、BMP和JPEG等圖片檔案。開啟一詞的意義比較寬泛,這裡包括:開啟、播放、安裝、編輯和列印等等。
2.
檔案類型資訊。資源管理員把資料檔案列出來時,通常會用一個表徵圖來標識這類檔案,同時也會加上一個簡短的名稱,以便使用者可以很容易把它與其它類型的檔案區分開來。
下面我們看看linux下是如何?的。
1.
判斷檔案類型。檔案的數量是無限的,我們只能按檔案類型來處理。如何判斷一個檔案所屬的檔案類型呢?可能有人會說,很簡單,用副檔名區分就行了。沒錯,用副檔名可以做到,但這種方法有兩個缺陷:一方面它不是很精確,相同副檔名的檔案的類型可能完全不同,比如dat檔案,可能是一個視頻檔案,也可能是一個普通資料檔案。另一方面它不是很準確,副檔名可以任何改動,為了某種目的,完全可以把exe副檔名改為htm副檔名。
而且在Linux下副檔名只是一個可選項,很多檔案根本沒有副檔名,所以純粹採用副檔名的方式來判斷肯定是不行的。為了更好的判斷檔案類型,在linux下同時採用兩種方式:優先採用magic方式,其次才採用副檔名方式。所謂magic方式,就是根據檔案內容來判斷。絕大多數檔案,內部都有一些特定的標記,這些標記稱為magic,比如BMP圖片檔案以BM兩個字元開頭,BM就是一個magic。雖然即使採用了雙保險機制也有誤判的可能,但機率已經大大降低了。
2. 檔案類型的表示。
檔案類型如何表示呢?我們說JPEG是圖片檔案,說txt是文字檔,WML是XML檔案。這種分類很直觀,但也有幾個問題:對JPEG檔案來說,稱它圖片檔案太籠統了。有的圖片瀏覽工具雖然能夠開啟大部分圖片檔案,但不一定能開啟所有圖片檔案,它需要更詳細的檔案類型資訊。對txt和WML來說,它們其實都是文字檔,有的編輯器可能以同樣的方式處理它們。為了避免分類太細或者太粗,linux採用了MIME(可以參考相關RFC)規範,它用一種層次型的方式來分類,如:
JPEG檔案:image/jpeg
文字檔:text/plain
XML檔案:text/xml
這種分類方式就可以粗細兼顧了。
3. 檔案類型的資料資訊。
在linux下,關於檔案類型的資訊通常放在/usr/share/mime、/usr/local/share/mime和使用者目錄下,所有應用程式可以共用這些資訊。在該目錄下,一般會有以下這些檔案:
l aliases:檔案類型的別名。比如application/pdf
有時也稱為application/x-pdf 。
l
magic:各種檔案的內部標識,用於從檔案內容來判斷檔案類型。如BMP圖片檔案以BM開頭。
l
globs:副檔名與檔案類型的對應關係。如*.cpp檔案是text/x-c++src類型的。
l packages目錄:用於安裝新檔案類型用。
l
其它子目錄及其下的檔案:更詳細的描述各種檔案類型。比如image下的jpeg.xml檔案描述了jpeg檔案類型。為了方便國際化,這些描述資訊有各種語言版本。
4. 表徵圖檔案與資料檔案的關聯。
在資源管理員中,通常用不同的表徵圖來區分不同的檔案類型。同時表徵圖也是桌面主題相關的,主題不同,表徵圖的大小和外觀也不一樣。表徵圖檔案通常存放在/usr/share/icons/主題/大小/mimetypes目錄下。
檔案類型與表徵圖檔案的對應關係是通過檔案名稱來實現的。比如,JPEG檔案對應的表徵圖檔案為gnome-mime-image-jpeg.png。
(這塊不是很確定,有待進一步研究)
5. 應用程式與資料檔案的關聯。
應用程式與資料檔案的關聯是通過.desktop檔案來實現的。應用程式要出現在開始菜單中或者案頭上,它要提供一個desktop檔案才行。應用程式安裝之後,desktop檔案通常安裝到/usr/share/applications下。
可以在desktop檔案中,指明其可以操作的檔案類型。如,軟體包安裝程式可以操作rpm檔案,它的desktop檔案(system-install-packages.desktop)內容為:
[Desktop Entry]
Name=Install Packages
GenericName=Install Packages
Comment=Install new packages on the system
MimeType=application/x-rpm;
Exec=/usr/bin/system-install-packages %F
Terminal=false
Type=Application
Icon=system-config-packages.png
Encoding=UTF-8
NoDisplay=true
MimeType項指明它可以操作rpm類型的檔案。
Linux比windows的做法科學之處。
1. Linux採用了雙保險機制,對檔案類型的判斷更正確,出錯的機率更小。
2.
Linux分離檔案類型判斷資訊和檔案關聯方式,這樣檔案類型資訊可以被重用。比如file命令可以用這些資訊來判斷檔案類型,而不必開啟它。
參考資料:
http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-0.13.html
http://www.freedesktop.org/wiki/Standards_2fAddingMIMETutor