Java deux points à la fin d’un chemin ont des résultats inattendus

J’ai rencontré ce que je pensais être un comportement inhabituel lorsque je travaillais avec des objects File.

import java.io.File; public class MyClass { public static void main(Ssortingng[] args) { File file = new File("C:\\x.."); System.out.println(file.isDirectory()); System.out.println(file.listFiles()); } } 

En supposant qu’un répertoire C:\x existe, file.isDirectory() renverra true avec les deux points ajoutés à la fin du chemin. Cela reproduit le comportement dans la ligne de commande, où cd x.. changera le répertoire en x .

Cependant, lorsque vous appelez file.listFiles() , la méthode renvoie null, ce qui est uniquement supposé se produire si le fichier n’est pas un répertoire. Cela semble être incompatible avec la définition de listFiles() .

Pourquoi cela est-il ainsi? Et pourquoi avoir deux points à la fin du chemin va-t-il dans le même répertoire que s’il n’y avait pas de points?

Ce problème semble être exclusif à Windows. Linux correctement (?) isDirectory() false pour isDirectory() .

Windows limite les points de fin du chemin et des noms de fichiers. Je suis incapable de trouver une référence concrète à cela, ce n’est que l’une de ces choses mystérieuses qui a toujours été ainsi.

Il coupe les points de fin du chemin d’access complet, pas les composants individuels.

Par conséquent, alors que “C: \ x ….” est identique à “C: \ x”, “C: \ x …. \ filename” est différent de “C: \ x \ filename”, comme ce dernier n’a pas de points de fuite .

Vous devriez regarder le source de FileSystem natif du JDK sous Windows pour voir avec précision comment obtenir une liste de fichiers, mais je soupçonne qu’il effectue une sorte de recherche sur, par exemple, “C: \ x .. \ *. *” Sous Windows. ‘ FindFirstFile API FindFirstFile ou quelque chose, où les points ne sont plus à la traîne. En d’autres termes, en supposant que “C: \ x” est un répertoire, alors que le chemin “C: \ x ..” est un répertoire, “C: \ x .. \ *. *” Ne correspond à rien et “C: \ x .. \ subdirectory “ne correspond pas à” C: \ x \ sous-répertoire “.

Vous devriez éviter d’utiliser de tels chemins. Je ne sais pas comment vous avez obtenu cette chaîne de chemin en premier lieu.

Vous pouvez utiliser File.getCanonicalPath() ou File.getCanonicalFile() pour le reconvertir en un chemin plus utilisable.

Par ailleurs, si vous voulez vous amuser avec Windows, tapez ce qui suit dans une invite de commande (en supposant que “c: \ windows \ temp” existe, sinon remplacez par un autre chemin):

 echo > \\?\c:\windows\temp\x. 

Le préfixe \\?\ Windows désactive le traitement et l’extension du nom de fichier. Maintenant, supprimez le fichier résultant. Essayez-le aussi dans Explorer.

Becquet:

Vous devrez le supprimer avec un joker de la console, par exemple del x?

Vous avez oublié d’append des barres obliques supplémentaires avant .. à cela devrait être c:\\x\\.. Cela vous dirigera vers C: effet