【问题标题】:Check File.Exists in System32 with Sysnative and %windir% from 32-bit app C#检查 File.Exists in System32 with Sysnative and %windir% from 32-bit app C#
【发布时间】:2018-04-20 13:14:57
【问题描述】:

我在 C# 中创建了一个 32 位应用程序。因为它是 32 位的,所以它不能访问 64 位的位置,例如 C:\Windows\System32。要访问 64 位位置,我知道我需要改用 C:\Windows\Sysnative。

我想检查 System32 中是否存在文件。我在那里放置了一个文件,并且可以在我的文件资源管理器中查看它,所以我知道它存在。

但是,当我使用以下代码时,File.Exists 方法总是返回 false。 Sysnative 似乎根本没有重定向。如何使用 File.Exists 和 %windir% 和 Sysnative 从 32 位应用程序中查找 System32 中的文件?

string fileName = "someFile.dll";
string path = Environment.ExpandEnvironmentVariables(@"%windir%\Sysnative\" + fileName);
//path should be 'C:\Windows\System32\'+fileName;

bool fileExists = File.Exists(path); //Always returns false

【问题讨论】:

  • 如果您还在文件名中包含文件扩展名,这应该可以工作。
  • @JohnEphraimTugado 是的,包含文件扩展名。编辑原始帖子以更清晰。我的印象是,将 %windir%、Sysnative、Environment.ExpandEnvironmentVariable 和 File.Exists 一起使用是一种奇怪的组合。但这似乎不是一个非常特殊的情况——如果这是一个问题,肯定有人在某个地方记录了它吗?
  • 您确定您的应用程序编译为 32 位吗?不是AnyCpu?您的代码应该可以工作。

标签: c# windows 32bit-64bit system32


【解决方案1】:

我做了一个快速测试,结果证明如果您使用的是 x64,那么 fileExists 返回 False 而对于 x86 和任何 CPU,它返回 True。至于原因,我不知道,但既然您打算在 32 位应用程序上使用它,那么只需使用 x86。确保选择 x86,以免任何 CPU 误选 x64。

eryksun:

原因很简单,“SysNative”不是一个真正的目录。它得到 通过 WOW64 仿真重定向到真正的“System32”目录 系统。仅通过 WOW64 在 64 位 Windows 上运行的 32 位应用程序 可以使用这个虚拟目录。在 32 位上运行的 32 位应用程序 Windows 无法使用“SysNative”,因此即使在 一个 32 位应用程序。

代码

class Program
{
    static void Main(string[] args)
    {
        string fileName = "aeevts.dll";
        string path = Environment.ExpandEnvironmentVariables(@"%windir%\Sysnative\" + fileName);
        //path should be 'C:\Windows\System32\'+fileName;

        Console.WriteLine(path);

        bool fileExists = File.Exists(path); //Always returns false

        Console.WriteLine(fileExists);

        Console.Read();
    }
}

属性

OP

在任何 CPU 上运行,仅当您选中了“首选 32 位”时 平台目标(见上面的截图)将 Sysnative 工作和 File.Exists 返回 true

x86/任何 CPU 输出

x64 输出

【讨论】:

  • 原因很简单,“SysNative”不是一个真正的目录。它被 WOW64 仿真系统重定向到真正的“System32”目录。只有通过 WOW64 在 64 位 Windows 上运行的 32 位应用程序才能使用此虚拟目录。在 32 位 Windows 上运行的 32 位应用程序无法使用“SysNative”,因此即使在 32 位应用程序中也必须尝试“System32”。
  • 我明白了。因此,如果 OP 计划在 32 位机器上运行它,那么他不能使用“SysNative”。他应该改用“System32”,因为 32 位机器没有 WOW64 仿真系统。对我来说很有意义。
  • 约翰,在你和 eryksun 之间,这似乎是答案。但是,我还想指出,在任何 CPU 上运行,只有当您在平台目标上选中“首选 32 位”(见上面的屏幕截图)时,Sysnative 才能工作并且 File.Exists 返回 true。我正在使用任何 CPU,但关闭了“prefer-32”并返回 false,当我打开它时它变为 true。我认为你应该编辑你的答案以包括这个和 eryksun 的解释。 (:谢谢!
猜你喜欢
  • 2022-12-02
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-26
相关资源
最近更新 更多