2016-07-30 418 views
2

这是我面对的一个愚蠢和棘手的问题。C#中的Process.Start系统找不到指定的文件错误

下面的代码工作得很好(它会启动计算器):

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"); 
} 
+0

为了安全起见,请正确使用路径。 ' “C:\ WINDOWS \ SYSTEM32 \ soundrecorder.exe”'。你有没有确定在浏览器中查看该文件存在? 'System.IO'中的'File.Exists()'是什么意思? –

+0

这两个代码适合我。 –

+0

你可以做一个'if(File.Exists(@“c:\ windows \ system32 \ soundrecorder.exe”)'以确保该文件在尝试启动该进程之前已存在。 – Nkosi

回答

7

最有可能您的应用程序是32位,而在64位Windows引用C:\Windows\System32 GET透明地重定向到C:\Windows\SysWOW64 32位应用程序。 calc.exe恰好存在于两个地方,而soundrecorder.exe只存在于真实的System32中。

当您从Start/Run启动时,父进程是64位explorer.exe,因此没有进行重定向,并且找到并启动了64位C:\Windows\System32\soundrecorder.exe

File System Redirector

在大多数情况下,每当一个32位的应用程序试图访问%WINDIR%\ System32下,访问将被重定向到%WINDIR%\ Syswow64资料。


[编辑]从相同的页面:

32位应用程序可以通过替换%WINDIR访问本地系统目录%\ Sysnative为%WINDIR%\ System32中。

因此,以下工作将从(真实)C:\Windows\System32开始soundrecorder.exe

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

有趣的是!这里的解决方法是什么?我想运行内置的录音机应用程序从我的C# – kamleshrao

+1

SYSNATIVE窍门工作!感谢您的帮助 – kamleshrao

+0

这里是微软知识库文章谈SYSNATIVE文档。https://support.microsoft.com/en-us/kb/942589 – kamleshrao

相关问题