Перенаправление файлов из данных Программы в AppData \ Local \ VirtualStore \ ProgramData - PullRequest
2 голосов
/ 03 апреля 2012

Я использую C # с .net 3.5

Я сохраняю данные моей программы в файле: C: \ Program Data \ MyProgramName \ fileName.xml

После установки и запуска моегоприложение, которое я однажды удалил (во время удаления я удаляю все файлы из «данных программы»), а затем переустанавливаю приложение и запускаю его.

Странно, что мое приложение запускалось так, как будтофайлы в данных программы существовали - значит, у меня были старые данные в моем приложении, хотя файл данных был удален.

При запуске:

File.Exists("C:\Program Data\MyProgramName\fileName.xml")

Я получил "истину", хотя я зналнаверняка, что файл не существует.

Эта вещь стала странной, когда я запустил приложение от имени администратора, а затем файл не существовал.

После исследования я обнаружил, что когдазапуск моего приложения без прав администратора вместо получения: «C: \ Program Data \ MyProgramName \ fileName.xml» Я получаю «C: \ Users \ userName \ AppData \ Local \ VirtualStore \ ProgramData \ MyProgramName \ fileName.xml"

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

Очевидно, что существует некоторый виртуальный путь к файлу в программеdata.

EDIT:

Я обнаружил, что после удаления старого файла в виртуальном хранилище мое приложение внезапно может найти нужный файл.(Я не вносил никаких изменений в файл в разделе «Данные программы».

Мой вопрос:

  1. , почему это происходит.
  2. Как я могу предотвратить это?от происходящего

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 03 апреля 2012

Вам на самом деле нужно записывать в папку данных программы для каждой системы вместо папок данных приложения для каждого пользователя?

Возможно, вы захотите взглянуть на Environment.GetFolderPath и следующие Environment.SpecialFolder с:

  • Environment.SpecialFolder.ApplicationData - папка данных для данных приложения, синхронизированная на контроллере домена, если профиль пользователя находится в роуминге
  • Environment.SpecialFolder.LocalApplicationData - папка данных для данных приложения, локальная и не синхронизированная (полезно, например, для кэшей)

EDIT:

Протестировано на Windows 7 x64, пользователь без прав администратора.

var appData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
var myFolder = Path.Combine(appData, "MyApp");
if(!Directory.Exists(myFolder)) Directory.CreateDirectory(myFolder);
File.WriteAllText(Path.Combine(myFolder, "Test.txt"), "Test.");

Это делает то, что ожидается, т.е. пишет в C:\ProgramData\MyApp\Test.txt. Насколько я могу судить (командная строка в режиме администратора), виртуализации UAC тоже не происходит.

Двойное редактирование:

Полагаю, произошло то, что в какой-то момент пользователь Администратор записал файлы в вашу папку ProgramData, и виртуализация файловой системы UAC включается и перенаправляет записи без прав администратора в VirtualStore.

Ваш деинсталлятор работает от имени администратора? Если это произойдет, вам может потребоваться проверить как VirtualStore путь для пользователя, который инициирует удаление, так и фактический путь к файловой системе для удаления данных программы. Я не уверен, есть ли официальный способ сделать это, хотя ...

3 голосов
/ 15 апреля 2012

Я нашел причину ошибки.

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

Я удалил эту строку, и теперь все работает простохорошо.

...