Перенаправление файлов из данных Программы в AppData \ Local \ VirtualStore \ ProgramData

Я использую 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»

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

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

РЕДАКТИРОВАТЬ :

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

Мой вопрос:

почему это случилосьКак я могу предотвратить это

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

Ответы на вопрос(2)

Решение Вопроса

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

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

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

РЕДАКТИРОВАТЬ:

Протестировано на 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 путь для пользователя, который инициирует удаление, и фактический путь файловой системы для удаления данных программы. Я не уверен, есть ли официальный способ сделать это, хотя ...

 user84454103 апр. 2012 г., 20:30
прежде всего - спасибо! Правда в том, что у меня есть более одного файла под данными программы, но это единственный файл, который перенаправляется. Что касается вашего предположения - это звучит разумно, вы указали вескую причину для этого .. Я сделаю еще несколько исследований .. спасибо большое /
 user84454103 апр. 2012 г., 17:55
Да. Я должен .... это должно быть разделено между всеми пользователями. И я использую Environment.SpecialFolder.ApplicationData, чтобы получить правильный путь
 AKX03 апр. 2012 г., 18:07
@ user844541 - проверьте мои правки. Интересно, это как-то связано с этим?

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

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

Ваш ответ на вопрос