Мне нужен независимый от платформы способ получения пути к каталогу данных локального приложения. System.getenv("LOCALAPPDATA")
похоже, работает только с Windows. Как мне это сделать?
Каков кросс-платформенный способ получения пути к каталогу данных локального приложения?
Ответ 1
Возможно, вы могли бы сказать что-то вроде (противоречите мне, если я ошибаюсь, или если это плохой подход)
private String workingDirectory;
//here, we assign the name of the OS, according to Java, to a variable...
private String OS = (System.getProperty("os.name")).toUpperCase();
//to determine what the workingDirectory is.
//if it is some version of Windows
if (OS.contains("WIN"))
{
//it is simply the location of the "AppData" folder
workingDirectory = System.getenv("AppData");
}
//Otherwise, we assume Linux or Mac
else
{
//in either case, we would start in the user home directory
workingDirectory = System.getProperty("user.home");
//if we are on a Mac, we are not done, we look for "Application Support"
workingDirectory += "/Library/Application Support";
}
//we are now free to set the workingDirectory to the subdirectory that is our
//folder.
Обратите внимание, что в этом коде я полностью понимаю, что Java рассматривает '/'
то же самое, что и '\\'
при работе с каталогами. Windows использует '\\'
как pathSeparator, но также довольна '/'
. (По крайней мере, Windows 7 есть.) Также он не учитывает регистр переменных среды; мы могли бы так же легко сказать workingDirectory = System.getenv("APPDATA");
, и это сработало бы так же хорошо.
Ответ 2
Для умеренных объемов данных рассмотрите java.util.prefs.Preferences
, упомянутый здесь или javax.jnlp.PersistenceService
, обсужденный здесь. Оба являются межплатформенными.
Ответ 3
Квесты старые, но у меня отсутствует ответ, в котором перечислены кластеры окружения, а не какие-то смешные абсолютные пути. Я ничего не знаю о OSX. этот пост только содержит информацию о Windows и Linux.
У меня недостаточно очков для расширения уже существующего ответа, поэтому я должен написать новый.
Linux: Как упоминалось ранее, существует нечто вроде freedesktop.org, который определяет стандарт, который пытается выполнить Linux-дистрибутивы. Существует также подстраница, определяющая переменные среды и их значения по умолчанию (если они не установлены, они по умолчанию пусты. Приложение должно соответствовать переменной tp по умолчанию). Ссылка на эту страницу: freedesktop.org env vars
Вары определены для данного вопроса:
- $XDG_DATA_HOME (локальный) (по умолчанию: $HOME/.local/share)
- $XDG_CONFIG_HOME (локальный) (по умолчанию: $HOME/.config)
- $XDG_DATA_DIRS (глобальный) (по умолчанию: /usr/local/share/ или /usr/share/)
- $XDG_CONFIG_DIRS (глобальный) (по умолчанию: /etc/xdg)
Windows XP:
-
% APPDATA% (по умолчанию: C:\Documents and Settings {имя_пользователя}\Application Datastrong > )
-
% CommonProgramFiles% (по умолчанию: C:\Program Files\Common Files) (файлы общих программ)
-
% CommonProgramFiles (x86)% (по умолчанию: C:\Program Files (x86)\Common Files) (только для 64-разрядных!) ( общие файлы программ)
-
% ProgramFiles% (по умолчанию: % SystemDrive%\Program Files)
-
% ProgramFiles (x86)% (по умолчанию: % SystemDrive%\Program Files (x86) (только в 64-разрядной версии)) (64 -битный!)
Windows Vista +:
- % APPDATA% (по умолчанию: C:\Users {имя_пользователя}\AppData\Роуминг) (общий доступ между связанными рабочими станциями, локальный пользовательский. Сохранить файлы и конфиги)
- % LOCALAPPDATA% (по умолчанию: C:\Users {имя_пользователя}\AppData\Local) (пользователь локальный. Сохранить файлы и конфиги)
- % CommonProgramFiles% (по умолчанию: C:\Program Files\Common Files) (файлы общих программ)
-
% CommonProgramFiles (x86)% (по умолчанию: C:\Program Files (x86)\Common Files) (только для 64-разрядных!) ( общие файлы программ)
-
% ProgramFiles% (по умолчанию: % SystemDrive%\Program Files) (Статические данные, которые не будут изменены после установки)
-
% ProgramFiles (x86)% (по умолчанию: % SystemDrive%\Program Files (x86) (только в 64-разрядной версии)) (64 -битный!) (Статические данные, которые не будут меняться после установки)
-
% ProgramData% (по умолчанию: % SystemDrive%\ProgramDatastrong > ) (изменяемые данные, влияющие на всех пользователей)
Короче: Linux имеет две переменные среды, которые не могут быть установлены (один для конфигураций, один для файлов). В Windows до сих пор я могу указать только одно окружение var для конфигураций и файлов. Используйте их вместо абсолютных путей.
Ответ 4
Лично я нашел appdirs
, чтобы быть очень полезным для подобных прецедентов. Он имеет функции, которые определяют различные типы полезных каталогов:
-
getUserDataDir
-
getUserConfigDir
-
getUserCacheDir
-
getUserLogDir
-
getSiteDataDir
← выглядит так, как вам нужно -
getSiteConfigDir
Положения, которые он возвращает, более или менее стандартны:
- В Unix следует Спецификация базового каталога XDG.
- В Windows он вызывает SHGetFolderPath.
- В macOS используются хорошо известные жестко установленные пути.
Ответ 5
Проблема в том, что в других операционных системах даже нет четкой концепции "каталога данных приложения". Обычно это скрытый подкаталог в домашнем каталоге пользователя с обычным именем, которое может быть или не быть именем приложения.
Механические комментарии улитки:
Не верно. У Linux есть один (~/.local по умолчанию), и я считаю, что OS X также делает.
Во-первых, это не ~/.local
. Это ~/.local/share
. (Или, по крайней мере, это на моей машине Linux).
Во-вторых, это новая идея. Похоже, что это происходит от людей "freedesktop.org", используя Спецификацию базового каталога XDG. Он не упоминается в других более широко признанных спецификациях того, как должны быть организованы файловые системы Linux/UNIX. И обратите внимание на то, что они говорят об их "стандартах" на этой странице: http://www.freedesktop.org/wiki/
Наконец, эта идея не реализована большинством команд Linux. Это довольно ненаучно, но, глядя на скрытые каталоги на моем ящике Linux, я могу видеть признаки как минимум 40 различных приложений, используя ~/
или настраиваемый подкаталог. Напротив, в ~/.local/share
есть признаки только 16 приложений.
Соглашение об именах, реализованное менее чем 1/3 приложениями, вряд ли является "четко определенной концепцией"... и, конечно, не таким образом, чтобы можно было найти произвольный каталог данных приложения портативным способом.
Ответ 6
Для этого нет кросс-платформенного способа, потому что понятия, что использование разных ОС слишком отличаются от "абстрактных". Я не знаком с соглашениями * nix и Mac, но в Windows нет "домашней папки", и приложение должно указать, хочет ли он хранить материал в перемещаемом профиле (C:\Users\<username>\AppData\Roaming\<application vendor>\<application name>\
по умолчанию) или локальный профиль (C:\Users\<username>\AppData\Local\<application vendor>\<application name>\
по умолчанию).
Обратите внимание, что вы не можете жестко задавать эти пути, потому что при сетевой установке они могут быть где-то еще. Вы не должны полагаться на переменные среды, потому что они могут быть изменены пользователем. Ваше приложение должно вызвать функцию SHGetKnownFolderPath в Windows API.
Разница между этими двумя заключается в том, что локальный профиль специфичен для пользователя и машины, в то время как перемещаемый профиль специфичен для пользователя, поэтому в настройках, подобных моему университету, приложения, помещенные в перемещаемый профиль, загружаются в сервер и синхронизироваться с любым компьютером, на который я вхожу.
В приложениях должно быть указано, должны ли настройки, которые они хотят хранить, локальные или роуминг. К сожалению, Java не позволяет приложениям это решать. Вместо этого существует глобальный настраиваемый пользователем параметр, который определяет, какую папку вы получите.
Ответ 7
Вы можете использовать этот
String currentDir = new File(".").getAbsolutePath();
или это:
System.getProperty("user.dir")
Я предпочитаю первый вариант
Привет