Javaのローカルアプリケーションデータフォルダー(特別なWindowsフォルダー)の場所を取得する方法を探しています。残念ながら、以下はWindows XPのデフォルト設定で英語版にのみ機能します:
System.getProperty("user.home") + "\\Local Settings\\Application Data"
私が持ちたいのは、.NETで次のようなものです:
System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Windows Shell APIの SHGetSpecialFolderLocation を呼び出さずに実行する方法はありますか?
「Shell Folders」レジストリキーの読み取りは、Windows 95以降では非推奨です。レジストリキーには、「!このレジストリキーを使用しないでください。代わりにSHGetFolderPathまたはSHGetKnownFolderPathを使用してください。」警告メモを除くすべてのキーが欠落しているVistaシステムでは、これを困難な方法で見つける必要がありました。
この関連するstackoverflow answer は、JNAを使用してWindowsでこの問題を解決します。これは現在使用しているソリューションです。
System.getenv("APPDATA")
(「ローカル設定」フォルダーのenv変数はないようですが、これにより「アプリケーションデータ」フォルダーが表示されます)
以下はどうですか
String dataFolder = System.getenv("LOCALAPPDATA");
これが「user.home」の下にない状況があります
次の2つの方法を使用したいと思います。
String dataFolder = System.getenv("APPDATA");
String dataFolder = System.getProperty("user.home") + "\\Local Settings\\ApplicationData";
レジストリからパスを読み取ることができます:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\*
ここで*
はこれらのキーの1つです。
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インストールからのものです
このようにして解決しました
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;
}