ТЛ; dr
Удалите обратную косую черту sh / -es перед f1\\f2\\
, это предотвращает / они препятствуют правильному разрешению родительского пути.
Пример:
Следующий код разрешает заданный путь root (максимально длинный в вашем примере) с промежуточным путем и именем файла:
public static void main(String[] args) {
String fileName = "file.txt";
// your problem was leading backslash here
Path subPath = Paths.get("f1\\f2");
// create the root paths
Path rootOnC = Paths.get("c:\\programme");
Path rootOnD = Paths.get("d:\\system");
// resolve the subpaths and the filename on the root paths
Path fullPathOnC = rootOnC.resolve(subPath).resolve(fileName);
Path fullPathOnD = rootOnD.resolve(subPath).resolve(fileName);
// print the toString representation of their absolute path
System.out.println("[C:]\t" + fullPathOnC.toAbsolutePath().toString());
System.out.println("[D:]\t" + fullPathOnD.toAbsolutePath().toString());
}
Вывод такой:
[C:] c:\programme\f1\f2\file.txt
[D:] d:\system\f1\f2\file.txt
РЕДАКТИРОВАТЬ
Если вы хотите найти в дереве файлов известный подпуть, вы можете реализовать java.nio.file.FileVisitor
, например, такой:
class PathFinder implements FileVisitor<Path> {
private Path subPathToBeFound;
public PathFinder(Path subPathToBeFound) {
this.subPathToBeFound = subPathToBeFound;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (file.endsWith(subPathToBeFound)) {
// print the full path that contained the given subpath
System.out.println("Subpath found in " + file.toAbsolutePath().toString());
return FileVisitResult.TERMINATE;
} else {
return FileVisitResult.CONTINUE;
}
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
System.err.println("Visit failed: " + exc.getMessage());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
}
и использовать его как-то аналогично к этому минимальному примеру:
public static void main(String[] args) {
String fileName = "file.txt";
// resolve the file name on the subpath
Path subPath = Paths.get("f1\\f2").resolve(fileName);
// create a file visitor
PathFinder pf = new PathFinder(subPath);
/*
* this example finds all available drives programmatically
* and walks the file tree of each one
*/
try {
for (Path root : FileSystems.getDefault().getRootDirectories()) {
System.out.println("Searching in " + root.toAbsolutePath().toString());
Files.walkFileTree(root, pf);
}
} catch (IOException e) {
e.printStackTrace();
}
}
Результатом будет либо полный обход без результата (в случае, если на диске отсутствует подпуть), либо простой вывод на печать наподобие этого:
Subpath found in C:\programme\f1\f2\file.txt