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

  • 28
  • Недоступна
1. На вход метода main подаются два параметра. Первый - path - путь к директории, второй - resultFileAbsolutePath - имя (полный путь) существующего файла, который будет содержать результат. 2. Переименовать resultFileAbsolutePath в 'allFilesContent.txt' (используй метод FileUtils.renameFile, и, если понадобится, FileUtils.isExist).
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (408)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
pro100Lesha 22 уровень
вчера, 18:50
Сама задача интересная, решение с помощью рекурсии написал за 30 мин, НО С ВАЛЕЙ СРАЖАЛСЯ БОЛЬШЕ 2 ЧАСОВ!!!. Чем удивил валтдатор: 1) со static методом getFileList(сatalog, files) не проходит, при этом пункт "Не используйте статические переменные" горит зеленым только так
new Solution().getFilesList(catalog, files);
2) Поток для записи в файл открывать нужно обязательно до того как начали что то делать с каталогами и файлами, т. е. сразу после того как его создали. 3) Закрытие потока для записи валя у меня не видел никак, хотя все прекрасно закрывалось. Лечение - Открыл поток для чтения как сказано в пункте 3 и тут же закрыл его. 4) У всех файлов с которыми работает ваш алгоритм обязательно нужно. проверить наличие в имени ".txt" я проверял просто "." и это валю не устраивало. P. S. Мб вале просто не нравится рекурсия 🤷‍♂️
Антон Full Stack Developer
23 ноября, 18:18
Есть особый вид извращений - кодинг под Вали 🤯
Андрей 33 уровень, Москва
17 ноября, 17:50
Прошел достаточно быстро. Опишу алгоритм с учетом проверок валидатора: 1. Для 2го параметра main создаем отдельные переменные File для поступившего параметра и File для "allFilesContent.txt" при создании нужно добавить весь путь (это обязательно валидатор просит именно объекты File) 2. Переименовываем (можно добавить проверку isExist и удалять файл перед переименованием, но валик принимает и без этого. У меня стояла проверка на то, что если файл существует, то тогда не переименовываем, но в таком виде валик не принимает) 3. Создаем класс от SimpleFileVisitor (если не понимаете о чем речь смотрите в самом конце ссылку https://javarush.ru/groups/posts/2275-files-path и можно сначала решить третью задачу): 3.1. в нем объявляем TreeMap<String, String> (Имя файла и содержимое + "\n") 3.2. Реализуем проверку размера: byte[] content = Files.readAllBytes(file); int size = content.length; 3.3. Добавляем информацию в Map если подходит 4. в main после переименования используя п. 3. создаем объект SimpleFileVisitor и реализуем метод Files.walkFileTree с 1 параметром main и этим объектом 5. Создаем объем FileWriter через try с ресурсами и добавляем в него Value из Map
Ann 33 уровень, Киев
16 ноября, 18:51
https://github.com/anndiak/https-github.com-anndiak--com.javarush.task.task31.task3101/blob/main/%D0%BF%D1%80%D0%BE%D1%85%D0%BE%D0%B4%20%D0%BF%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%83
Andrei 28 уровень, Санкт-Петербург
13 ноября, 09:24
Понравилась задача, тк затрагивает несколько тем, часть из них на повторение, а это очень даже полезно бывает, тк у меня многое забывается.
Артем В. 34 уровень, Санкт-Петербург
11 ноября, 13:02
Странно, почему то если не параметризовать SimpleFileVisitor<>;, то при запуске валидатора происходит ошибка компиляции, но при запуске программы все норм, ошибок нет и работает как нужно. Вот так пропускает - Files.walkFileTree(path.toPath(), new SimpleFileVisitor<Path>(){... Хотя сама Idea помечает <Path> серым цветом и предлагает его убрать.
wan-derer.ru 33 уровень, Москва
9 ноября, 18:47
Написал рекурсивный обход каталогов, запускаю.... валя не принимает: все пункты красные кроме последнего! На компе всё работает... Читаю обсуждение, здесь упирают на статические переменные, а это как раз последний пункт, который у меня зелёный! Ладно, метод-то мой статический, сделал его обычным и переделал вызов так:
new Solution().getFilesList(catalog, files);
и прошло! Да блин же! У народа в среднем 8 попыток. Думаю, это повод авторам доработать вальку, чтобы она правильно указывала на ошибки. И ещё: пока я искал что же у меня неправильно переименовывается, пытался вывести в консоль пути файлов, но в консоли глухо! Тестовую среду тоже надо доработать чтобы она адекватно реагировала.
Artem K. 29 уровень, Москва
3 ноября, 20:46
Потратьте полчаса и разберитесь с SimpleFileVisitor, тем более, что нужные пакеты уже импортированы в Solution, а вот, например потоков для чтения файлов нет. Ну и внимательно прочитайте условие, там указано все, что нужно учесть. если понадобится, FileUtils.isExist() - не понадобится 😀 На русском, но не все, только основа: link Оф док-ция (тот вариант EnumSet<FileVisitOption>, который там указан надо скорректировать, или добавить пакет в импорт): link В части EnumSet<FileVisitOption>, можно так:
EnumSet<FileVisitOption> opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
С этой опцией не до конца разобрался. Она идете обязательной, но у нее всего один вариант выбора. Но без нее не получается указать глубину обхода директорий, а это необходимо. Если зайдете в тупик, вот готовый вариант. Даже немного комментариев добавил: link
Евгений 25 уровень, Kotlas
27 октября, 15:44
Всего эту задачу решили 6003 учеников ПОЖАЛУЙСТА НЕ ПОВТОРЯЙТЕ МОИХ ОШИБОК! НЕ УКАЗЫВАЙТЕ В PATH КОРЕНЬ ДИСКА. ОТ ЭТОГО РЕКУРСИЯ НЕ РАБОТАЕТ. Я НА ЭТО УБИЛ ОДИН ДЕНЬ! А не работает она, потому что в корне диска лежат папки/файлы, в которые машина зайти не смогла (типа recycle.bin). Жизнь боль😤
Тимур Исхаков 23 уровень, Ульяновск
19 октября, 10:33
ИТАК! Если вы устали гадать, обматерили валидатор и вообще на грани физического истощения, как был я, то вот вам инструкция. 1. Удивительно, но валидатор в этой задаче даже не тупит, а относительно нормально проверяет. Невероятно, но факт. Почему относительно? Первое, на что ругается валя - remaneTo. И не важно, что только что в лекции разбирали именно этот метод класса файл, а так же не важно, что FileUtils.renameFile() точно такой же метод (внутри себя вызывает renameTo), просто еще и выводит в консоль, если файл не был переименован. Допустим, что косяк не так страшен, но сколько пик сломано в этой войне... 2. После переименования файла далее в коде следует обращаться к File, который мы создали как вспомогательный. Почему так, не знаю, информации пока не нашел. Если знаете, дополняйте комментарий. (Обращение к изначальному файлу привод к его повторному созданию под старым именем. Сделаю предположение, что после renameTo исходному файлу присваивается новая переменная, а старая ждет сбора мусора по завершению метода mein). 3. Валидатор кушает BufferedWriter и Reader. Открыть поток в файл необходимо заранее, до поиска файлов, и закрыть в самую последнюю очередь. Никаких двойных закрытий и плясок с бубном! 4. Как же добыть файлы из подпапок. Пришлось немного попотеть, но вам достаточно написать отдельный метод, в который мы передадим папку и список, который будет просматривать файлы в папке, отбирать их по размеру, и вызывать сама себя, если это подпапка. Называется рекурсия.
public static void getListFiles(File folder, ArrayList<File> list)
5. Полученный список сортировать не обязательно, но вы как хотите. Лично я искал минимальное значение среди list.get().getName(), вызывал заранее написанный метод по копированию содержимого файла в общий файл, и удалял его. 6. Вы прекрасны, закройте поток!
Тимур Исхаков 23 уровень, Ульяновск
19 октября, 11:38
Еще небольшая ремарка. Исходя из количества импортированных пакетов, задачу можно решить более мудрено и компактно, но я предпочитаю решать задачи на основе лекций. Кто-то может сказать, что такой подход не правильный, но я больше переживаю за своем психологическое здоровье, чем за упрощение кода) Будет задача, решить с тройным сально назад, так и сделаю, ну а пока все работает и хорошо)
Ivan D 33 уровень
12 ноября, 16:58
Благодарю. 10 попыток. А все потому, что: Открыть поток в файл необходимо заранее, до поиска файлов. Валя видимо ругался на исключение от метода поиска файлов, из-за которого могло пропустить открытие потока.