Dupliquer possible:
Quel est le moyen multiplateforme d'obtenir le chemin d'accès au répertoire de données d'application local?
Je cherche un moyen d'obtenir l'emplacement du dossier de données de l'application locale, qui est un dossier Windows spécial, en Java . Malheureusement, les éléments suivants ne fonctionnent que pour les versions anglaises de Windows XP avec les paramètres par défaut :
System.getProperty("user.home") + "\\Local Settings\\Application Data"
Ce que j'aimerais avoir, c'est quelque chose comme ça dans .NET:
System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Existe-t-il un moyen de le faire sans avoir à appeler SHGetSpecialFolderLocation de l'API Windows Shell?
La lecture de la clé de registre "Shell Folders" est obsolète à partir de Windows 95. La clé de registre contient une note disant "! N'utilisez pas cette clé de registre. Utilisez plutôt SHGetFolderPath ou SHGetKnownFolderPath". Je devais trouver cela à la dure sur un système Vista où toutes les clés étaient manquantes, à l'exception du message d'avertissement.
Cette réponse liée à stackoverflow résout ce problème sous Windows en utilisant JNA, qui est la solution que j'utilise actuellement.
System.getenv("APPDATA")
(Il semble n'y avoir aucune variable env pour le dossier "Local Settings", mais cela vous donnera le dossier 'Application Data'
qu'en est-il de ce qui suit
String dataFolder = System.getenv("LOCALAPPDATA");
J'ai une situation où ce n'est pas sous "user.home"
Je voudrais utiliser les deux manières suivantes:
String dataFolder = System.getenv("APPDATA");
String dataFolder = System.getProperty("user.home") + "\\Local Settings\\ApplicationData";
Vous pouvez lire le chemin du registre: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\*
où *
est l’une de ces clés:
C:\Documents and Settings\USER\Local Settings\Application Data
)C:\Documents and Settings\USER\Local Settings
)C:\Documents and Settings\USER\Application Data
)Remarque: Ces exemples de chemins proviennent d'une installation anglaise XP de Windows.
J'ai résolu de cette façon
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;
}