Странная, возможная проблема «теневого копирования», когда два редактора показывают разное содержимое

665
Neil Barnwell

У меня есть некоторый код, который читает файл конфигурации, но когда я открываю файл в 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
Можете ли вы опубликовать пример. Без подробностей будет трудно диагностировать проблему ChrisF 14 лет назад 0
Также спрашивается о Stackoverflow - http://stackoverflow.com/questions/1476870/strange-possible-shadow-copy-issue-where-two-editors-show-different-contents ChrisF 14 лет назад 0
Если вы пометите XML как код, он должен быть опубликован как есть. ChrisF 14 лет назад 0

2 ответа на вопрос

6
Ryan Bolger

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

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

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

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

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

0
Aaron Digulla

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

Но как это объясняет, что текстовый блокнот, открывающий файл, и блокнот, открывающий один и тот же файл, получают разный текст? Neil Barnwell 14 лет назад 0
Textpad читает файл, приложение меняет файл, Notepad читает новый файл Aaron Digulla 14 лет назад 1
Если ваше приложение не работает, то это поведение очень странно. Установите «ProcessExplorer» и используйте «Find handle» с именем файла, когда Notepad отказывается сохранять файл, чтобы найти процесс, который его блокирует. Aaron Digulla 14 лет назад 0