Проверьте, существует ли файл на 64-битной системе с помощью File.Exists

Моя ОС - 64 бита, а в папке C:\Windows\SysWOW64 есть файл 111.txt, но нет файла в c:\windows\system32

но следующий код возвращает true

file = @"C:\Windows\System32\111.txt";    
bool bExist = System.IO.File.Exists(file);

Я не знаю почему? и как я могу проверить, есть ли файл 111.txt под system32 не SysWoW64?

Ответ 1

Поскольку так много приложений имеют жестко закодированное имя каталога System32 в путях, MS помещает там 64-битные системные файлы, а не в каталог "System64". 32-разрядные версии теперь входят в каталог "SysWOW64" (это довольно запутанно). но для предотвращения разрыва 32-разрядных программ система выполняет перенаправление по умолчанию для 32-разрядных процессов, пытающихся получить доступ к каталогу "System32". В большинстве случаев, когда 32-битное приложение пытается получить доступ к% windir%\System32, доступ перенаправляется на% windir%\SysWOW64.

Простым способом обойти это перенаправление является использование % windir%\Sysnative вместо% windir%\System32. Win64 будет "перенаправлять" эту директорию в фактический каталог System32.

Вы можете использовать API Wow64DisableWow64FsRedirection(), чтобы полностью отключить это перенаправление. Подробнее см. http://msdn.microsoft.com/en-us/library/aa384187.aspx.

Ответ 2

32-битные процессы видят содержимое каталога C:\Windows\SysWOW64, когда они запрашивают каталог C:\Windows\System32.

Кроме того, при попытке сохранить файл в C:\Windows\System32 он попадет в папку C:\Windows\SysWOW64.

Однако, если вы не пишете программу типа установщика, вы, вероятно, вообще не хотите связываться с этими каталогами. Все двоичные файлы в C:\Windows\System32 являются 64-битными и не могут использоваться из 32-битных процессов. Поэтому запрос для них перенаправляется на C:\Windows\SysWOW64.

Изменить: если вы действительно хотите видеть файлы, используйте Wow64DisableWow64FsRedirection через PInvoke.