可能重复:
What is the cross-platform way of obtaining the path to the local application data directory?
我正在寻找一种方法来获取本地应用程序数据文件夹的位置,这是一个特殊的Windows文件夹,用Java编写。 遗憾的是,以下内容仅适用于具有默认设置的英文版Windows XP:
System.getProperty("user.home") + "\\Local Settings\\Application Data"
我希望在.NET中拥有这样的东西:
System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
有没有办法在不必调用Windows Shell API的SHGetSpecialFolderLocation的情况下执行此操作?
答案 0 :(得分:76)
System.getenv("APPDATA")
(“本地设置”文件夹似乎没有env变量,但这会为您提供“应用程序数据”文件夹)
答案 1 :(得分:11)
从Windows 95开始,不推荐读取“Shell文件夹”注册表项。注册表项包含一条说明“!不要使用此注册表项。请改用SHGetFolderPath或SHGetKnownFolderPath。”我必须在Vista系统上找到这个方法,除了警告说明之外,所有键都丢失了。
This related stackoverflow answer在Windows上使用JNA解决了这个问题,这是我目前正在使用的解决方案。
答案 2 :(得分:10)
以下
String dataFolder = System.getenv("LOCALAPPDATA");
我的情况是这不是“user.home”
答案 3 :(得分:3)
我想用以下两种方式:
String dataFolder = System.getenv("APPDATA");
String dataFolder = System.getProperty("user.home") + "\\Local Settings\\ApplicationData";
答案 4 :(得分:1)
您可以从注册表中读取路径:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\*
其中*
是其中一个键:
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安装
答案 5 :(得分:0)
我以这种方式解决了
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;
}
答案 6 :(得分:-1)
可以生成一个进程来查询密钥,然后解析输出:
REG QUERY "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Local AppData"
老实说,我更倾向于使用JNA或JNI。