10
votes

Way inter-plate-forme de demander le dossier Documents de l'utilisateur?

J'écris un programme multiplate-forme en Java et je veux coller les fichiers de configuration dans le dossier Documents de l'utilisateur ("Mes documents" sous Windows, "Documents" sous Linux appropriés, et quel que soit le dossier appelé sous Mac OS) , mais je ne suis pas sûr comment demander à Java pour cela.

J'aimerais rester à l'écart des choses de codage rigide (faire x si nous sommes sur Windows, y si nous sommes sur Linux, ou Z Si nous sommes sur OS X), comme cela met le fardeau du soutien sur mes épaules plutôt que l'équipe de développement Oracle.

J'ai vérifié la liste des propriétés du système, mais il ne semble pas inclure le dossier Documents de l'utilisateur.


0 commentaires

6 Réponses :


-2
votes

Qu'est-ce qui ne va pas avec le codage d'un moyen d'obtenir le chemin en fonction du système d'exploitation des utilisateurs? Il peut y avoir de grandes écarts et le travail du système d'exploitation différent avec des noms différents. Simplement sur le lancement, trouvez le chemin du dossier Documents en fonction de son système d'exploitation et continuez de référencer ce chemin où qu'il soit nécessaire.


4 commentaires

Le problème est que la variété des versions du système d'exploitation a souvent des chemins différents et la localisation peut également l'affecter. Le seul moyen correct est d'utiliser la fonctionnalité native fournie par le système d'exploitation sur la plate-forme donnée.


Codage dur Le chemin est une idée horrible, principalement parce que ce n'est pas la même même par le même système d'exploitation. Comme Justin a souligné, la localisation peut être une question, des profils itinérants constituent une autre raison fréquente. En outre, l'utilisateur peut le changer. Sous Windows 7, cliquez avec le bouton droit de la souris sur votre dossier "Mes documents" (pas la bibliothèque, le dossier actuel) et le modifier sur l'onglet Emplacement.


Je parle de codage dur un moyen de discerner chaque système d'exploitation.


Ce n'est pas vraiment codé dur alors, il s'agit simplement d'écrire une fonction. Comme Justin a souligné, la plupart des systèmes d'exploitation ont «codé dur» pour vous dans leur spécification de l'API.



8
votes

Malheureusement, il n'y a pas de solution croisée facile à plate-forme. Vous devrez tirer parti de la fonctionnalité native sur chaque plate-forme d'exploitation

  • Voici quelques informations sur la façon de le faire dans OSX
  • Voici quelques informations sur la façon de le faire dans Windows

    Pour Linux, je n'ai pas de lien pratique, mais étant donné qu'il n'y a pas nécessairement le concept de dossier de documents à Linux, je ne connais pas d'une bonne solution. La propriété système user.home devrait au moins être valide sous Linux.


3 commentaires

Pensez-vous que je serais capable de vous éloigner de quelques courtes lignes de code par système d'exploitation? Lire certaines des réponses au moins pour le lien Windows que vous avez propose de penser que vous devez utiliser des lots et beaucoup de code pour faire quelque chose qui semble être plutôt facile.


L'un de ces liens que je pense avait un lien vers une bibliothèque sur Google Code pour le faire pour vous (pour Windows). Donc, au moins vous n'auriez personnellement pas à écrire beaucoup de code pour l'appeler. Je ne suis pas sûr de ce que vous considérez comme beaucoup de code, mais au moins c'est le genre de choses où vous le faites une fois, puis vous pouvez l'utiliser pour tous les projets que vous le faites. Il a donc beaucoup de valeur.


" On dirait que cela devrait être plutôt facile ... " Cela ne semble pas être quelque chose qui devrait être facile ... Considérant que chaque saveur de chaque système d'exploitation peut mettre les documents " < / i> "répertoire où qu'il veuille. Sans parler que tous les OS ont un répertoire de documents. Heck ... Les utilisateurs n'ont même pas besoin d'avoir un répertoire à domicile sur chaque système d'exploitation, sont-ils?



1
votes

Demandez l'utilisateur, d'une manière ou d'une autre, où ils veulent enregistrer des données sur ou utiliser le répertoire actuel (chemins relatifs simples) et fournir des instructions appropriées pour la configuration. Un moyen de "demander" est d'avoir une propriété pouvant être définie via la ligne de commande.

Ne pollut pas simplement le répertoire de base de l'utilisateur avec les trucs de votre application - Comment savez-vous comment ils aiment leur arborescence de document organisée?

Je suis absolument marre de * Programmes orientés Nix déposant leurs petits fichiers de configuration et des dossiers de données dans la racine de mon dossier de documents.


1 commentaires

L'un des programmes que je modélise ma demande après est l'outil de développement Arduino, et il abandonne simplement ses fichiers en $ Home / Sketchbook. ARDIUNO.CC



1
votes

Ceci n'est généralement pas possible de manière générique. Vous devrez utiliser des aptractions dépendantes de la plate-forme. Je le fais comme ceci pour Appdata, par exemple, sur Windows I Détectez l'AppData / Itinérance ou AppData / local, en fonction des données que j'ai besoin de stocker, sur d'autres plates-formes, je crée un dossier "MyAppname" dans l'userhome et utilisez ceci.

Pour le dossier Documents, vous devrez lire le registre. Avant Windows Vista à l'aide de l'utilisateur.Home propres + "/ documents" n'est pas éventuellement éventuellement, car dans d'autres langues, cela pourrait être "/ dokument" (allemand) ou autre chose. Juste le registre a le chemin réel de ce dossier.

sur les plates-formes Linux, cela dépend de l'environnement de bureau. Vous devrez juste l'essayer. GNOME et KDE utilisent différents endroits pour stocker le dossier Documents, IMHO. Et si vous utilisez simplement FVWM, il n'y a pas de lieu prédéfini pour Docs, à l'exception de l'utilisateur.Home Property, quelle est une bonne fallue.


1 commentaires

Comment dois-je interroger le registre?



1
votes

En supposant qu'il s'agisse d'une application qui nécessite une installation, pourquoi ne pas demander à l'utilisateur de spécifier l'emplacement lors de l'installation. Générez un script d'exécution à l'aide de ces informations qui définiraient les variables d'environnement appropriées. En tant que norme, l'utilisateur ne devrait pas exécuter la commande java !

Lorsque l'utilisateur démarre l'application à l'aide de ce script d'exécution, l'application peut lire les variables d'environnement.

Alternativement, créez un fichier JAR avec des fichiers de configuration. Lisez les fichiers de configuration à l'aide de GetResourceeStream de Classloader. Tant que le jar de configuration est sous le pavillon de classe, vous pouvez accéder aux fichiers. Cela a également l'avantage supplémentaire de cacher la configuration de la modification accidentelle. Cela devrait également fonctionner pour les dossiers (si la configuration doit être modifiée par l'utilisateur).


2 commentaires

Vous suggérez-vous de créer un deuxième fichier .jar avec les données de configuration ou d'ajouter les données de configuration au fichier «Master» .jar?


Tout ce que je veux dire, c'était de l'avoir dans une ressource qui fait partie de la classe de classe :)



2
votes

solution partielle:

boolean ismac = system.getproperty ("os.name"). Equals ("Mac OS X");

ou utilisez http://commons.apache.org/vfs/ pour obtenir le système d'exploitation : http://commons.apache.org/vfs /apidocs/org/apache/commons/vfs2/util/os.html

// Le nom du dossier est le même que la langue de Mac OSX.

Mac: system.getProperty ("utilisateur.home") + fichier.sparator + "documents");

/ users / david / documents

win: system.getenv ("appdata"));

C: \ Documents et paramètres \ David \ Données d'application


0 commentaires