web-dev-qa-db-fra.com

Existe-t-il un utilitaire Java qui convertira un chemin de chaîne pour utiliser le caractère de séparateur de fichier correct?

J'ai développé un certain nombre de classes qui manipulent des fichiers en Java. Je travaille sur une machine Linux et je saisis avec bonheur new File("path/to/some/file");. Lorsque le moment est venu de s’engager, j’ai réalisé que certains des autres développeurs du projet utilisaient Windows. J'aimerais maintenant appeler une méthode qui peut prendre une chaîne de la forme "/path/to/some/file" et, en fonction du système d'exploitation, renvoyer un chemin correctement séparé.

Par exemple:
"path/to/some/file" devient "path\\to\\some\\file" sous Windows.
Sous Linux, il ne fait que renvoyer la chaîne donnée.

Je me rends compte qu'il ne faudrait pas longtemps pour trouver une expression régulière capable de le faire, mais je ne cherche pas à réinventer la roue et préférerais une solution correctement testée. Ce serait bien si elle était intégrée au JDK, mais si elle fait partie d'une petite bibliothèque F/OSS, c'est bien aussi.

Existe-t-il donc un utilitaire Java qui convertira un chemin de chaîne pour utiliser le caractère de séparateur de fichier correct?

21
Grundlefleck

Apache Commons vient à la rescousse (encore une fois). La méthode Commons IOFilenameUtils.separatorsToSystem(String path) fera ce que vous voulez. 

Inutile de dire que Apache Commons IO en fera beaucoup plus et qu'il vaut la peine d'être examiné.

35
Brian Agnew

Un "/path/to/some/file" réellement fonctionne sous Windows Vista et XP. 

new Java.io.File("/path/to/some/file").getAbsoluteFile()

> C:\path\to\some\file

Mais il est toujours pas portable comme Windows a plusieurs racines. Le répertoire racine doit donc être sélectionné d’une manière ou d’une autre. Il ne devrait y avoir aucun problème avec les chemins relatifs.

Modifier:

Apache commons io fait pas aide avec des envs autres qu'unix & windows. Code source Apache io :

public static String separatorsToSystem(String path) { 
    if (path == null) {
     return null;
    }
    if (isSystemWindows()) {
      return separatorsToWindows(path);
    } else {
      return separatorsToUnix(path);
    }
}
16
Thomas Jung

C'est ce que fait Apache commons-io, déroulé en quelques lignes de code:

String separatorsToSystem(String res) {
    if (res==null) return null;
    if (File.separatorChar=='\\') {
        // From Windows to Linux/Mac
        return res.replace('/', File.separatorChar);
    } else {
        // From Linux/Mac to Windows
        return res.replace('\\', File.separatorChar);
    }
}

Donc, si vous voulez éviter la dépendance supplémentaire, utilisez-le.

5
Daniel Winterstein

Avec le nouveau Java 7, ils ont inclus une classe appelée Paths qui vous permet de faire exactement ce que vous voulez (voir http://docs.Oracle.com/javase/tutorial/essential/io/pathOps.html )

voici un exemple:

String rootStorePath = Paths.get("c:/projects/mystuff/").toString();
4
Gigas64

Avez-vous la possibilité d'utiliser 

System.getProperty("file.separator")

construire la chaîne qui représente le chemin?

2
Adam

Quiconque tente de le faire 7 ans plus tard, la méthode Apache commons separatorsToSystem a été déplacé vers la classe FilenameUtils:

FilenameUtils.separatorsToSystem(String path)
2
java-addict301
String fileName = Paths.get(fileName).toString();

Fonctionne parfaitement avec Windows au moins même avec des chemins mixtes, par exemple

c:\utilisateurs\nom d'utilisateur/mon projet\mesfichiers/mon dossier

devient 

c:\users\username\myproject\myfiles\myfolder

Désolé, nous n'avons pas vérifié ce que Linux ferait de ce qui précède, mais là encore, la structure de fichier Linux est différente, vous ne pouvez donc pas rechercher un tel répertoire.

1
John Perczyk

Je pense qu'il y a ce trou dans Java Paths.

String rootStorePath = Paths.get ("c:/projects/mystuff /"). ToString ();

fonctionne si vous l’exécutez sur un système disposant du système de fichiers que vous devez utiliser. Comme indiqué, il utilisait le système de fichiers actuel du système d'exploitation.

Je dois travailler avec des chemins entre Windows et Linux, par exemple pour copier un fichier de l'un à l'autre. En utilisant "/" tous les travaux, je suppose que si vous utilisez toutes les commandes Java, mais je dois passer un appel sftp, donc utiliser/ou file.separator, etc ... ne m'aide pas. Je ne peux pas utiliser Path () car il convertit le mien en système de fichiers par défaut sur lequel je cours "maintenant".

Ce dont Java a besoin, c'est:
`sur le système Windows: Chemin posixPath = Paths.get ("/home/mystuff ", FileSystem.Posix); reste/home/mystuff/et n'est pas converti pour\home\mystuff

sur le système linux: String winPath = Paths.get ("c:\home\mystuff", FileSystem.Windows) .toString (); ` reste c:\home\mystuff et ne le fait pas convertis en/c:/home/mystuff

similaire à travailler avec des jeux de caractères:

URLEncoder.encode ("n'importe quoi ici", "UTF-8") .getBytes ();

P.S. Je ne veux pas non plus charger un fichier jar Apache io complet pour faire quelque chose de simple. Dans ce cas, ils n’ont pas ce que je propose de toute façon.

1
Stan Towianski

Ne devrait-il pas suffire de dire:

"path"+File.Seperator+"to"+File.Seperator+"some"+File.Seperator+"file"
0
Dimitri