我正在创建一个应用程序,我将文件复制到用户的appdata,然后添加一个注册表项,以便文件在启动时运行。 我在运行时遇到URI异常。 这是给我带来麻烦的代码片段。
RegistryKey rk = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\My_Application");
if (rk != null)
{
//Do nothing as the program is already added to startup
}
else
{
string newpath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\My_Application\\" + "My_Application.exe";
File.Copy(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase.ToString(), Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\My_Application\\" + "My_Application.exe");
RegistryKey startup = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
startup.SetValue("My_Application", "\"" + newpath);
}
答案 0 :(得分:1)
问题出在startup.SetValue()
。您正在逃避"
个字符,我认为您想要逃避\
:
startup.SetValue("My_Application", "\\" + newpath);
如果你真的想要逃避"
,那么你可能需要双方一个:
startup.Setvalue("My_Application", "\"" + newpath + "\"");
或者通常这应该有用(我不太熟悉这个API)
startup.SetValue("My_Application", newpath);
答案 1 :(得分:1)
使用System.IO.Path.Combine进行路径连接。此外,请确保在复制之前存在目标目录。
string appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string newpath = System.IO.Path.Combine(appData, "My_Application", "My_Application.exe");
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(newpath));
File.Copy(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase.ToString(), newpath);
RegistryKey startup = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
startup.SetValue("My_Application", newpath);