Как получить локальную папку данных приложения на Java?
Возможный дубликат:
Каков кросс-платформенный способ получения пути к каталогу данных локального приложения?
Я ищу способ получить местоположение папки данных локального приложения, которая является специальной папкой Windows, на Java.
К сожалению, следующее работает только для английских версий Windows XP с настройками по умолчанию:
System.getProperty("user.home") + "\\Local Settings\\Application Data"
То, что я хотел бы иметь, это что-то вроде этого в .NET:
System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Есть ли способ сделать это, не называя SHGetSpecialFolderLocation API оболочки Windows?
Ответы
Ответ 1
Чтение раздела реестра "Папки-оболочки" устарело, начиная с Windows 95. В разделе реестра содержится примечание "Не используйте этот раздел реестра. Вместо этого используйте SHGetFolderPath или SHGetKnownFolderPath". Мне пришлось найти это на жестком пути в системе Vista, где все ключи отсутствовали, за исключением предупреждающей заметки.
fooobar.com/questions/123074/... решает эту проблему в Windows с использованием JNA, который является решением, которое я использую в настоящее время.
Ответ 2
System.getenv("APPDATA")
(по-видимому, нет никакой переменной env для папки "Локальные настройки", но это даст вам папку "Данные приложения" )
Ответ 3
как насчет следующего
String dataFolder = System.getenv("LOCALAPPDATA");
У меня есть ситуация, когда это НЕ под "user.home"
Ответ 4
Я хотел бы использовать следующие два способа:
String dataFolder = System.getenv("APPDATA");
String dataFolder = System.getProperty("user.home") + "\\Local Settings\\ApplicationData";
Ответ 5
Вы можете прочитать путь из реестра: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\*
где *
- один из этих ключей:
- Local AppData (
C:\Documents and Settings\USER\Local Settings\Application Data
)
- Локальные настройки (
C:\Documents and Settings\USER\Local Settings
)
- AppData (
C:\Documents and Settings\USER\Application Data
)
Примечание. Эти примерные пути относятся к английской установке Windows XP.
Ответ 6
Я решил таким образом
private static File getAppData(){
ProcessBuilder builder = new ProcessBuilder(new String[]{"cmd", "/C echo %APPDATA%"});
BufferedReader br = null;
try {
Process start = builder.start();
br = new BufferedReader(new InputStreamReader(start.getInputStream()));
String path = br.readLine();
// TODO HACK do not know why but I get an extra '"' at the end
if(path.endsWith("\"")){
path = path.substring(0, path.length()-1);
}
return new File(path.trim());
} catch (IOException ex) {
Logger.getLogger(Util.class.getName()).log(Level.SEVERE, "Cannot get Application Data Folder", ex);
} finally {
if(br != null){
try {
br.close();
} catch (IOException ex) {
Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
return null;
}
Ответ 7
Можно было бы запустить процесс для запроса ключа, а затем проанализировать вывод:
REG QUERY "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Local AppData"
Честно говоря, я был бы более склонен использовать JNA или JNI.