53 votes

Comment vérifier si un chemin donné est possiblement enfant d'un autre chemin ?

J'essaie de trouver si le chemin donné est un enfant possible d'un autre chemin utilisant java. Les deux chemins peuvent ne pas exister.

Disons que c:\Program Files\My Company\test\My App est un enfant possible de c:\Program Files .

Actuellement je fais ça avec

 boolean myCheck(File maybeChild, File possibleParent)
{
    return maybeChild.getAbsolutePath().startsWith( possibleParent.getAbsolutePath());
}

68voto

user2100025 Points 191

Vous pouvez également utiliser java.nio.file.Path pour le faire beaucoup plus facilement. La méthode java.nio.file.Path.startsWith semble gérer tous les cas possibles.

Exemple:

 private static void isChild(Path child, String parentText) {
    Path parent = Paths.get(parentText).toAbsolutePath();
    System.out.println(parentText + " = " + child.startsWith(parent));
}

public static void main(String[] args) {
    Path child = Paths.get("/FolderA/FolderB/File").toAbsolutePath();
    isChild(child, "/FolderA/FolderB/File");
    isChild(child, "/FolderA/FolderB/F");
    isChild(child, "/FolderA/FolderB");
    isChild(child, "/FolderA/Folder");
    isChild(child, "/FolderA");
    isChild(child, "/Folder");
    isChild(child, "/");
    isChild(child, "");
}

les sorties

 /FolderA/FolderB/File = true
/FolderA/FolderB/F = false
/FolderA/FolderB = true
/FolderA/Folder = false
/FolderA = true
/Folder = false
/ = true
 = false

Si vous avez besoin de plus de fiabilité, vous pouvez utiliser "toRealPath" au lieu de "toAbsolutePath".

14voto

biziclop Points 21446
File parent = maybeChild.getParentFile();
while ( parent != null ) {
  if ( parent.equals( possibleParent ) )
    return true;
  parent = parent.getParentFile();
}
return false;

8voto

finnw Points 24592

Cela fonctionnera pour votre exemple. Il renverra également true si l'enfant est un chemin relatif (ce qui est souvent souhaitable.)

 boolean myCheck(File maybeChild, File possibleParent)
{
    URI parentURI = possibleParent.toURI();
    URI childURI = maybeChild.toURI();
    return !parentURI.relativize(childURI).isAbsolute();
}

4voto

skaffman Points 197885

Cela fonctionnera probablement bien tel quel, même si j'utiliserais getCanonicalPath() plutôt que getAbsolutePath() . Cela devrait normaliser tous les chemins étranges tels que x/../y/z qui, sinon, gâcheraient la correspondance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X