什么叫文件類型關聯
所謂文件類型關聯,就是在Windows操作系統中,我們為某種文件類型(通過文件擴展名來識別)定義有關的操作關聯應用程序。例如,默認情況下,我們雙擊一個.xls文件,就會自動地打開計算機中安裝的Excel這個軟件;雙擊.doc文件,就會自動打開計算機安裝的Word這個軟件。以此類推。
很顯然,文件類型關聯是很重要的一項基礎功能,很多軟件在安裝的時候,都會自動地注冊與這個軟件有關的文件類型。例如我們上面提到的.xls這種文件類型,通常就是在安裝Excel這個軟件的時候,自動地完成注冊的。
由用戶手工定義文件類型關聯
文件類型是可以自動關聯(本文后續會討論),但如果沒有自動地進行關聯,那么Windows在我們嘗試打開該文件的時候,就會彈出一個對話框,讓用戶選擇要使用哪一個應用程序來打開。例如下面這樣
備注:這個截圖是在Windows 8中的效果,在Windows 7或者更早點版本中,界面可能略有不同。
用戶可以自己選擇一個應用程序,然后就可以用該應用程序打開該文件(如果確實可以的話);而如果用戶選擇了“Use this app for all .xxxx files”的話,那么以后此類文件都會直接使用該應用程序打開,而無需再選擇了。
那么,這到底是如何實現的呢?一定是在某個地方記錄好了這個信息,對吧?確實是如此的,Windows會通過注冊表的形式記錄好這種文件類型關聯信息,同時為了讓用戶查看方便,用戶可以在控制面板中,通過如下的界面看到所有的文件類型關聯信息。
這里既可以看到現有的關聯信息,但也可以修改。
通過安裝項目新建文件類型關聯
現在回過來,雖然用戶確實可以手工地進行關聯設置,但如果我們在部署應用程序的時候,能夠自動地完成這種關聯,當然是很好的。在Visual Studio 2010或者早期版本中,我們可以通過在安裝程序中添加文件類型注冊,這種功能來實現。
你可以通過如下的鏈接來了解如何操作:
http://msdn.microsoft.com/zh-cn/library/vstudio/s3a0ddk6(v=vs.100).aspx
http://msdn.microsoft.com/zh-cn/library/vstudio/93c8y383(v=vs.100).aspx
通過代碼實現文件類型關聯
上面這種通過安裝程序的做法,是很方便的,可以全方位地定義文件類型關聯,包括圖標,以及各種操作(新建,打開,編輯等等)。但是很遺憾的是,在Visual Studio 2012中,這個“安裝程序”項目模板已經被移除了。那么,如果我們想實現自定義的文件類型關聯,有沒有比較簡單的做法呢?
其實是有的,我之前就提到了,不管怎么樣,這些關聯信息是需要保存在注冊表中的。那么,如果我們覺得有必要的話,就可以通過代碼的形式來創建這些注冊表項。
在注冊表中,有兩個區域可以保存這些信息。
如果你希望某個文件關聯,只影響當前用戶的話,則可以在下面的注冊表位置進行注冊:HKEY_CURRENT_USER\Software\Classes
如果你希望某個文件關聯,影響到當前計算機上面所有用戶的話,則可以在下面的注冊表位置進行注冊:HKEY_LOCAL_MACHINE\SOFTWARE\Classes
那么,具體應該如何注冊呢?
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\.test] //首先為希望注冊的擴展名,新建一個Key
[HKEY_CURRENT_USER\Software\Classes\.test\shell] //然后再新建一個shell的Key
[HKEY_CURRENT_USER\Software\Classes\.test\shell\open] //然后再新建一個open的Key(open對應了打開操作)
[HKEY_CURRENT_USER\Software\Classes\.test\shell\open\command] //然后再新建一個command的Key
@="D:\\temp\\TestApplication\\TestApplication\\bin\\Debug\\TestApplication.exe %1" //為command這個Key默認設置為你的自定義應用程序,其中的%1是一個占位符,表示當前的文件路徑。
看起來是下面這樣的
既然我們搞清楚這個后台的數據結構,那么通過如下的代碼可以很容易地完成上述注冊。(事實上,你看到只需要1行代碼)
using Microsoft.Win32; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\.test\shell\open\command", "", "D:\\temp\\TestApplication\\TestApplication\\bin\\Debug\\TestApplication.exe %1"); } } }
那么,在目標的應用程序中,如何接收該文件信息呢?其實很簡單,%1就是那個文件的完整路徑,我們可以在Main方法的參數列表中得到這個信息,然后根據這個信息實現自定義的程序邏輯即可。