2

У меня есть некоторый код, который читает файл конфигурации, но когда я открываю файл в TextPad, я вижу другие значения, чем мое приложение. Я проверил это с помощью блокнота. Блокнот согласен с моим приложением, TextPad показывает что-то еще.

Это на Vista x64 Business.

Есть идеи, что может быть причиной этого? Я посмотрел в Context Menu->Properties->Previous Versions детали, но там написано "Нет доступных предыдущих версий".

Меня попросили привести пример, вот шаги для копирования (я не могу сделать это надежно):

  1. Установленное приложение .NET в программных файлах.
  2. Это приложение читает файл конфигурации, но падает.
  3. Я вручную редактирую этот файл конфигурации в Textpad.
  4. Изменение не вступает в силу.
  5. Я открываю файл конфигурации в блокноте и вижу что-то другое.
  6. Попробуйте внести изменения в Блокнот и сохранить, и получите это сообщение об ошибке:

Блокнот

Не удается создать файл C:\Program Files (x86)\Daniel Schaffer\WorkingOn для FogBugz\FogBugz> WorkingOn.exe.config.

Убедитесь, что путь и имя файла указаны правильно.

Я не могу разместить здесь контент, так как это XML и кодируется Superuser.com, но вот ссылка на скринкаст: http://screencast.com/t/zhERl7mocp4.

2 ответа2

6

Вы, вероятно, сталкиваетесь с частью функций UAC Vista под названием Virtual Store. Вот фрагмент из статьи:

Когда приложение выполняет запись в системную папку, доступную для записи только администраторам, Windows затем записывает все последующие файловые операции в пользовательский путь в каталоге Virtual Store, который находится по адресу% LOCALAPPDATA%\VirtualStore. Позже, когда приложение прочитает этот файл, компьютер предоставит его в виртуальном хранилище. Поскольку инфраструктура безопасности Windows обрабатывает виртуализацию без помощи приложения, приложение считает, что ему удалось успешно читать и записывать непосредственно в файлы программ. Прозрачность виртуализации файлов позволяет приложениям воспринимать, что они пишут и читают с защищенного ресурса, когда фактически получают доступ к виртуализированной версии.

Ваше приложение работает в контексте без повышенных прав (без прав администратора). Поэтому, когда он пытается открыть файл в папке Program Files, этот запрос прозрачно перенаправляется на ваши учетные записи виртуального магазина. Ваша копия TextPad , вероятно, работает в повышенном контексте и поэтому видит файл, который находится в реальной папке Program Files.

Если это ваш код, для которого вы можете изменить функциональность и хотите, чтобы пользователи могли использовать его без запуска с правами администратора, вам следует изменить местоположение, в котором вы храните ваши файлы конфигурации, где-нибудь в папке ApplicationData пользователя, к которой он принадлежит. Запись настроек в файл конфигурации, хранящийся в папке установки приложения, в настоящее время крайне не рекомендуется. Если у вас действительно есть настройки, которые должны применяться ко всем пользователям на машине, вы должны вместо этого записать их в папку «Все данные приложения пользователя». И даже в этом случае вам все равно придется запускать приложение в повышенном контексте по умолчанию, если вы явно не предоставите группе «Пользователи» право на запись в вашу папку.

Просто держите эту мантру в голове, когда вы пишете программное обеспечение для Vista и выше. «Пользователи могут писать только в свой профиль ...Пользователи могут писать только в свой профиль

0

Причина, по которой Блокнот не может создать файл, заключается в том, что другой процесс блокирует его. Поскольку содержимое файла изменяется, я предполагаю, что приложение записывает файл, а вы смотрите на него.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .