C#中的Process.Start方法出现“系统找不到指定的文件”错误

13

我面临一个愚蠢而棘手的问题。

以下代码运行良好(它启动计算器):

ProcessStartInfo psStartInfo = new ProcessStartInfo();
psStartInfo.FileName = @"c:\windows\system32\calc.exe";

Process ps = Process.Start(psStartInfo);

然而下面的SoundRecorder并不能正常工作,它会出现“系统找不到指定的文件”错误。

ProcessStartInfo psStartInfo = new ProcessStartInfo();
psStartInfo.FileName = @"c:\windows\system32\soundrecorder.exe";

Process ps = Process.Start(psStartInfo);

我可以使用开始菜单->运行->“c:\windows\system32\soundrecorder.exe”命令来启动声音录制器。

有任何想法是出了什么问题吗?

我正在使用Visual Studio 2015中的C#,并使用Windows 7操作系统。

更新1:我尝试了File.Exists检查,并从以下代码中显示了MessageBox:

if (File.Exists(@"c:\windows\system32\soundrecorder.exe"))
{
    ProcessStartInfo psStartInfo = new ProcessStartInfo();
    psStartInfo.FileName = @"c:\windows\system32\soundrecorder.exe";

    Process ps = Process.Start(psStartInfo);
}
else
{
    MessageBox.Show("File not found");
}

这两个代码对我来说都可以正常工作。 - Raktim Biswas
在尝试启动进程之前,您可以使用if(File.Exists(@"c:\windows\system32\soundrecorder.exe")来确保文件存在。 - Nkosi
2
我的操作系统是64位的Windows 7。@Rakitić,你也使用64位的操作系统吗? - kamleshrao
是的,我的也是64位的。 - Raktim Biswas
尝试使用以下代码行:ProcessStartInfo info = new ProcessStartInfo(@"C:\Windows\SysWOW64\soundrecorder.exe");,如@dxiv所说。 - Raktim Biswas
显示剩余3条评论
3个回答

25
很可能您的应用程序是32位的,在64位Windows中,对C:\Windows\System32的引用会被透明地重定向到C:\Windows\SysWOW64,供32位应用程序使用。calc.exe恰好存在于这两个位置,而soundrecorder.exe仅存在于真正的System32中。
当您从开始/运行启动时,父进程是64位的explorer.exe,因此不进行重定向,并且找到并启动64位的C:\Windows\System32\soundrecorder.exe
来自文件系统重定向器

在大多数情况下,每当32位应用程序尝试访问%windir%\System32时,访问都会被重定向到%windir%\SysWOW64。


[编辑] 同一页面:

32位应用程序可以通过将%windir%\Sysnative替换为%windir%\System32来访问本机系统目录。

因此,以下内容将起作用,从(真正的)C:\Windows\System32开始启动soundrecorder.exe

psStartInfo.FileName = @"C:\Windows\Sysnative\soundrecorder.exe";

有趣!这里有什么解决方法?我想从我的C#应用程序中运行内置的录音应用程序。 - kamleshrao
这是微软的KB文章,讨论了SYSNATIVE文档。https://support.microsoft.com/zh-cn/kb/942589 - kamleshrao
2
令人困惑的是,至今为止,32位Windows和64位Windows之间的“区别”仍然对Microsoft造成了无数的工程挑战。适当的解决方案非常简单。 - Bruce David Wilner
另一个解决方法似乎只需要在配置管理器中切换到x64。 - Jeremy Thompson

13

旧的线程,但提供了另一个可能的情况

在我的情况下,我在 Process.Start 内部使用参数。

System.Diagnostics.Process.Start("C:\\MyAppFolder\\MyApp.exe -silent");

我把它改成了

ProcessStartInfo info = new ProcessStartInfo("C:\\MyAppFolder\\MyApp.exe");
info.Arguments = "-silent";
Process.Start(info)

然后它起作用了。


1
这很有帮助。同时,你可以在Start方法中传递参数:System.Diagnostics.Process.Start($"{pathToExe}", someArgs); - Vladislav

3

还有一个类似于Ranadheer Reddy的答案的案例,但是不同之处足以让我困惑了一段时间。

我犯了一个简单的错误。我原本写成这样:

ProcessStartInfo info = new ProcessStartInfo("C:\\MyAppFolder\\MyApp.exe ");
info.Arguments = "-silent";
Process.Start(info);

看到应用程序路径末尾的空格了吗?是的,它不喜欢那个。如果你包含那个空格,它将找不到你的文件。
解决方法是删除多余的空格。然后它就能正常工作了。
如果你正在将应用程序从通过启动进程来启动“cmd.exe /c MyApp.exe -silent”转换为直接运行“MyApp.exe”,那么很容易犯这种错误,这也是我所做的。我希望在此记录我的不幸能够帮助未来的开发人员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接