Я пытаюсь отредактировать файл в каталоге, в котором есть подпапки. Однако мое приложение 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");
}
}
}
}
}
}
});




Что-то не так с вашей функцией, которая перечисляет файлы. Я думаю, вы должны получить все файлы в подпапках с помощью этой функции.
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», когда я пытаюсь использовать ваш помощник по коду.
Ответ 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
Возможный дубликат перечислить все файлы в папке, а также подпапки