Windows эквивалент каталога конфигурации системы - PullRequest
3 голосов
/ 02 марта 2010

Я разрабатываю приложение CLI в Ruby, и я хотел бы разрешить настройку в Unix через стандартный каскад файлов конфигурации /etc/appnamerc, ~/.appnamerc. Тем не менее, приложение также предназначено для запуска в среде Windows, и я не уверен, куда можно поместить файл типа /etc/appnamerc (C:\windows\system32\etc\drivers не похоже, что это будет правильное место). Кроме того, какую бы схему я ни выбрал для поиска файла конфигурации системы, необходимо учитывать разные версии Windows, то есть C:\Users против C:\Documents and Settings. Что касается конфигурации, специфичной для пользователя, я также не уверен, где мое приложение будет искать файл конфигурации для конкретного пользователя, и каково будет стандартное соглашение об именах для чего-то подобного.

Ответы [ 3 ]

2 голосов
/ 02 марта 2010

Windows определяет несколько специальных папок , к которым можно получить доступ с помощью API SHGetSpecialFolderPath . Я бы предложил использовать одну из этих папок.

Например, вот как получить общее местоположение папки приложения:

char szBuffer[1024];

// get the common application data folder
::SHGetSpecialFolderPath(0, szBuffer, CSIDL_COMMON_APPDATA, false);
1 голос
/ 02 марта 2010

Вам нужна функция SHGetKnownFolderPath (или - в более старых версиях Windows - функция SHGetFolderPath ).

Хотя в Windows существуют соглашения о том, что это за пути и где они находятся, это полностью зависит от версии, конфигурации и других факторов, поэтому жесткое кодирование имен папок является идеей плохой . Однако с самого начала эта функция позволяла получать эти «особые» местоположения папок.

Основным аргументом этих функций является либо KNOWNFOLDERID , либо CSIDL , которые указывают, какую папку вы хотите получить.

На самом деле у вас есть два разных «флага»: для пользователя и для компьютера в Windows. Местоположение может быть определенным для одного пользователя или доступным для всех пользователей, и оно может быть определенным для одного компьютера или быть доступным на всех машинах, к которым у пользователя есть доступ. Это будет различаться ниже.

Вот те, которые вам нужны здесь:

  • FOLDERID_ProgramData / CSIDL_COMMON_APPDATA: это для настроек программы для всех пользователей, поэтому приблизительно эквивалентно /etc/foorc. Там вы должны создать каталог для своей программы и сохранить там конфигурацию для всех пользователей. Обратите внимание, что этот каталог не доступен для записи обычным пользователям (я думаю, что /etc тоже). Этот каталог зависит от компьютера.
  • FOLDERID_RoamingAppData / CSIDL_APPDATA: для пользовательских настроек или данных приложения. Для большинства случаев использования это должно быть основным местом, где вы помещаете это, потому что это будет сохранено в перемещаемом профиле - поэтому это доступно на каждой машине, в которую входит пользователь. Так что это эквивалент вашего ~/.foorc. Применяются те же правила, что и для варианта для всех пользователей.
  • FOLDERID_LocalAppData / CSIDL_LOCAL_APPDATA: Это машинное местоположение для пользовательских данных. Обычно это следует использовать для таких вещей, как кэши, которые приятно иметь при себе, но не нужно копировать по сети каждый раз, когда пользователь входит в систему. Обратите внимание, что Thunderbird делает это очень неправильно при хранении локальной копии писем IMAP в перемещаемом профиле - это довольно забавно, когда у вас есть несколько ГиБ данных.

Как правило, избегайте просто вставлять .foorc в папку профиля пользователя. Windows не UNIX, и файлы, которым предшествует точка, автоматически не скрываются (для этого есть флаг файловой системы). Для меня это просто раздражение, если приложения делают это, потому что каталог профиля пользователя не подходит для подобных вещей в Windows. Аналогично, папка «Документы» не является подходящим местом для приложений для создания материалов без согласия пользователя или явных действий.

Из Ruby вы сможете вызывать эти функции с помощью библиотеки Win32API. Это выглядит неопределенно многообещающе (хотя и некрасиво); однако я не знаю достаточно, чтобы показать вам рабочий пример.

Последний вариант - использовать переменные окружения. Переменные среды ALLUSERSPROFILE, APPDATA и LOCALAPPDATA являются соответствующими эквивалентами вышеуказанных FolderID.

1 голос
/ 02 марта 2010

Вы должны использовать функцию shGetSpecialFolderLocation. какую конкретную константу передать -> CSIDL_COMMON_APPDATA, CSIDL_LOCAL_APPDATA, CSIDL_COMMON_DOCUMENTS или CSIDL_PERSONAL

является предметом споров. увидеть: http://www.icetips.com/blog/index.php/2008/10/31/title

для получения дополнительной помощи

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