absolutePath файла - PullRequest
       5

absolutePath файла

0 голосов
/ 16 января 2020

Я ищу файл в моей системе, но этот файл может иметь другие пути в других системах, то есть, когда я ищу file.txt, он все время находится в /f1/f2/file.txt, но система не с другой стороны, это может быть похоже на c:/programme/f1/f2/file.txt в одной системе, но d:/system/f1/f2/file.txt Я пробовал это, но он не читает абсолютный путь

String filename = "file.txt";
Path path = Paths.get("\\f1\\f2\\");
Path absPath= path.toAbsolutePath(); 
File file = new File(absPath, filename);

, а затем я просто получаю c:\f1\f2\file.txt, или это неправильно

1 Ответ

0 голосов
/ 16 января 2020

ТЛ; 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
...