web-dev-qa-db-ja.com

Javaでローカルアプリケーションデータフォルダーを取得する方法

可能性のある複製:
ローカルアプリケーションデータディレクトリへのパスを取得するクロスプラットフォームの方法は何ですか?

Javaのローカルアプリケーションデータフォルダー(特別なWindowsフォルダー)の場所を取得する方法を探しています。残念ながら、以下はWindows XPのデフォルト設定で英語版にのみ機能します:

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

私が持ちたいのは、.NETで次のようなものです:

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

Windows Shell APIの SHGetSpecialFolderLocation を呼び出さずに実行する方法はありますか?

47
smf68

「Shell Folders」レジストリキーの読み取りは、Windows 95以降では非推奨です。レジストリキーには、「!このレジストリキーを使用しないでください。代わりにSHGetFolderPathまたはSHGetKnownFolderPathを使用してください。」警告メモを除くすべてのキーが欠落しているVistaシステムでは、これを困難な方法で見つける必要がありました。

この関連するstackoverflow answer は、JNAを使用してWindowsでこの問題を解決します。これは現在使用しているソリューションです。

11
Frederik
System.getenv("APPDATA")

(「ローカル設定」フォルダーのenv変数はないようですが、これにより「アプリケーションデータ」フォルダーが表示されます)

76
Ryan Fernandes

以下はどうですか

String dataFolder = System.getenv("LOCALAPPDATA");

これが「user.home」の下にない状況があります

11
Charles Godwin

次の2つの方法を使用したいと思います。

String dataFolder = System.getenv("APPDATA");

String dataFolder = System.getProperty("user.home") + "\\Local Settings\\ApplicationData";
3
jianinz

レジストリからパスを読み取ることができます:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\*ここで*はこれらのキーの1つです。

  • ローカルAppData(C:\Documents and Settings\USER\Local Settings\Application Data
  • ローカル設定(C:\Documents and Settings\USER\Local Settings
  • アプリデータ (C:\Documents and Settings\USER\Application Data

注:これらのパス例は、英語のWindows XPインストールからのものです

1
Gregor

このようにして解決しました

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;
}
0