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

Как получить локальную папку данных приложения на Java?

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

Я ищу способ получить местоположение папки данных локального приложения, которая является специальной папкой Windows, на Java. К сожалению, следующее работает только для английских версий Windows XP с настройками по умолчанию:

System.getProperty("user.home") + "\\Local Settings\\Application Data"

То, что я хотел бы иметь, это что-то вроде этого в .NET:

System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

Есть ли способ сделать это, не называя SHGetSpecialFolderLocation API оболочки Windows?

4b9b3361

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