繁体   English   中英

File.Exists 返回false,Process.Start() 无法启动文件,但它确实存在

[英]File.Exists returns false,Process.Start() can't start the file,But it actually exists

注意:我的计算机上启用了 Windows 沙盒。

Console.WriteLine(File.Exists(@"C:\Windows\system32\WindowsSandbox.exe"));
Console.WriteLine(new FileInfo(@"C:\Windows\system32\WindowsSandbox.exe").Exists);

C# Interactive运行上述代码(VS 不在管理员模式下):

True
True

但是,当我在控制台应用程序中运行它时(管理员模式和非管理员模式)。结果总是错误的。

False
False

我尝试了Process.Start(@"C:\\Windows\\system32\\WindowsSandbox.exe") ,控制台应用程序失败(管理员和非管理员),但 C# 交互成功。

在powershell中, C:\\Windows\\system32\\WindowsSandbox.exe成功启动了Windows Sandbox。 在资源管理器中(system32 文件夹):图像

谁能解释为什么会发生这种情况?

文档

如果在尝试确定指定文件是否存在时发生任何错误,Exists 方法将返回 false。 这可能发生在引发异常的情况下,例如传递包含无效字符或过多字符的文件名、磁盘出现故障或丢失,或者调用方没有读取文件的权限。

查看正在发生的事情的一种方法是尝试读取文件(例如使用 File.OpenRead)。 如果成功,我会感到惊讶 - 但如果失败,异常应该为您提供更多信息。 还要从调用中检查运行命令时使用的身份(即cmd whoami等)

我不熟悉 Windows Sandbox,但听起来这是一个架构问题。

在 64 位 Windows 上, C:\\Windows\\system32是 64 位系统目录。 资源管理器和 PowerShell(您说它们都可以看到C:\\Windows\\system32\\WindowsSandbox.exe )将是 64 位进程,除非您竭尽全力运行 32 位版本。

在 32 位应用程序中,路径C:\\Windows\\system32重定向到 32 位系统目录C:\\Windows\\SysWOW64 既然你说你没有C:\\Windows\\SysWOW64\\WindowsSandbox.exe文件,你的应用程序也看不到(它认为是)一个C:\\Windows\\system32\\WindowsSandbox.exe文件,这表明你的应用程序是针对 32 位构建的。

因此,问题是没有 32 位版本的Windows Sandbox可供您的 32 位应用程序运行。 当您更改calc.exenotepad.exe的路径时,您的相同代码将起作用,因为 Windows 提供了这些可执行文件的 32 位和 64 位版本。 要让您的应用程序运行 64 位WindowsSandbox.exe ,您可以...

  • 构建它针对 64 位,或者更好......
  • 让它执行路径C:\\Windows\\sysnative\\WindowsSandbox.exe sysnative是一个特殊的别名,它允许 32 位应用程序无需重定向即可引用本机(64 位)系统目录。

至于为什么 Visual Studio 能够看到C:\\Windows\\system32\\WindowsSandbox.exe ,我真的无法解释。 这将取决于您使用的版本,但我的理解仍然是 32 位应用程序,尽管某些组件是 64 位是有意义的。 至于调试器等组件是否会以与操作系统或正在构建的应用程序相同的架构运行,我真的不知道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM