Файл не найден в% TEMP% на Win7 - PullRequest
2 голосов
/ 29 июня 2010

У меня странная ошибка, из-за которой мой код возвращает исключение файла, не найденного, но, похоже, файл именно там, где и должен быть. В моем проекте есть некоторый код для запуска системного командлета и поиска результатов командлета в выходном файле XML. Мы говорим командлету поместить этот выходной XML в пользовательский подкаталог системного каталога TEMP, например, C: \ WINDOWS \ TEMP \ SomeFolder \ output.xml. Затем мы используем класс .NET XmlDocument для открытия и анализа файла XML.

На WinXP это работает. На моем Dev Box это работает. На чистой тестовой машине Win7 это не так.

Моей первой мыслью было, что я запускаю виртуализацию файлов в Vista / Win7, но манифест нашего приложения указывает, что наше приложение запускается от имени администратора - и из того, что я прочитал, это должно обойти виртуализацию файлов.

Другая проблема заключается в том, что нашему коду нравится использовать пути к файлам UNC, даже если файл является локальным для машины. (У нас есть требование, чтобы в рассматриваемом коде мог выполняться командлет на удаленной машине, и, следовательно, выходной XML мог бы быть и на удаленной машине.) Поэтому мы пытаемся открыть файл XML через \ MATT-WIN7 \ C $ \ WINDOWS \ TEMP \ SomeFolder.xml вместо C: \ WINDOWS \ TEMP \ SomeFolder \ output.xml.

Но я временно удалил код пути UNC, и простой вызов File.Exists () по-прежнему говорит, что XML-файл не существует, когда проводник Windows показывает файл, находящийся именно там, где я думаю, должен быть.

Есть ли какой-то нюанс виртуализации файлов, о котором я еще не читал?

Мой обходной путь - переместить выходной xml-файл куда-нибудь еще, но это может нарушить «переносимость» нашего кода, когда он должен выполняться на удаленной машине, потому что использование расположения% TEMP% - это расположение, которое может быть разрешается для удаленных компьютеров довольно легко (через удаленный вызов реестра, чтобы найти системную переменную среды).

Я бы предпочел оставить файл там, где он есть, и исправить наш код, чтобы он действительно находил файл!

1 Ответ

6 голосов
/ 29 июня 2010

Существует пользовательское переопределение для переменной среды% TEMP%, которое указывает на %USERPROFILE%\AppData\Local\Temp, а не %SYSTEMROOT%\Temp. Убедитесь, что ваш код находится во временной папке, на которую вы рассчитываете.

Обновление : Судя по вашим комментариям, проблема в том, что ваше приложение на самом деле не повышено на тестовом компьютере, а на вашем компьютере разработчика Я подозреваю следующее:

  • У вас либо отключено UAC на вашем компьютере разработчика, либо вы используете VS в качестве администратора. Большой нет-нет на обоих. :-)
  • Ваш двоичный файл не имеет кодовой подписи и не находится в одном из двух надежных расположений -% SystemRoot% \ system32 или% ProgramFiles%. По соображениям безопасности UAC даже не запрашивает у пользователя повышения прав для приложений, которые имеют манифест повышения, но не имеют кодовой подписи или находятся в надежном расположении.

Вы можете создать самозаверяющий сертификат для кодовой подписи вашего двоичного файла и добавить этот сертификат на тестовые машины, чтобы получить приглашение UAC. Как только вы подтвердите, что ваше приложение должным образом обновлено, ваш код для доступа к системной папке% TEMP% должен работать правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...