C#アソシエーションのファイルパスにスペースが存在する問題解決
今日のテストでは、レジストリを書くことでプログラムに関連付けられたファイルが開き、ファイル名にスペースがある場合はダブルクリックで開くことはできません.テストにより、Mainメソッドのエントリポイントに入力されたパラメータはstring[]タイプであり、スペース付きパスを入力すると、string[]配列に複数の文字列に分解されることが分かった.Mainのパラメータはレジストリに関連付けられて直接入力されるため、入力された文字列パラメータを直接変更することはできません.また、ファイルパスにスペースが含まれないことは避けられません.この問題をどう解決すればいいですか.レジストリのファイル関連を検討し始めました.この文章は私に大きな助けを与えてくれました:レジストリのファイル関連に深く入り込む--ファイル関連認識編はまず私が使っているファイル関連のコードを貼ります:
その文章の解釈に合わせて、私のコードを見ると、簡単に理解できます.ファイルに関連するプログラムとプログラムの入り口はShell→Open→Commandキーの値の中にあります.その中でregInfo.ExePathは、関連プログラムが格納されている場所です.%1は、関連プログラムに転送するパラメータ、つまり開くファイルパスです.これがわかったら、問題は簡単に解決できます.Mainに渡される文字列パラメータは、二重引用符「」を付けるだけで区切られないからです.したがって、パラメータ%1を二重引用符で囲むと問題が解決します.次のように変更します.
それ自体が引用符に入っているので、エスケープ文字を付けました.テストして、完全に正確で、問題は解決します!
///
/// RegisterFileType 。
///
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\"") ;
それ自体が引用符に入っているので、エスケープ文字を付けました.テストして、完全に正確で、問題は解決します!