今天測試的時候無意間發現,打開通過寫註冊表關聯了程序的文件,如果文件名中存在空格,則無法通過雙擊打開。
經測試發現,原來是在Main方法入口點傳入的參數爲string[] 類型,當傳入帶空格的路徑時,會被分解成多個字符串存入string[] 數組中。由於Main的參數由註冊表關聯後直接傳入的,所以我沒法直接修改傳入的字符串參數,又不能避免文件路徑中不包含空格。該怎麼解決這個問題呢?我開始研究註冊表的文件關聯。這篇文章給我了很大的幫助:深入註冊表之文件關聯——文件關聯認識篇
先貼上我所用的文件關聯的代碼:
///<summary>
/// RegisterFileType使文件類型與對應的圖標及應用程序關聯起來。
/// </summary>
public static void RegisterFileType(FileTypeRegInforegInfo)
{
if(RegistryHelper.FileTypeRegistered(regInfo.ExtendName))
{
return;
}
string relationName = regInfo.ExtendName.Substring(1,regInfo.ExtendName.Length-1).ToUpper() + "_FileType" ;
RegistryKey fileTypeKey = Registry.ClassesRoot.CreateSubKey(regInfo.ExtendName);
fileTypeKey.SetValue("" ,relationName);
fileTypeKey.Close();
RegistryKey relationKey = Registry.ClassesRoot.CreateSubKey(relationName);
relationKey.SetValue("" ,regInfo.Description);
RegistryKey iconKey = relationKey.CreateSubKey("DefaultIcon");
iconKey.SetValue("" ,regInfo.IcoPath);
RegistryKey shellKey = relationKey.CreateSubKey("Shell");
RegistryKey openKey = shellKey.CreateSubKey("Open");
RegistryKey commandKey = openKey.CreateSubKey("Command");
commandKey.SetValue("" ,regInfo.ExePath + " %1") ;
relationKey.Close();
}
結合那篇文章的解釋,再看我的代碼,很容易就能理解,文件所關聯的程序及程序入口就在Shell→Open→Command鍵值中,其中regInfo.ExePath爲關聯程序存放的位置,而%1就是要傳入關聯程序的參數,也就是要打開的文件路徑。明白這個之後,問題便很容易解決了。因爲傳給Main的字符串參數只要加上雙引號“”,便不會被分隔。所以將參數%1用雙引號括起來問題便解決。修改如下:
commandKey.SetValue("" ,regInfo.ExePath + " \"%1\"") ;
因爲本身就是在引號內,所以加了個轉義字符\ 。經測試,完全正確,問題解決!