Запись диска C: в Windows 7 / Vista - PullRequest
2 голосов
/ 10 ноября 2009

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

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

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

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

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

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

Ответы [ 5 ]

9 голосов
/ 10 ноября 2009

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

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

5 голосов
/ 10 ноября 2009

Опираясь на ответ от Ben S, проверьте метод Environment.GetFolderPath .

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

2 голосов
/ 10 ноября 2009

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

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

string path = Environment.GetFolderPath(
    Environment.SpecialFolder.CommonApplicationData);
1 голос
/ 11 декабря 2009

Опираясь на ответы Ben S и akmad, вы должны поместить INI-файл в appDataFolder.

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

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

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

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
1 голос
/ 10 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...