Добавить текст в несколько файлов в каталогах с условиями (Java)

У меня есть один каталог, содержащий кучу подкаталогов, каждый из которых содержит несколько текстовых файлов. Каждый из подкаталогов содержит текстовый файл с тем же именем, что и подкаталог, в котором он содержится; Я хочу добавить содержимое этого файла во все остальные текстовые файлы, кроме того, который разделяет имя с подкаталогом, и я хочу сделать это в java.

Например, учитывая каталог a, содержащий подкаталоги b, c, d, содержащие соответственно файлы b, e, f и c, g, h и d, i, j, я хочу иметь каталог a, содержащий подкаталоги b, c ,d, содержащие соответственно файлы b, b+e, b+f и c, c+g, c+h и d, d+i, d+j, и, возможно, удаляя добавленные файлы, то есть файлы a, до н.э.

final File folder = new File("/path-of-directory/");

public static void listFilesForFolder(final File folder) {
    for (final File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            listFilesForFolder(fileEntry);
        } else if (fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase()))
        
               // found the file which content has to be added to other files in the same directory. How to?
        }
}

person Kyle    schedule 28.03.2017    source источник
comment
Сначала вам нужно попробовать написать код, а затем поделиться им с нами, если у вас возникнут определенные проблемы.   -  person aUserHimself    schedule 28.03.2017
comment
конечная папка с файлами = новый файл (/путь к каталогу/); public static void listFilesForFolder (конечная папка с файлами) { for (final File fileEntry: folder.listFiles()) { if (fileEntry.isDirectory()) { listFilesForFolder (fileEntry); } else if (fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(.)).toLowerCase().equals(folder.getName().toLowerCase())) // найден файл с содержимым должен быть добавлен к другим файлам в том же каталоге. Как? } }   -  person Kyle    schedule 28.03.2017
comment
Пожалуйста, отредактируйте свой ответ, добавив в него любую дополнительную информацию (например, код выше), и не забудьте отформатировать его.   -  person aUserHimself    schedule 28.03.2017
comment
простите, спасибо. Проблемы новичка.   -  person Kyle    schedule 28.03.2017


Ответы (1)


Это решение отлично сработало для меня, обязательно прочитайте комментарии для деталей:

public class FileCopy {

    public static void recursivelyCopyContent(final File folder) {
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                recursivelyCopyContent(fileEntry);
            } else if (fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase())) {
                // just pass the folder and the file to the method that will do the actual content copy 
                copyContent(folder, fileEntry);
            }
        }
    }

    public static void copyContent(final File folder, final File fileName) {
        try {
             // get the byte[] content of the source file
            byte[] fileContent = Files.readAllBytes(fileName.toPath());
            for (final File fileEntry : folder.listFiles()) {
                // only select files with a different absolute path than the source one
                if(fileEntry.isFile() && !fileEntry.getAbsolutePath().equals(fileName.getAbsolutePath())) {
                    // append contents from source to destination file 
                    Files.write(fileEntry.toPath(), fileContent, StandardOpenOption.APPEND);
                }
            }
        }catch (IOException e) {
            e.getStackTrace();
        }
    }

    public static void main(String[] args) {
        final File folder = new File("/path-of-directory/");
        FileCopy.recursivelyCopyContent(folder);
    }
}

Только обратите внимание на файлы без расширения: ваше состояние

fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase())

выдаст java.lang.StringIndexOutOfBoundsException, так как в их имени нет символа ..

В этом случае я предлагаю следующий подход:

// both cases covered: files have or do not have an extension
if (
    (!fileEntry.getName().contains(".") && fileEntry.getName().toLowerCase().equals(folder.getName().toLowerCase())) ||
    (fileEntry.getName().contains(".") && fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase())) 
)
person aUserHimself    schedule 28.03.2017
comment
Ваше решение работает отлично, за исключением вызова listFilesForFolder, который был старым именем метода. Замена его на recursivelyCopyContent и изменение подписи у меня тоже отлично работает. - person Kyle; 28.03.2017
comment
Я просто попытался добавить к нему более наводящее на размышления имя. Вы можете изменить его обратно, если хотите, это не проблема. - person aUserHimself; 28.03.2017
comment
Я имел в виду вызов listFilesForFolder(fileEntry) в пятой строке вашего решения, который должен быть recursivelyCopyContent(fileEntry), потому что имя рекурсивного метода больше не listFilesForFolder. - person Kyle; 28.03.2017