Подробный список каталогов java и выполнение операций

Я пытаюсь отредактировать файл в каталоге, в котором есть подпапки. Однако мое приложение java не углубляется в подпапки и выполняет операции только в первых подпапках, как показано ниже.

Folder1 (работает) -folder11 (работает) --files (работает) --folder111 (не работает) -folder12 (работает) --files (работает) -folder13 (работает) --files (работает)

Что я делаю неправильно?

Вот мой код:

btnBasla.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){

                File dir= new File(Path2.toString());
                File files[]=dir.listFiles();
                for (File f: files) {
                    if (f.isDirectory()) {
                        try {
                            listDir(f.toString());
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    } else {
                         if (f.getName().lastIndexOf('.')>0) {
                              int lastIndex = f.getName().lastIndexOf('.');
                              String str = f.getName().substring(lastIndex);
                              if (str.equals(".txt") || str.equals(".sub") || str.equals(".srt")) {
                                  try {
                                    String sonuc = islem.koddegıstır(f.getAbsolutePath());
                                    textField.append(sonuc+"\n");
                                } catch (IOException e1) {
                                    e1.printStackTrace();
                                }
                              }
                         }                      
                    }

                }
            }
            public void listDir (String dir) throws IOException{
                File place = new File(dir);
                if (place.isDirectory()){
                    File files[]= place.listFiles();
                    for (File f:files) {
                        if (f.isDirectory()) {
                            listDir(f.getName());
                        } else {
                             if (f.getName().lastIndexOf('.')>0) {
                                  int lastIndex = f.getName().lastIndexOf('.');
                                  String str = f.getName().substring(lastIndex);
                                  if (str.equals(".txt") || str.equals(".sub") || str.equals(".srt")) {
                                      String sonuc = islem.koddegıstır(f.getAbsolutePath());
                                      textField.append(sonuc+"\n");
                                  }
                             }      
                        }
                    }
                }
            }
        });

Возможный дубликат перечислить все файлы в папке, а также подпапки

Umer Farooq 22.04.2018 12:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
98
2

Ответы 2

Что-то не так с вашей функцией, которая перечисляет файлы. Я думаю, вы должны получить все файлы в подпапках с помощью этой функции.

public List<File> listFiles(String dirPath) {
    List<File> files = new ArrayList<>();
    File dir = new File(dirPath);

    if (dir.isDirectory()) {
        for(File file : dir.listFiles()) {
            if (file.isDirectory()) files.addAll(listFiles(file));
            else files.add(file);
        }
    }

    return files;
}

Как видите, эта функция рекурсивно выводит список файлов.

он дает "Несоответствие типов: невозможно преобразовать из List <File> в ошибку File [], когда я пробую этот код". и «Метод isDirectory () не определен для типа String», когда я пытаюсь использовать ваш помощник по коду.

Faruk 23.04.2018 18:18

Ответ iRandomXx правильный, это проблема рекурсии. Я хотел добавить к нему, если он может быть вам полезен.

Попробуйте еще немного разделить логику.

1- получить все файлы рекурсивным методом для их обхода. Похоже, вас интересуют только файлы (а не каталоги). Метод iRandomXx получит только файлы и покинет каталоги, что сделает вашу проверку if-directory избыточной (я удалил ее).

2- перебирайте список и делайте все, что вам нужно, с каждым файлом. Если возникает исключение, вы должны сделать с ним что-нибудь полезное, например, показать пользователю значимое сообщение об ошибке или добавить его в список ошибок.

btnBasla.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // get all files first
        File files[]=listFiles(Path2.toString()); // iRandomX's recursive method
        for (File f : files) {
            // your validation check for extensions
            // modified a bit
            try {
                String fName = f.getName();
                int dotPos = fName.lastIndexOf('.');
                if (dotPos > 0) {
                    String extension = fName.substring(dotPos);
                    if (VALID_EXTENSIONS.contains(extension)) {
                        textField.append(islem.koddegıstır(f.getAbsolutePath())+"\n");
                    }
                }
            } catch (Exception e) {
                // do something useful with the exception, like show the user an error dialog
            }
        }
    }
}


// private class member
private static final List<String> VALID_EXTENSIONS = new ArrayList<>();

// static block to initialize valid extensions
static {
    VALID_EXTENSIONS.add(".txt");
    VALID_EXTENSIONS.add(".sub");
    VALID_EXTENSIONS.add(".srt");
}

// iRandomX's recursive method here

Другие вопросы по теме