Странная, возможная “теневая копия” выходит, где два редактора показывают различное содержание

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

Это находится на Бизнесе Vista x64.

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

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

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

Блокнот

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

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

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

2
задан 25.09.2009, 14:53

2 ответа

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

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

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

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

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

6
ответ дан 08.12.2019, 05:33

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

0
ответ дан 08.12.2019, 05:33
  • 1
    Но как это объясняет, что textpad открытие файла и блокнота, открывающего тот же файл, получают другой текст? – Neil Barnwell 25.09.2009, 15:36
  • 2
    Textpad яблока файл, изменения приложений файл, Блокнот читает новый файл – Aaron Digulla 25.09.2009, 15:56
  • 3
    Если Ваше приложение работающее, то это поведение чрезвычайно нечетное. Устанавливает "ProcessExplorer", и использование "Находить дескриптор" с именем файла, когда Блокнот отказывающийся сохранить файл, чтобы находить процесс, который блокирующий его. – Aaron Digulla 25.09.2009, 16:28

Теги

Похожие вопросы