Quelle est la manière multi-plateforme d’obtenir le chemin d’access au répertoire de données de l’application locale?

Ce dont j’ai besoin est un moyen indépendant de la plate-forme d’obtenir le chemin d’access au répertoire de données de l’application locale. System.getenv("LOCALAPPDATA") semble fonctionner uniquement avec Windows. Comment puis-je m’y prendre?

Vous pourriez probablement dire quelque chose comme (me contredire si je me trompe ou si c’est une mauvaise approche)

 private Ssortingng workingDirectory; //here, we assign the name of the OS, according to Java, to a variable... private Ssortingng OS = (System.getProperty("os.name")).toUpperCase(); //to determine what the workingDirectory is. //if it is some version of Windows if (OS.contains("WIN")) { //it is simply the location of the "AppData" folder workingDirectory = System.getenv("AppData"); } //Otherwise, we assume Linux or Mac else { //in either case, we would start in the user's home directory workingDirectory = System.getProperty("user.home"); //if we are on a Mac, we are not done, we look for "Application Support" workingDirectory += "/Library/Application Support"; } //we are now free to set the workingDirectory to the subdirectory that is our //folder. 

Notez que, dans ce code, je profite pleinement du fait que Java traite '/' la même manière que '\\' lorsqu’il traite des répertoires. Windows utilise '\\' comme pathSeparator, mais il est également satisfait de '/' . (Au moins Windows 7 est.) Il est également insensible à la casse sur ses variables d’environnement; nous aurions tout aussi bien workingDirectory = System.getenv("APPDATA"); dire workingDirectory = System.getenv("APPDATA"); et cela aurait aussi bien fonctionné.

Pour des quantités modérées de données, considérez java.util.prefs.Preferences , mentionné ici , ou javax.jnlp.PersistenceService , discuté ici . Les deux sont multi-plateforme.

Personnellement, j’ai trouvé des appdirs très utiles pour des cas d’utilisation similaires. Il dispose de fonctions permettant de localiser différents types de répertoires utiles:

  • getUserDataDir
  • getUserConfigDir
  • getUserCacheDir
  • getUserLogDir
  • getSiteDataDir ← ressemble à celui dont vous avez besoin
  • getSiteConfigDir

Les emplacements qu’il retourne sont plus ou moins standards:

  • Sous Unix, il suit les spécifications du répertoire de base XDG .
  • Sous Windows, il appelle SHGetFolderPath .
  • Sur MacOS, il utilise des chemins codés en dur bien connus.

La quête est ancienne, mais il me manque une réponse listant les variables d’environnement au lieu de chemins absolus amusants. Je ne connais rien à OSX. Cet article ne contient que des informations sur Windows et Linux.

Je n’ai pas assez de points pour étendre une réponse déjà existante, alors je dois en écrire une nouvelle.

Linux: Comme mentionné précédemment, il existe quelque chose comme freedesktop.org qui définit un standard que les dissortingbutions Linux tentent de remplir. Il existe également une sous-page définissant les variables d’environnement et leurs valeurs par défaut (si elles ne sont pas définies, elles sont vides par défaut. L’application doit faire correspondre la variable à la valeur par défaut). Lien vers cette page: freedesktop.org env vars

Vars défini pertinent pour cette question:

  • $ XDG_DATA_HOME ( local ) (par défaut: $ HOME / .local / share )
  • $ XDG_CONFIG_HOME ( local ) (par défaut: $ HOME / .config )
  • $ XDG_DATA_DIRS ( global ) (par défaut: / usr / local / share / ou / usr / share / )
  • $ XDG_CONFIG_DIRS ( global ) (par défaut: / etc / xdg )

Windows XP:

  • % APPDATA% (valeur par défaut: C: \ Documents and Settings {nom d’utilisateur} \ Application Data )

  • % CommonProgramFiles% (valeur par défaut: C: \ Program Files \ Fichiers communs ) (fichiers de programme partagés)

  • % CommonProgramFiles (x86)% (valeur par défaut: C: \ Program Files (x86) \ Fichiers communs ) (64 bits uniquement!) (Fichiers de programme partagés)

  • % ProgramFiles% (par défaut: % SystemDrive% \ Program Files )

  • % ProgramFiles (x86)% (valeur par défaut: % SystemDrive% \ Program Files (x86) (uniquement en version 64 bits)) (64 bits uniquement!)

Windows Vista +:

  • % APPDATA% (valeur par défaut: C: \ Users {nom d’utilisateur} \ AppData \ Roaming ) (partagée entre les postes de travail liés. Utilisateur local. Enregistrer des fichiers et des configs)
  • % LOCALAPPDATA% (valeur par défaut: C: \ Users {nom d’utilisateur} \ AppData \ Local ) (utilisateur local. Enregistrer des fichiers et des configs)
  • % CommonProgramFiles% (valeur par défaut: C: \ Program Files \ Fichiers communs ) (fichiers de programme partagés)
  • % CommonProgramFiles (x86)% (valeur par défaut: C: \ Program Files (x86) \ Fichiers communs ) (64 bits uniquement!) (Fichiers de programme partagés)

  • % ProgramFiles% (valeur par défaut: % SystemDrive% \ Program Files ) (données statiques qui ne changeront pas après l’installation)

  • % ProgramFiles (x86)% (par défaut: % SystemDrive% \ Program Files (x86) (uniquement en version 64 bits)) (64 bits uniquement!) (Données statiques qui ne changeront pas après l’installation)

  • % ProgramData% (valeur par défaut: % SystemDrive% \ ProgramData ) (données modifiables affectant tous les utilisateurs)

En bref: Linux a deux variables d’environnement qui pourraient ne pas être définies (une pour les configurations, une pour les fichiers). Windows a autant que je peux dire un seul environnement var pour configs et fichiers ensemble. Veuillez utiliser ces chemins plutôt que des chemins absolus.

Le problème est que les autres systèmes d’exploitation n’ont même pas un concept bien défini de “répertoire de données d’application”. En règle générale, il ne s’agit que d’un sous-répertoire masqué dans le répertoire de base de l’utilisateur avec un nom conventionnel qui peut ou non être le nom de l’application.


Les escargots mécaniques commentent ainsi:

Pas vrai. Linux en a un (~ / .local par défaut), et je pense que OS X aussi.

Tout d’abord, ce n’est pas ~/.local . C’est ~/.local/share . (Ou du moins c’est sur ma machine Linux).

Deuxièmement, c’est une nouvelle idée. Il semble provenir du folk “freedesktop.org”, via la spécification du répertoire de base XDG . Il n’est pas mentionné dans d’autres spécifications plus largement reconnues sur la manière dont les systèmes de fichiers Linux / UNIX doivent être organisés. Et notez ce qu’ils disent de leurs “standards” sur cette page: http://www.freedesktop.org/wiki/

Enfin, cette idée n’est pas implémentée par la majorité des commandes Linux. Ceci est plutôt non scientifique, mais en regardant les répertoires cachés sur ma machine Linux, je peux voir des signes d’au moins 40 applications distinctes utilisant ~/ ou un sous-répertoire personnalisé. En revanche, il y a des signes de seulement 16 applications dans ~/.local/share .

Une convention de dénomination implémentée par moins d’un tiers des applications est loin d’être un “concept bien défini” … et certainement pas d’une manière portable permettant de trouver le répertoire de données d’une application arbitraire.

Il n’y a pas de plate-forme croisée pour cela, car les concepts utilisés par les différents systèmes d’exploitation sont trop différents pour être «abstraits». Je ne suis pas familier avec les conventions * nix et Mac, mais sous Windows, il n’y a pas de “dossier personnel” et l’application doit spécifier si elle souhaite stocker des éléments dans le profil itinérant ( C:\Users\\AppData\Roaming\\\ par défaut) ou le profil local ( C:\Users\\AppData\Local\\\ par défaut).

Notez que vous ne pouvez pas coder en dur ces chemins, car ils peuvent se trouver ailleurs sur une installation en réseau. Vous ne devez pas vous fier aux variables d’environnement, car elles peuvent être modifiées par l’utilisateur. Votre application doit appeler la fonction SHGetKnownFolderPath de l’API Windows.

La différence entre les deux est que le profil local est spécifique à l’utilisateur et à la machine, tandis que le profil itinérant est spécifique à l’utilisateur. Dans une configuration comme celle de mon université, les applications de base du profil itinérant sont téléchargées sur le serveur. synchronisé à l’ordinateur sur lequel je me connecte.

Les applications doivent choisir si les parameters qu’elles souhaitent stocker sont locales ou itinérantes. Malheureusement, Java ne permet pas aux applications d’en décider. Au lieu de cela, il existe un paramètre global configurable par l’utilisateur qui détermine le dossier que vous obtiendrez.

Vous pouvez l’utiliser

 Ssortingng currentDir = new File(".").getAbsolutePath(); 

ou ca:

 System.getProperty("user.dir") 

Je préfère la première option

Cordialement