seticon - ¿Cómo obtener la carpeta de datos de la aplicación local en Java?
poner imagen en jlabel java (7)
Posible duplicado:
¿Cuál es la forma multiplataforma de obtener la ruta al directorio de datos de la aplicación local?
Estoy buscando una forma de obtener la ubicación de la carpeta de datos de la aplicación local, que es una carpeta especial de Windows, en Java. Desafortunadamente, lo siguiente solo funciona para las versiones en inglés de Windows XP con la configuración predeterminada:
System.getProperty("user.home") + "//Local Settings//Application Data"
Lo que me gustaría tener es algo como esto en .NET:
System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
¿Hay alguna forma de hacerlo sin tener que llamar a SHGetSpecialFolderLocation de Windows Shell API?
¿Qué pasa con el siguiente
String dataFolder = System.getenv("LOCALAPPDATA");
Tengo una situación en la que NO está en "usuario.casa"
Leer la clave de registro "Carpetas de Shell" está en desuso a partir de Windows 95. La clave de registro contiene una nota que dice "No usar esta clave de registro. En su lugar, use SHGetFolderPath o SHGetKnownFolderPath". Tuve que encontrarlo de la manera difícil en un sistema Vista donde faltaban todas las llaves a excepción de la nota de advertencia.
Esta respuesta de relacionada resuelve este problema en Windows usando JNA, que es la solución que estoy usando actualmente.
Lo resolví de esta manera
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;
}
Me gustaría usar las siguientes dos formas:
String dataFolder = System.getenv("APPDATA");
String dataFolder = System.getProperty("user.home") + "//Local Settings//ApplicationData";
Puede leer la ruta desde el registro: HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Folders/*
donde *
es una de esas claves:
- Local AppData (
C:/Documents and Settings/USER/Local Settings/Application Data
) - Configuración local (
C:/Documents and Settings/USER/Local Settings
) - AppData (
C:/Documents and Settings/USER/Application Data
)
Nota: Esas rutas de ejemplo son de una instalación de Windows XP en inglés
Sería posible generar un proceso para consultar la clave y luego analizar el resultado:
REG QUERY "HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Folders" /v "Local AppData"
Honestamente, sin embargo, estaría más inclinado a usar JNA o JNI.
System.getenv("APPDATA")
(Parece que no hay una variable env para la carpeta "Configuración local", pero esto le dará la carpeta ''Datos de aplicación'')