Проход по дереву файлов

  • 11
  • Недоступна
1. На вход метода main подаются два параметра. Первый - path - путь к директории, второй - resultFileAbsolutePath - имя файла, который будет содержать результат. 2. Для каждого файла в директории path и в ее всех вложенных поддиректориях выполнить следующее: 2.1. Если у файла длина в байтах больше 5
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (187)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Ненавижу 1С22 уровень, Санкт-Петербург
вторник, 19:54
Опишу свою проблему, может поможет кому-нибудь. Валидатор не пропускал по 3 пункту, хотя на тестовой все ок... Проблема в том, что я открывал файлики в обычном блокноте, который не воспринимал "\n" и все смешивалось в одну кучу... Нашел решение в инете... добавить "\r\n"........ И так как тестил я частями, то про этот пункт благополучно забыл.... Так вот. Если у кого - то не пропускает по 3 пункту и вы уже перешли к построковым тестам перед записью в файл, то посмотрите внимательно на свой код... Наличие "\r\n" - корень ваших бед))
13Black33 уровень, Москва
12 апреля, 10:05
С утра проснулся думаю сейчас задачку решу и буду завтракать. Время час дня, что то кушать хочется(
Pasha22 уровень, Новосибирск
4 апреля, 07:45
Не принимает задание. Уже вставил 3 версии готового кода, который проходил проверку - ноль реакции, всё неправильно
S3R3N1TY33 уровень, Санкт-Петербург
2 апреля, 14:51
В начале обход сделал через рекурсию, отдельным методом - примерно так:
//Обход дерева файлов и заполнение списка
   public static void walkFileTree(File path, List<File> list) {
     Если файл - директория {
           for (File f : path.listFiles()) {
               Если это файл и его размер <=50 {
                   list.add(f);
               } else if (f.isDirectory()) {
                   walkFileTree(f, list); }}}}
Список я создал прямо в main и просто передал в мой метод, чтобы он его заполнил. После сдачи программы, решил реализовать через готовый класс SimpleFileVisitor, что тоже получилось. Скину ссылку на очень понятное доходчивое обьяснение: SimpleFileVisitor обьяснение Создал свой класс, унаследовался от SimpleFileVisitor, переопределив всего один метод:
public class MyFileVisitor extends SimpleFileVisitor<Path> {
    private List<File> list = new ArrayList<>();
    public List<File> getList() {
        return list;}
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
      ........
        return FileVisitResult.CONTINUE; }}
Также в своем классе сделал список, который он мне и будет заполнять и потом я могу его получить через get. Вообщем интересная штука, интерфейс FileVisitor.
TheDIP23 уровень, Киев
2 апреля, 17:28
Сделал аналогично только список сделал статическим полем класса.
S3R3N1TY33 уровень, Санкт-Петербург
2 апреля, 12:13
Ребята если у вас пишет, что создайте файл, укажите полный путь и у вас такой код:
File resultFile = new File(resultFileAbsolutePath);
if (FileUtils.isExist(resultFile)) {
    File newPath = new File(resultFile.getParent()  + "/allFilesContent.txt");
    FileUtils.renameFile(resultFile, newPath);
    resultFile = newPath;
}
То уберите проверку if, без этой проверки валик пропустил, зачем тогда в условие писали что можно использовать. Скорее правильно в данном случае написать так:
File resultFile = new File(resultFileAbsolutePath);
      if (!FileUtils.isExist(resultFile)) return;
То есть, если ли файла, который мы хотим переименовать- нету, то выходим из программы. А если есть- то уже переименовываем и дальше другие действия. Не знаю примет так валик, попробуйте.
TheDIP23 уровень, Киев
2 апреля, 17:21
Спасибо, помогло
Филипп22 уровень, Минск
29 марта, 18:56
Хорошая задачка, часа 2 наверно сидел. Правда как обычно формулировка условия нечеткая, приходится самому додумывать. После того как код написал, с валидатором еще полчаса нервы себе поубивал и плюнул))
Михаил Б.22 уровень, Москва
28 марта, 16:16
У меня была проблема с переименованием файла. FileUtils.renameFile(resultFileAbsolutePath, newNameFile); эта команда всегда выдавала false. В итоге я создал поток для чтения для нового файла newNameFile, а не resultFileAbsolutePath, как должно по идее быть, и валидатор это принял. Вот как его понять..
Дмитрий Войтенко26 уровень, Харьков
22 марта, 14:12
"2. Для каждого файла в директории path и в ее всех вложенных поддиректориях выполнить следующее:" Будьте внимательны. Я бегло прочитал условия и не воспринял, что нужно и в поддиректориях файлы захватить для записи. А потом думал почему "лыжи не едут".
Дмитрий Войтенко26 уровень, Харьков
22 марта, 16:14
А я еще не партесь по поводу сортировки. Я заморочился сделал чтобы сортировало в таком порядке: файл 1, файл 2, Файл 3, файл 12. Также учитывал регистр и т.д А валидатору достаточно и стандратной сортировки типо: Файл 3, файл 1, файл 12, файл 2 Короче итого 27 попыток.
Gogogo34 уровень
22 марта, 10:58
Долго не пропускал первый пункт. Похоже, объекты File следует называть path и resultFileAbsolutePath
An DongMeng30 уровень
17 марта, 11:47
Полтора чччаса тупления. Оказалось просто ккаждый следующий файл добавлял сразу а не с новой строки
An DongMeng30 уровень
17 марта, 11:47
аж заикаться начал
S3R3N1TY33 уровень, Санкт-Петербург
2 апреля, 14:08
хахах))) согласен, валик нервы потрепал. У меня все верно добавлялось, дело было в самом начале программы, проверил существует ли файл через FileUtils.isExist, убрал проверку и все прошло.