C#关联程序的文件路径中存在空格的问题解决

时间:2022-09-04 16:27:25

今天测试的时候无意间发现,打开通过写注册表关联了程序的文件,如果文件名中存在空格,则无法通过双击打开。
经测试发现,原来是在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\"") ;

因为本身就是在引号内,所以加了个转义字符\ 。经测试,完全正确,问题解决!