Помимо того, что пути могут не существовать (и канонизация может не увенчаться успехом), это выглядит как разумный подход, который должен работать в прямом случае.
Возможно, вы захотите взглянуть на вызов getParentFile () для «возможно дочернего» в цикле, проверяя, соответствует ли он родительскому элементу на каждом шаге.Вы также можете замкнуть сравнение, если родитель не является (настоящим) каталогом.
Возможно, что-то вроде следующего:
boolean myCheck(File maybeChild, File possibleParent) throws IOException
{
final File parent = possibleParent.getCanonicalFile();
if (!parent.exists() || !parent.isDirectory()) {
// this cannot possibly be the parent
return false;
}
File child = maybeChild.getCanonicalFile();
while (child != null) {
if (child.equals(parent)) {
return true;
}
child = child.getParentFile();
}
// No match found, and we've hit the root directory
return false;
}
Обратите внимание, что если вы хотите, чтобы дочерние отношениябыть строгим (т. е. каталог не является дочерним для себя), вы можете изменить начальное присвоение child
в строке 9 на child.getParentFile()
, поэтому первая проверка происходит в содержащем дочерний каталог.