System.IO.File.Exists (@ "C: \ Windows \ System32 \ SnippingTool.exe") возвращает false - PullRequest
5 голосов
/ 03 апреля 2012

Итак, я работаю над простой программой .NET для работы и наткнулся на странный блокпост, который я не могу понять.Приложение использует файл конфигурации, который добавляет приложения в выпадающее меню.Однако перед тем, как добавить его в меню, он создает файл system.io.file.exist, чтобы убедиться, что файл существует, по крайней мере, во время создания меню.

Однако System.IO.File.Exists (@ "C: \ Windows \ System32 \ SnippingTool.exe") возвращает false, но исполняемый файл есть.Аналогично, stikynot.exe также возвращает false.Другие файлы в каталоге system32 возвращают true (например, блокнот).Я могу подать эти приложения в файл, но моя программа .net просто не может их прочитать, а system.io.file.exists возвращает false.Я проверил различные разрешения без удачи.Кажется, он изолирован от нескольких приложений, но я не уверен, почему.

Ответы [ 2 ]

11 голосов
/ 03 апреля 2012

Это функция 64-битной Windows.

В x64 у вас есть две папки с системными файлами: system32 и SysWOW64 .

Если вы поместите что-нибудь в system32 , это будет видно всем 64-битным приложениям. SysWOW64 существует по соображениям совместимости - все, что там находится, будет видно 32-битным (sic!) Приложениям.

Итак, что касается .NET, файл не существует. Это работает для блокнота, потому что notepad.exe присутствует в обоих этих каталогах.

Вы можете проверить это поведение. Создайте текстовый файл в одном из каталогов, но не в другом, и проверьте его наличие. Затем измените конфигурацию проекта (щелкните правой кнопкой мыши на решении -> Configuration Manager) между x86 и x64 и наслаждайтесь результатом.

3 голосов
/ 25 июня 2015

У меня сумасшедшая ошибка связана с этой темой.Спасибо ya23.

В моем случае просто измените свойства проекта> Build> снимите флажок Prefer 32-bit

...