Запись диска C: в Windows 7/Vista

Я разрабатываю приложение, которое сохраняет свои настройки в папке установки. Если я устанавливаю приложение в Program Files на диске C: и пытаюсь записать файл настроек, я получаю исключение и все.

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

Мне нужна помощь в следующих вопросах:

  • Отредактируйте файл таким образом, чтобы по крайней мере отображалось предупреждение UAC, и если я отвечу да, файл станет доступным для записи.
  • Если нет возможности отредактировать файл на диске C: мне нужен способ хранения данных

Более общий вопрос будет таким:

Как создать программу C#, которая после ее установки в C:\Program Files\MyProgram под Windows Vista может манипулировать (создавать/редактировать/удалять) файлом .ini в каталоге установки? Этот файл должен быть одинаковым для всех пользователей.


person Germstorm    schedule 09.11.2009    source источник
comment
Вам нужны глобальные настройки (для всех пользователей), не так ли?   -  person Tarnay Kálmán    schedule 10.11.2009
comment
Да, именно это я и хочу сделать: одна единая настройка для всех пользователей   -  person Germstorm    schedule 09.05.2010


Ответы (5)


Почему бы вам не сохранить настройки в пользовательском месте, например C:\Users\Username\AppData?

Таким образом, разные пользователи могут иметь разные настройки на одном и том же компьютере. Кроме того, это рекомендуемое место для настроек и тому подобного.

person Ben S    schedule 09.11.2009
comment
@Henk: Да, пожалуйста, я не имел в виду, что это хорошая идея. - person Ben S; 10.11.2009
comment
Вы можете использовать SHGetFolderPath(), чтобы получить этот путь. - person asveikau; 11.12.2009

Опираясь на ответ Бена С., ознакомьтесь с Environment.GetFolderPath. метод.

Этот метод позволяет абстрагироваться от конкретного местоположения и просто использовать известный SpecialFolder (например, SpecialFolder.ApplicationData).

person akmad    schedule 09.11.2009

Тот факт, что вы получаете исключение, означает, что ваша программа каким-то образом поддерживает Vista/7. Я не совсем уверен, какой параметр (в проекте С#) вызывает это. Но если вы можете заставить свое приложение «притворяться», что оно является приложением XP, Vista позволит ему писать в теневой файл, расположенный в другом месте.

Но правильный способ получить доступный для записи путь, общий для всех пользователей:

string path = Environment.GetFolderPath(
    Environment.SpecialFolder.CommonApplicationData);
person Henk Holterman    schedule 09.11.2009

Я удивлен, что об этом еще не упоминалось, но жизнеспособный вариант C # — отказаться от файлов INI (фу) и использовать Средства настройки, предоставляемые .Net. Они очень хорошо работают во всех версиях Windows, напрямую поддерживаются Visual Studio и, наконец, могут быть переопределены как на уровне пользователя, так и на уровне компьютера.

У нас не было реальных проблем с использованием этой функции (включая развертывание XCopy, установленные приложения, Citrix и т. д.).

person user7116    schedule 09.11.2009
comment
Я полностью с вами согласен, но мой случай особенный: я ДОЛЖЕН использовать .ini, и этот файл должен быть одинаковым для всех пользователей. - person Germstorm; 10.11.2009
comment
Ой, я был в этой лодке несколько раз, незавидно. Я проголосовал за @Henk, так как у него один из лучших ответов. - person user7116; 10.11.2009
comment
Настройки не подходят для записываемых и общих данных. - person Henk Holterman; 12.11.2009

Основываясь на ответах Бена С. и Акмада, вы должны поместить файл ini в папку appDataFolder.

Если вы хотите, чтобы настройки были уникальными для каждого пользователя, создайте файл ini для каждого пользователя и поместите его в папку AppData, которую можно получить с помощью следующего кода:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Если вы хотите, чтобы настройки были общими для всех пользователей, но файл ini в общей папке AppData.

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
person epotter    schedule 11.12.2009