Подтвердить что ты не робот

Каков кросс-платформенный способ получения пути к каталогу данных локального приложения?

Мне нужен независимый от платформы способ получения пути к каталогу данных локального приложения. System.getenv("LOCALAPPDATA") похоже, работает только с Windows. Как мне это сделать?

4b9b3361

Ответ 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 Data​​strong > )

  • % 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%\ProgramData​​strong > ) (изменяемые данные, влияющие на всех пользователей)

Короче: Linux имеет две переменные среды, которые не могут быть установлены (один для конфигураций, один для файлов). В Windows до сих пор я могу указать только одно окружение var для конфигураций и файлов. Используйте их вместо абсолютных путей.

Ответ 4

Лично я нашел appdirs, чтобы быть очень полезным для подобных прецедентов. Он имеет функции, которые определяют различные типы полезных каталогов:

  • getUserDataDir
  • getUserConfigDir
  • getUserCacheDir
  • getUserLogDir
  • getSiteDataDir ← выглядит так, как вам нужно
  • getSiteConfigDir

Положения, которые он возвращает, более или менее стандартны:

Ответ 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")

Я предпочитаю первый вариант

Привет