C# 自動註冊自訂檔案類型

來源:互聯網
上載者:User

事實上有三種方式可以實現檔案類型的註冊,筆者在網上看到的都是手動實現的或程式實現的,其實也可以直接在工程屬性裡進行設定。

1. 工程屬性定義

項目--->工程屬性--->發布--->選項--->檔案關聯--->設定副檔名、說明、ProgID(自訂)、表徵圖即可。

 

2. 手工實現檔案類型關聯

每一個檔案類型的資訊被儲存在註冊表中的 'HKEY_CLASSES_ROOT'下面。假設我們自訂的檔案類型的尾碼為.hyp,檔案名稱為Test_File_Hype (中間不能有空格).

首先在HKEY_CLASSES_ROOT下建立 .hyp
HKEY_CLASSES_ROOT/.hyp

 

將[預設]索引值改為"Test_File_Hype"。然後在HKEY_CLASSES_ROOT下添加主鍵 Test_File_Hype
HKEY_CLASSES_ROOT/Test_File_Hype

按照下面的路徑添加新的主鍵
HKEY_CLASSES_ROOT/Test_File_Hype/Shell
HKEY_CLASSES_ROOT/Test_File_Hype/Shell/Open
HKEY_CLASSES_ROOT/Test_File_Hype/Shell/Open/Command

將下面的字元作為Command的索引值
     your application path.exe %1
     (例如 C:/WINDOWS/HYP/HYP.EXE %1)

或許你還想為自己的檔案類型加上同自己的執行檔案一樣的表徵圖,很簡單,照下面的方法添加就行了。
HKEY_CLASSES_ROOT/Test_File_Hype/DefaultIcon
輸入索引值:
     your application path.EXE,0
後面的零表示檔案的表徵圖同程式的主表徵圖一致,如果你的程式有很多表徵圖,換一換數字就可改變檔案顯

參考:http://www.codesky.net/article/doc/200308/2003082482622669.htm

 

3.  C#編程實現自訂檔案類型關聯應用程式

在我們自己編寫的應用中,經常會用自訂類型的檔案的來儲存與應用相關的資料,比如.xcf檔案就是XCodeFactory應用程式的專案檔。如果沒
有向Windows註冊表註冊該檔案類型,那麼.xcf檔案的表徵圖將是windows的檔案預設表徵圖,並且你雙擊一個a.xcf檔案,也不會自動啟動
XCodeFactory應用程式來載入a.xcf檔案。如何使.xcf檔案的表徵圖變成我自己喜愛的表徵圖、如何完成像點擊.doc檔案就自動開啟word
程式的功能,下面將告訴你解決方案。

    我們可以通過手動修改註冊表來完成上述任務,更好的方式是,通過程式來實現。這樣,在安裝應用程式時,就可以自動的註冊自訂檔案類型
了。我通過FileTypeRegister靜態類來完成這些功能。首先,將註冊需要用到的資訊封裝成FileTypeRegInfo,定義如下:

public class FileTypeRegInfo<br />{<br /> /// <summary><br /> /// 目標類型檔案的副檔名<br /> /// </summary><br /> public string ExtendName; //".xcf"<br /> /// <summary><br /> /// 目標檔案類型說明<br /> /// </summary><br /> public string Description; //"XCodeFactory專案檔"<br /> /// <summary><br /> /// 目標類型檔案關聯的表徵圖<br /> /// </summary><br /> public string IcoPath;<br /> /// <summary><br /> /// 開啟目標類型檔案的應用程式<br /> /// </summary><br /> public string ExePath;<br /> public FileTypeRegInfo()<br /> {<br /> }<br /> public FileTypeRegInfo(string extendName)<br /> {<br /> this.ExtendName = extendName;<br /> }<br />}

 

FileTypeRegister類主要是操作註冊表中的內容,實現如下:

 

/// <summary><br /> /// FileTypeRegister 用於註冊自訂的檔案類型。<br /> /// zhuweisky 2005.08.31<br /> /// </summary><br /> public class FileTypeRegister<br /> {<br /> #region RegisterFileType<br /> /// <summary><br /> /// RegisterFileType 使檔案類型與對應的表徵圖及應用程式關聯起來。<br /> /// </summary><br /> public static void RegisterFileType(FileTypeRegInfo regInfo)<br /> {<br /> if (FileTypeRegistered(regInfo.ExtendName))<br /> {<br /> return;<br /> }<br /> string relationName = regInfo.ExtendName.Substring(1, regInfo.ExtendName.Length - 1).ToUpper() + "_FileType";<br /> RegistryKey fileTypeKey = Registry.ClassesRoot.CreateSubKey(regInfo.ExtendName);<br /> fileTypeKey.SetValue("", relationName);<br /> fileTypeKey.Close();<br /> RegistryKey relationKey = Registry.ClassesRoot.CreateSubKey(relationName);<br /> relationKey.SetValue("", regInfo.Description);<br /> RegistryKey iconKey = relationKey.CreateSubKey("DefaultIcon");<br /> iconKey.SetValue("", regInfo.IcoPath);<br /> RegistryKey shellKey = relationKey.CreateSubKey("Shell");<br /> RegistryKey openKey = shellKey.CreateSubKey("Open");<br /> RegistryKey commandKey = openKey.CreateSubKey("Command");<br /> commandKey.SetValue("", regInfo.ExePath + " %1");<br /> relationKey.Close();<br /> }<br /> /// <summary><br /> /// GetFileTypeRegInfo 得到指定檔案類型關聯資訊<br /> /// </summary><br /> public static FileTypeRegInfo GetFileTypeRegInfo(string extendName)<br /> {<br /> if (!FileTypeRegistered(extendName))<br /> {<br /> return null;<br /> }<br /> FileTypeRegInfo regInfo = new FileTypeRegInfo(extendName);<br /> string relationName = extendName.Substring(1, extendName.Length - 1).ToUpper() + "_FileType";<br /> RegistryKey relationKey = Registry.ClassesRoot.OpenSubKey(relationName);<br /> regInfo.Description = relationKey.GetValue("").ToString();<br /> RegistryKey iconKey = relationKey.OpenSubKey("DefaultIcon");<br /> regInfo.IcoPath = iconKey.GetValue("").ToString();<br /> RegistryKey shellKey = relationKey.OpenSubKey("Shell");<br /> RegistryKey openKey = shellKey.OpenSubKey("Open");<br /> RegistryKey commandKey = openKey.OpenSubKey("Command");<br /> string temp = commandKey.GetValue("").ToString();<br /> regInfo.ExePath = temp.Substring(0, temp.Length - 3);<br /> return regInfo;<br /> }<br /> /// <summary><br /> /// UpdateFileTypeRegInfo 更新指定檔案類型關聯資訊<br /> /// </summary><br /> public static bool UpdateFileTypeRegInfo(FileTypeRegInfo regInfo)<br /> {<br /> if (!FileTypeRegistered(regInfo.ExtendName))<br /> {<br /> return false;<br /> }</p><p> string extendName = regInfo.ExtendName;<br /> string relationName = extendName.Substring(1, extendName.Length - 1).ToUpper() + "_FileType";<br /> RegistryKey relationKey = Registry.ClassesRoot.OpenSubKey(relationName, true);<br /> relationKey.SetValue("", regInfo.Description);<br /> RegistryKey iconKey = relationKey.OpenSubKey("DefaultIcon", true);<br /> iconKey.SetValue("", regInfo.IcoPath);<br /> RegistryKey shellKey = relationKey.OpenSubKey("Shell");<br /> RegistryKey openKey = shellKey.OpenSubKey("Open");<br /> RegistryKey commandKey = openKey.OpenSubKey("Command", true);<br /> commandKey.SetValue("", regInfo.ExePath + " %1");<br /> relationKey.Close();<br /> return true;<br /> }<br /> /// <summary><br /> /// FileTypeRegistered 指定檔案類型是否已經註冊<br /> /// </summary><br /> public static bool FileTypeRegistered(string extendName)<br /> {<br /> RegistryKey softwareKey = Registry.ClassesRoot.OpenSubKey(extendName);<br /> if (softwareKey != null)<br /> {<br /> return true;<br /> }<br /> return false;<br /> }<br /> #endregion<br /> }

 

要注意的是commandKey.SetValue("" ,regInfo.ExePath + " %1") ;其中" %1"表示將被雙擊的檔案的路徑傳給目標應用程式,這樣在雙擊a.xcf檔案時,XCodeFactory才知道要開啟哪個檔案,所以應用程式的Main方法要被改寫為帶有參數的形式,就像下面的樣子:

[STAThread]<br />static void Main(string[] args)<br />{<br /> if ((args != null) && (args.Length > 0))<br /> {<br /> string filePath = "";<br /> for (int i = 0; i < args.Length; i++)<br /> {<br /> filePath += " " + args[i];<br /> }<br /> MainForm.XcfFilePath = filePath.Trim();<br /> }<br /> Application.Run(new MainForm());<br />}

關於自訂檔案類型的註冊,本文實現的是最基本的功能,如果需要更多的進階功能,也可以類推實現之。

註:

(1)應用程式的Main方法在Program.cs檔案中,可以把原來無參的main方法注釋掉;

(2)MainForm就是應用程式的啟動表單,可以改為自己的

(3)filePath.Trim() 就是擷取的檔案路徑了

(4)using Microsoft.Win32;  //RegistryKey 位於 Microsoft.Win32 命名空間

(5)註冊檔案類型後,檔案表徵圖可能並不會立即生效(需登出登入或重啟Explorer進程)。我們可以採取重啟Explorer進程的方式使之立即生效,可參考樣本程式中的代碼。

 

我的一個執行個體:在Form_load事件中進行註冊:

private void Form1_Load(object sender, EventArgs e)<br /> {<br /> action = true;<br /> if (!FileTypeRegister.FileTypeRegistered(".hd")) //如果檔案類型沒有註冊,則進行註冊<br /> {<br /> FileTypeRegInfo fileTypeRegInfo = new FileTypeRegInfo(".hd"); //檔案類型資訊<br /> fileTypeRegInfo.Description = "巷道支護系統工程檔案";<br /> fileTypeRegInfo.ExePath = Application.ExecutablePath;<br /> fileTypeRegInfo.ExtendName = ".hd";<br /> fileTypeRegInfo.IcoPath = Application.ExecutablePath; //檔案表徵圖使用應用程式的<br /> FileTypeRegister fileTypeRegister = new FileTypeRegister(); //註冊<br /> FileTypeRegister.RegisterFileType(fileTypeRegInfo);</p><p> Process[] process = Process.GetProcesses(); //重啟Explorer進程,使更新立即生效<br /> var p = (from proc in process<br /> where proc.ProcessName.Equals("explorer")<br /> select proc).FirstOrDefault();<br /> p.Kill();<br /> }<br /> }

 

參考:http://www.chenjiliang.com/Article/View.aspx?ArticleID=527&TypeID=79

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.