• ,

task31.task3101

package com.javarush.task.task31.task3101;

import java.io.*;
import java.util.*;

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

1. На вход метода main подаются два параметра.
Первый — path — путь к директории, второй — resultFileAbsolutePath — имя файла, который будет содержать результат.
2. Для каждого файла в директории path и в ее всех вложенных поддиректориях выполнить следующее:
2.1. Если у файла длина в байтах больше 50, то удалить его (используй метод FileUtils.deleteFile).
2.2. Если у файла длина в байтах НЕ больше 50, то для всех таких файлов:
2.2.1. Отсортировать их по имени файла в возрастающем порядке, путь не учитывать при сортировке.
2.2.2. Переименовать resultFileAbsolutePath в ‘allFilesContent.txt‘ (используй метод FileUtils.renameFile).
2.2.3. В allFilesContent.txt последовательно записать содержимое всех файлов из п. 2.2.1. Тела файлов разделять «n«.
Все файлы имеют расширение txt.
*/
public class Solution {
public static void main(String[] args) throws IOException {
String path = «D:\\Directory»;
String resultFileAbsolutePath = «D:\\Direct.txt»;

File file = new File(path);
Queuequeue = new PriorityQueue<>();
Collections.addAll(queue, file.listFiles());
ArrayListarrayFiles = new ArrayList<>();
ArrayListfileNames = new ArrayList<>();
ArrayListvuhod = new ArrayList<>();
File res = new File(resultFileAbsolutePath);
if (!res.exists())
res.createNewFile();

while (!queue.isEmpty()) {
File file1 = queue.poll();
if (file1.getAbsolutePath().equals(res.getAbsolutePath())) {

} else {
if (file1.isDirectory())
Collections.addAll(queue, file1.listFiles());
else if (file1.length() > 50)
FileUtils.deleteFile(file1);
else if (file1.length() <= 50)

{

arrayFiles.add(file1);
fileNames.add(file1.getName());

}
}
}
Collections.sort(fileNames);

for (int i = 0; i < fileNames.size(); i++) {
if (i == 0) {
} else {
if (fileNames.get(i) == fileNames.get(i — 1)) {
fileNames.remove(i);
}
}
}
for (int i = 0; i < fileNames.size(); i++) {
for (int j = 0; j < arrayFiles.size(); j++) {
if (fileNames.get(i).equals(arrayFiles.get(j).getName())) {
vuhod.add(arrayFiles.get(j));
}
}
}

File res1 = new File(res.getParent() + "\\allFilesContent.txt");

FileUtils.renameFile(res, res1);

BufferedWriter writer = new BufferedWriter(new FileWriter(res1));

for (File f: vuhod) {
BufferedReader reader = new BufferedReader(new FileReader(f));
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);

}
reader.close();
writer.write(«n»);
}

writer.close();

}

public static void deleteFile(File file) {
if (!file.delete()) System.out.println(«Can not delete file with name » + file.getName());
}
}

12 комментариев

nshumeik
  • nshumeik
  • +1
  • Комментарий отредактирован 2017-02-27 14:20:02 пользователем nshumeik
У меня ваш код выдает:
Can not rename file with name result.txt
Чтобы этого избежать, я делала проверку
<code>if (!res.exists())
            res.createNewFile();</code>
И еще сортируется не правильно. На моих данных получается так (содержимое файлов = пути файла), «а» идет после «д»:
C:\AAA\WWW\aaa2.txt
C:\AAA\WWW\BBB\bbb.txt
C:\AAA\WWW\BBB\CCC\ccc.txt
C:\AAA\WWW\BBB\CCC\ccc2.txt
C:\AAA\data1.txt
C:\AAA\XXX\aaa001.txt
C:\AAA\yyy.txt
C:\AAA\yyy.txt
Еще потерялся файл с одинаковым названием yyy.txt, но путь которого C:\AAA\WWW\yyy.txt. Здесь два раза один и тот же файл выводится. Из map тут берется один и тот же по значению из arrayList.
Еще использовала System.lineSeparator.
Я пока тоже не могу пройти проверку.
Отпишитесь, если у вас получится с учетом этих исправлений.
Dualist
как я ждал хоть какого-то ответа, хоть какой-то идейки, спасибо большое
Как только решу задачу, отпишу
Dualist
я переписал программу полностью, посмотрите пожалуйста + если пройдете валидатор, отпишите)

Добавил проверку на то лежит ли файл resultFileAbsolutePath в директории
if (file1.getAbsolutePath().equals(res.getAbsolutePath())) {

} else {
if (file1.isDirectory())
Collections.addAll(queue, file1.listFiles());
else if (file1.length() > 50)
FileUtils.deleteFile(file1);
else if (file1.length() <= 50)

{

arrayFiles.add(file1);
fileNames.add(file1.getName());

}
}
vvv21
Dualist, вы решили задачу? Тот код, что тут, содержит множество ошибок, но даже если их исправить, логика неверна. На хелпе код не выкладывали?
Dualist
help.javarush.ru/questions/168501/task31-task3101 вот на хелпе
Скажите хоть вы пожалуйста в чем логика не верна?
vvv21
Мда, я надеялся, что там более удобоваримый вид будет. Выложите, пожалуйста, туда же текущий вариант вашего кода, заключив его в тег
код
, появятся хоть номера строк и я смогу описать замечания по строкам, иначе не представляю как это сделать.
Dualist
как заключить в тег?)
vvv21
  • vvv21
  • 0
  • Комментарий отредактирован 2017-03-04 01:08:38 пользователем vvv21
Сдесь — это шестая кнопка вида <> но тут не удобно, т.к. всё равно строки не нумеруются. На хелпе это будет четвёртая вроде бы кнопка и вид другой там у неё (цифры 0101 — типа того). Пробуйте нажимать, так и найдёте :)
040985
В чем косяк? Может кто подскажет? Вроде все по условию…
public class Solution{
    public static void main(String[] args) throws IOException {
        FileUtils fileUtils = new FileUtils();
        Map<String, String> treeMap = new TreeMap<>();
        File originalFile = new File(args[0]); // указываем путь к папке
        File File1 = new File(args[1]); // путь к файлу который нужно переименовать
        File File2 = new File("d:/allFilesContent.txt"); // указываем новое имя файла
        File folder = originalFile.getAbsoluteFile(); //Возвращает полный путь файла.

        for (File file : folder.listFiles()){ // обрабатываем файлы
            if (file.isFile() && file.length() > 50){ // удалем если размер больше 50 байт
                fileUtils.deleteFile(file);
            }else if (file.isFile()){
                BufferedReader reader = new BufferedReader(new FileReader(file.getAbsolutePath()));
                String line;
                String line1= "";
                while ((line = reader.readLine()) != null) { // читаем файл
                    line1 = line1 + line + "\n";
                }
                reader.close();
                treeMap.put(file.getName(), line1); // загружаем в treeMap имя файла и его содержимое
            }
        }

        FileUtils.renameFile(File1,File2);  //переименовываем файл

        OutputStream outStream1 = new FileOutputStream(File2);
        for (Map.Entry<String, String> pair : treeMap.entrySet()) { // Пишем в файл
            String value = pair.getValue();
            outStream1.write(value.getBytes());
            outStream1.write("\n".getBytes());
        }
        outStream1.close();
    }

    public static void deleteFile(File file) {
        if (!file.delete()) System.out.println("Can not delete file with name " + file.getName());
    }
}
melandrey25
Как я понимаю TreeMap не подходит, надо сортировать с помощью Collection.sort()
melandrey25
Ребята, а гляньте такой вариант:
package com.javarush.task.task31.task3101;

import java.io.*;
import java.util.*;

/*
Проход по дереву файлов
*/
public class Solution
{
    public static void main(String[] args) throws IOException
    {
        File file = new File(args[1]);
        File folder = new File(args[0]);
        ArrayList<File> files = new ArrayList<>();

        if (!file.exists())
            file.createNewFile();

        for (File file1 : folder.listFiles())
        {
            if (file1.length()>50) FileUtils.deleteFile(file1);
            else files.add(file1);
        }

        Collections.sort(files, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });

        File allFilesContent = new File("allFilesContent.txt");
        FileUtils.renameFile(file, allFilesContent);


        FileOutputStream fileOutputStream = new FileOutputStream(file);
        for (File file1 : files)
        {
            FileInputStream fileInputStream = new FileInputStream(file1);
            while (fileInputStream.available()>0)
            {
                fileOutputStream.write(fileInputStream.read());
                fileOutputStream.write(System.lineSeparator().getBytes());
            }
            fileInputStream.close();
        }
        fileOutputStream.close();

    }

    public static void deleteFile(File file) {
        if (!file.delete()) System.out.println("Can not delete file with name " + file.getName());
    }
}
melandrey25
  • melandrey25
  • 0
  • Комментарий отредактирован 2017-03-19 19:59:08 пользователем melandrey25
Кто нибудь решил задачу!!! Подскажите, где косяк! Вот мой окончательный вариант:

<code>package com.javarush.task.task31.task3101;

import java.io.*;
import java.util.*;

/*
Проход по дереву файлов
*/
public class Solution
{
    public static void main(String[] args) throws IOException
    {
        File resultFileAbsolutePath = new File(args[1]);
        File path = new File(args[0]);
        ArrayList<File> files = new ArrayList<>();

        if (!resultFileAbsolutePath.exists())
            resultFileAbsolutePath.createNewFile();

        for (File file1 : path.listFiles())
        {
            if (file1.length()>50) FileUtils.deleteFile(file1);
            else files.add(file1);
        }

        Collections.sort(files, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
                                           
        File allFilesContent = new File("d:\\allFilesContent.txt");
        FileUtils.renameFile(resultFileAbsolutePath, allFilesContent);


        FileOutputStream fileOutputStream = new FileOutputStream(allFilesContent);

        for (int i=0; i<files.size();i++)
        {
            byte[] buffer = new byte[1024];
            int length = 0;
            FileInputStream fileInputStream = new FileInputStream(files.get(i));
            while ((length = fileInputStream.read(buffer)) > 0)
            {
                fileOutputStream.write(buffer, 0, length);
            }
            fileOutputStream.write(System.lineSeparator().getBytes());
            fileInputStream.close();
        }

        fileOutputStream.close();
    }</code>
Валидатор пишет:

Хотя работает вроде правильно!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.