2010-11-30 4 views
0

J'essaie de créer un programme simple qui contienne la fonction de parcourir le système de fichiers local.getCanonicalFile et getAbsoluteFile retournent le répertoire (projet) actuel au lieu de celui attendu

Cependant, j'ai rencontré un problème lorsque l'adresse est entrée directement.

public void setWorkingDirectory(File newDir) 
{ 
    try 
    { 
     //try to eliminate redundancy 
     this.workingDir = newDir.getCanonicalFile(); 
    } 
    catch (IOException e) 
    { 
     this.workingDir = newDir; 
    } 
} 

J'ai besoin le chemin absolu pour afficher à l'écran. Donc, j'utilise getCanonicalFile(). Tout fonctionne bien, sauf que lorsque je saisis "D:", le repertoire de travail sera défini dans le répertoire du projet courant dans Eclipse (je pense qu'il devrait être le répertoire courant lorsqu'il est exécuté indépendamment, "D: \ EclipseWorkspace \ workspace \ FTPClient") mais le fichier newDir contient exactement le même chemin ("D:") (je l'ai tracé).

Si je saisis "C:" ou "D: \", alors tout va bien. Je n'ai trouvé aucune information à ce sujet sur Internet. Quelqu'un pourrait-il me dire ce qui se passe ici et comment résoudre le problème?

Merci d'avance.

EDIT: Je travaille sur Windows XP SP3 avec Java 6 si cela est important.

+0

Bien que vous travailliez avec Windows, remplacez toutes vos barres obliques inverses par des barres obliques. "\" 'Peut s'échapper d'un caractère après et vous ne le souhaitez pas. – darioo

+0

Merci pour votre commentaire. C'est une bonne idée. Mais je pense que dans mon cas ce n'est pas nécessaire puisque le chemin n'est pas codé en dur. – LLS

+0

J'ai téléchargé une réponse qui explique ce que Kris a dit. –

Répondre

1

La commande de chemin

D: 

indique un changement à l'sélectionné répertoire sur le disque D.

Alors que

D:\ 

indique un changement dans le répertoire racine du disque D.

Ceci est de base Windows, vous obtiendrez les mêmes résultats dans une fenêtre de console (CMD).

Si c'est vraiment un problème, vous devez regarder le nom de fichier et voir s'il se termine par un File.separator et si ce n'est pas le cas, ajoutez-en un.

+0

Ouais, je l'ai essayé en cmd ... Je ne l'avais jamais remarqué auparavant. Merci. – LLS

0

Pas vraiment savoir comment l'expliquer, la getCanonicalFile() utilise la getCanonicalPath() qui est essentiellement appelle la méthode FileSystem.canonicalize(String path) (ce qui est une méthode abstraite).

Dans Windows, le java.io.Win32FileSystem.canonicalize(String path) (qui étend java.io.FileSystem) appelle, essentiellement, l'un des 2 native méthodes:

protected native String canonicalize0(String path) 

OU

protected native String canonicalizeWithPrefix0(String canonicalPrefix, String pathWithCanonicalPrefix) 

Alors, comme le dit Kris, il est fondamental Fonction Windows

+0

Merci pour vos détails.C'est utile. – LLS

Questions connexes