Ответ 1
Если вы используете систему x64, у вас будет разное содержимое каталога c:\Windows\System32
для приложений x86 и x64. Убедитесь, что вы используете ту же архитектуру, в которой запущен командный файл и ваше приложение С#.
Использование VS 15, С# с .Net 4.5.2
Компьютер находится в сети AD с именем объявления "AD".
Эта проблема возникает с правами обычного пользователя AD, правами администратора AD и правами локального администратора. Неважно, какие права получает программа, возникает та же проблема.
Наш тестовый файл " C:/windows/system32/conhost.exe".
Файл выше существует, он очень существует. Я вижу это с исследователем.
Вы можете видеть, что он есть, верно?
Следующая команда cmd проверяет, существует ли файл:
IF EXIST "C:\windows\system32\conhost.exe" (echo does exist) ELSE (echo doesnt exist)
Он возвращает " существует", как и было обещано.
Следующий код С# проверяет, существует ли файл:
FileInfo file = new FileInfo("C:/windows/system32/conhost.exe");
MessageBox.Show(file.Exists + "");
Это возвращает " False".
Этот код также возвращает " False":
MessageBox.Show(File.Exists("C:/windows/system32/conhost.exe") + "");
Этот код также не находит его:
foreach (string file in Directory.GetFiles("C:/windows/system32/"))
{
//conhost is NEVER mentioned, like it doesn't exist
}
Этот код также не находит его:
foreach (string file in Directory.EnumerateFiles("C:/windows/system32/"))
{
//conhost is NEVER mentioned, like it doesn't exist
}
False, False, False:
MessageBox.Show(File.Exists("C:/windows/system32/conhost.exe") + "");
MessageBox.Show(File.Exists("C:\\windows\\system32\\conhost.exe") + "");
MessageBox.Show(File.Exists(@"C:\windows\system32\conhost.exe") + "");
Что я делаю неправильно?
Дополнительное примечание: я скопировал conhost в C:\conhost.exe, и моя программа может найти это без проблем. Моя программа также находит другие файлы в system32, просто не conhost и несколько других. Например, он находит "connect.dll", который находится в system32, так что это не разрешение на чтение каталога.
Дополнительные примечания: conhost.exe и connect.dll имеют одинаковые атрибуты безопасности (вкладка "Безопасность" в свойствах файла).
Если вы используете систему x64, у вас будет разное содержимое каталога c:\Windows\System32
для приложений x86 и x64. Убедитесь, что вы используете ту же архитектуру, в которой запущен командный файл и ваше приложение С#.
В документации MSDN для System.IO.File.Exists(путь) указано:
Если вызывающий абонент не имеют достаточных разрешений для чтения указанного файла, нет исключение выбрано, и метод возвращает false независимо от существование пути.
По этой причине мы можем с уверенностью предположить, что ваше приложение не имеет доступа для чтения к этому конкретному файлу. Проверьте настройки безопасности и предоставите доступ для чтения, если это еще не сделано.
Создайте приложение (в режиме выпуска) и запустите его как администратора.
Это проблема, возникающая в 64-битной операционной системе... вот обходной путь,
перейдите в свойства проекта> щелкните вкладку сборки> снимите флажок Предпочитать 32-битный
после этого он должен корректно работать на 64-битной ОС.