歡迎您光臨本站 註冊首頁

新手學堂:詳細解析Linux系統的文件關聯

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

我們知道在Windows下,雙擊一個可執行文件,文件管理器會自動運行這個應用程序.而雙擊一個數據文件時,文件管理器會用與之關聯的應用程序打開它.數據文件與應用程序之間的關聯是通過註冊表來實現的:文件管理器查詢註冊表,找到數據文件對應的應用程序,然後運行這個應用程序,並把數據文件的文件名作為命令行參數傳給它.

這種文件關聯的方式非常好用,省去了先起動應用程序再打開文件的麻煩.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和用戶目錄下,所有應用程序可以共享這些信息.在該目錄下,一般會有以下這些文件:

aliases:文件類型的別名.比如application/pdf 有時也稱為application/x-pdf .

magic:各種文件的內部標識,用於從文件內容來判斷文件類型.如BMP圖片文件以BM開頭.

globs:擴展名與文件類型的對應關係.如*.cpp文件是text/x-c src類型的.

packages目錄:用於安裝新文件類型用.

其它子目錄及其下的文件:更詳細的描述各種文件類型.比如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系統的文件關聯已經有317次圍觀

http://coctec.com/docs/linux/show-post-57289.html