2013-04-01 5 views
1

Disons que j'ai un chemin « de base » absolue:Comment obtenir le chemin absolu d'un fichier lorsque donné un chemin relatif ou absolu et le chemin absolu, il est par rapport à

/home/someone/dir1/dir2/ 

L'utilisateur peut me passer un nouveau chemin, qui peut être soit absolu ou relatif au chemin de base, de sorte que le suivant serait à la fois valable:

.. 
/home/someone/dir1/ 

Comment puis-je obtenir java pour me donner le chemin absolu correct à dire pour ces deux cas:

/home/someone/dir1/ 

et le faire d'une manière indépendante de la plate-forme?

J'ai essayé les éléments suivants:

File resolvedFile = new File((new File(basePath).toURI().resolve(new File(newPath).toURI()))); 

Toutefois, lorsque Newpath était relative, newFile (Newpath) résout automatiquement contre le répertoire de travail en cours, plutôt que la basePath je veux fournir.

Des pensées? Merci beaucoup!

Répondre

1

répondre à ma propre question ..

On dirait que cela peut être fait en java 7 en utilisant le chemin:

Path p1 = Paths.get("/home/joe/foo"); 
// Result is /home/joe/foo/bar 
System.out.format("%s%n", p1.resolve("bar")); 

Depuis que je ne peux pas obtenir java 7 pour mon mac 10.5.8, Je vais avec quelque chose comme (NB NON TASSES DE MANIÈRE APPROFONDIE!):

static String getAbsolutePath(String basePath, String relativeOrAbsolutePath) throws IOException {

boolean isAbsolute = false; 
    File relativeOrAbsoluteFile = new File(relativeOrAbsolutePath); 

    if (relativeOrAbsoluteFile.isAbsolute()){ 
     isAbsolute = true; 
    } 

    if (isAbsolute){ 
     return relativeOrAbsolutePath; 
    } 
    else { 
     File absoluteFile = new File(basePath, relativeOrAbsolutePath); 
     return absoluteFile.toString(); 
    } 

} 

+0

ne fonctionne pas si le chemin relatif contient "../../" java 1.6 – dns

0

Jetez un oeil à File#getCanonicalPath

Des JavaDocs:

Renvoie la chaîne de chemin canonique de ce chemin abstrait. Un chemin canonique est à la fois absolu et unique. La définition précise de la forme canonique dépend du système. Cette méthode convertit tout d'abord ce chemin d'accès en forme absolue si nécessaire, comme si elle appelait la méthode getAbsolutePath() , puis mappage à sa forme unique d'une manière dépendant du système . Cela implique généralement la suppression des noms redondants tels que "." et ".." à partir du chemin d'accès, en résolvant les liens symboliques (sur les plates-formes UNIX ) et en convertissant les lettres de lecteur en un cas standard (sur les plates-formes Microsoft Windows ).

Chaque chemin d'accès qui désigne un fichier ou un répertoire existant a une forme canonique unique . Chaque chemin d'accès qui indique un fichier inexistant ou un répertoire a également une forme canonique unique. La forme canonique du chemin d'accès d'un fichier ou d'un répertoire inexistant peut être différente de la forme canonique du même chemin après la création du fichier ou du répertoire . De même, la forme canonique du chemin d'accès d'un fichier ou répertoire existant peut être différente de la forme canonique du même chemin d'accès après la suppression du fichier ou du répertoire.

+0

Malheureusement, cela résout le chemin relatif par rapport au répertoire de travail actuel. Je ne vois pas de moyen de fournir un chemin auquel le chemin relatif est relatif. – Bruce

+0

Un chemin relatif est, bien, relatif à partir de votre position actuelle. Sans contexte supplémentaire, je ne sais pas comment vous pourriez être en mesure de réaliser ce que vous voulez – MadProgrammer

+0

Le contexte supplémentaire est le chemin de «base». Cela peut être fait dans Java 7 avec Path, et je pense que ma réponse ci-dessous fonctionne pour Java 6 et ci-dessous. – Bruce

0

essayer dans votre code.

System.setProperty ("user.dir", "your_base_path")

+0

Merci. Oublié de mentionner que cela doit fonctionner dans un environnement multithread, donc la mise en place d'une propriété système ne fonctionnera pas .. Merci pour la réponse si .. – Bruce

0

Je ne sais pas si cela fonctionne en dehors de ma configuration (plate-forme Windows, 1.6.x JRE)

mais ce qui suit a travaillé comme un astuce:

File path = new File(relativeOrAbsoluteGoldpath); 
absolutePath = path.getCanonicalPath(); 

relativeOrAbsoluteGoldpath est un nom de chemin arbitraire qui peut ou non être relatif.