2015-05-04 4 views
2

Я делаю программу, которая меняет изображения серого на черно-белые изображения, программа должна читать все .png-файлы из папки и подпапок и после их редактирования сохранять к новому реж. Все работало по назначению, но я внес некоторые изменения, и теперь программа только считывает файлы из первой папки или подпапки с изображениями.Java читает файлы в папке и вложенных папках

public class FindFiles { 
public void find(String dir, String finDir){ 
    try { 
     File folder = new File(dir); 
     File[] listOfFiles = folder.listFiles(); 

     ChangeColor change = new ChangeColor(); 

     for(int i = 0; i < listOfFiles.length; i++) { 
      if (listOfFiles[i].isFile()) { 
       change.ChangeC(dir, finDir, listOfFiles[i].getName()); 
      } else if (listOfFiles[i].isDirectory()) { 
       File f = new File(finDir+"/"+listOfFiles[i].getName()); 
       if (!f.isDirectory()) { 
        new File(finDir+"/"+listOfFiles[i].getName()).mkdirs(); 
       } 
       find(dir+"/"+listOfFiles[i].getName(),finDir+"/"+listOfFiles[i].getName()); 
      } 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(FindFiles.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

}

Я был бы признателен за вашу помощь в выяснении причины этого.

ответ

1

Рассмотрим очистку кода, а затем ищет ошибки:

public class FindFiles { 
    public void find(File src, File target) { 
     assert(src.isDirectory() && target.isDirectory()); 
     try { 
      File[] fileList = src.listFiles(); 

      ChangeColor change = new ChangeColor(); 

      for (File file : fileList) { 
       if (file.isFile()) { 
        change.ChangeC(file, target); 
       } else if (file.isDirectory()) { 
        // create the File object for the directory name 
        File newDir = new File(target, file.getName()); 
        newDir.mkdir(); 
        find(file, newDir); 
       } 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(FindFiles.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

У вас есть много ненужного поколения File с и смешивания строк и File сек, когда File будет делать.

Вам нужно изменить подпись ChangeColor.changeC(), чтобы принять File объект, который должен быть преобразован из исходного каталога и File объекта для того, где он должен быть записан в виде мишени. Метод должен убедиться, что второй параметр является каталогом, как я здесь, - никогда не доверяйте вызывающему абоненту!

Я не тестировал этот код, и есть несколько других вещей, которые я бы сделал иначе (например, обработка исключений), но я не хотел, чтобы структура была слишком разной, чтобы вы могли легче визуализировать изменения.

Что я здесь сделал, это форма Оборонительная кодировка. Проведите время с Razor Оккама, чтобы получить код до минимального спереди. Выберите имена переменных, которые будут иметь смысл при чтении метода, а не имена, которые хорошо смотрятся наверху (и не бойтесь продолжать их менять до тех пор, пока они не читаются легко). Ошибки, которые существуют, будут намного яснее, и вы сэкономите много времени в долгосрочной перспективе.

+0

Thx для ответа и совета я знаю, что код был жестоким. Btw Я нашел ошибку, я забыл проверить, был ли файл png перед изменением цвета, поэтому из-за этого был прочитан скрытый файл. – Runaider

+0

Никто не начинает писать идеальный код, не беспокойтесь! Повеселись! –

Смежные вопросы