Вам нужна функция 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.