Файлы ходить не возвращает абсолютные пути только имя файла - PullRequest
0 голосов
/ 27 апреля 2019

У меня на рабочем столе есть папка со структурой, подобной этой:

-/documents
   -/00
     -1.html
     -2.html
   -/01
     -3.html
     -4.html
   -/02
     -5.html
     -6.html

Я хочу получить все файлы внутри /documents, поэтому я сделал это:

ArrayList<String> paths = new ArrayList<String>();
    fc = new JFileChooser();
    fc.setMultiSelectionEnabled(true);
    fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    fc.showOpenDialog(fc);
    File[] file = fc.getSelectedFiles();
    for (File f : file) {
        try {
            Files.walk(Paths.get(f.getAbsolutePath())).filter(Files::isRegularFile)
                    .forEach(p -> paths.add(p.getFileName().toString()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    return paths;

Однако я получаю только имена файлов, например:

1.html
2.html

и т. Д.Я не могу найти способ получить каждый путь к файлу, как это:

/documents/00/1.html
/documents/00/2.html
/documents/01/3.html
/documents/01/4.html

И т.д.Использование p.getFileName().toAbsolutePath() не сработало, я получил пути, как если бы они были внутри моего рабочего пространства:

C:\Users\n\workspace\test\1.html

1 Ответ

2 голосов
/ 27 апреля 2019

Вместо использования p.getFileName().toString() попробуйте использовать p.toString().вы должны получить фактический путь вывода всех файлов.

Я создал похожую структуру, и если я запустил вышеуказанную программу, как показано ниже:

ArrayList<String> paths = new ArrayList<String>();
    JFileChooser fc = new JFileChooser();
    fc.setMultiSelectionEnabled(true);
    fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    fc.showOpenDialog(fc);
    File[] file = fc.getSelectedFiles();
    for (File f : file) {
        System.out.println(f.getAbsolutePath());
        try {
            Files.walk(Paths.get(f.getAbsolutePath())).filter(Files::isRegularFile)
                    .forEach(p -> paths.add(p.toString()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    System.out.println(paths);

, я получу следующий вывод:

[D: \ document \ 00 \ 1.html, D: \ document \ 00 \ 2.html, D: \ document \ 01 \ 3.html]

Это выход вы ожидаете?

...