Шаг 108.
Язык программирования Java.
Класс Files. Функции для создания, удаления, копирования и перемещения файлов и директорий

На этом шаге мы рассмотрим модифицирующие функции для работы с файлами и директориями

Кроме проверки наличия, а также получения атрибутов рассматриваемых объектов в классе Files есть модифицирующие функции для работы с файлами и директориями. Данные функции можно разбить на 4 группы:

  1. Функции для создания директории.
  2. Функции для создания файлов.
  3. Функции для удаления файла или пустой директории.
  4. Функции для копирования и перемещения файла или пустой директории.

Рассмотрим каждую группу.

Функции для создания директорий следующие:

Следующая группа это функции для создания файлов:

Третья группа модицирующих функций это функции для удаления файла или пустой директории:

Последняя группа функций это функции для копирования и перемещения файла или пустой директории.


Приведем ниже примеры программ, использующие рассмотренные выше функции.


Пример 1. Напишем программу, в которой создается временная папка. Во временной папке будем создавать несколько временных файлов. После всего этого их удалим (файлы и папку).
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
    /*Задаем количество создаваемых файлов*/
    public static final int N = 4;

    /**
     * Функция для вывода списка файлов в заданной директории
     * @param dir Путь до директории
     * */
    private static void printFilesList(Path dir) {
        System.out.println();
        System.out.println("Список файлов в папке " + dir + ": ");
        File[] filesList = dir.toFile().listFiles();
        if (filesList.length == 0) {
            System.out.println("\tПапка пуста");
        } else {
            for (File file : filesList) {
                System.out.println("\t" + file);
            }
        }
        System.out.println();
    }

    public static void main(String[] args) throws IOException {
        /*Будем создавать временную папку в текущей директории*/
        Path rootDir = Paths.get("");

        /*Создаем временную папку*/
        Path dir = Files.createTempDirectory(rootDir, "tmp");
        System.out.println("Папка " + dir + " создана");

        /*Создаем N файлов во временной папке*/
        Path[] files = new Path[N];
        for (int i = 0; i < N; i++) {
            files[i] = Files.createTempFile(dir, "tmp", ".txt");
            System.out.println("\tФайл " + files[i] + " создан");
        }

        /*Выводим список файлов во временной папке*/
        printFilesList(dir);

        System.out.println("Удаление файлов...");

        /*Удаляем файлы из временной папки*/
        for (int i = 0; i < N; i++) {
            Files.deleteIfExists(files[i]);
        }

        /*Выводим список файлов во временной папке*/
        printFilesList(dir);

        /*Удаляем временную папку*/
        System.out.println("Удаление временной папки...");
        Files.deleteIfExists(dir);

    }
}

Проект можно взять здесь


Рис. 1. Вывод программы


Пример 2. Усложним предыдущий пример. Будем создавать 3 временные папки, а также файлы в одной из них. Потом скопируем половину файлов во вторую папку, а вторую половину файлов переместим в третью папку. После всех этих действий удалим все созданные файлы и папки.
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
    /*Задаем количество создаваемых файлов*/
    public static final int N = 4;

    /**
     * Данная функция создает временную папку в заданной директории и с заданным 
     * префиксом имени. Возвращает объект, ссылающийся на созданную папку.
     *
     * @param root   Папка, в которой будет создавать временная папка
     * @param prefix Префикс для имени папки
     * @return Объект, ссылающийся на созданную папку.
     */
    private static Path createTmpDir(Path root, String prefix) throws IOException {
        Path dir = Files.createTempDirectory(root, prefix);
        System.out.println("Временная папка " + dir + " создана");
        return dir;
    }

    /**
     * Функция для удаления временной папки
     *
     * @param dir Путь до папки
     */
    private static void deleteTmpDir(Path dir) throws IOException {
        System.out.println("Удаление папки " + dir);
        Files.deleteIfExists(dir);
    }

    /**
     * Данная функция создает временные файлы в заданной директории. 
     * Возвращает массив созданных файлов.
     *
     * @param root  Папка, в которой будет создавать временная папка
     * @param count Количество создаваемых файлов
     * @return Массив путей созданных файлов.
     */
    private static Path[] createTmpFiles(Path root, int count) throws IOException {
        Path[] files = new Path[count];

        System.out.println("Создание файлов в папке " + root);
        for (int i = 0; i < count; i++) {
            files[i] = Files.createTempFile(root, "tmp", ".txt");
            System.out.println("\tФайл " + files[i] + " создан");
        }
        System.out.println();

        return files;
    }

    /**
     * Функция для удаления временных файлов
     */
    private static void deleteTmpFiles(Path[] files) throws IOException {
        System.out.println("Удаление файлов из папки " + 
                                                 files[0].getParent().getFileName());
        for (Path file : files) {
            Files.deleteIfExists(file);
            System.out.println("\tФайл " + file + " удален");
        }
        System.out.println();
    }

    /**
     * Функция для копирования некоторых файлов, начиная с позиции begin, и 
     *                                         заканчивая позицией end - 1 в папку to.
     * Возвращает массив путей скопированных файлов.
     *
     * @param files Массив файлов, которые нужно скопировать
     * @param begin Начальная позиция, с которой нужно копировать файлы
     * @param end   Конечная позиция (не включается), до которой нужно копировать 
     *                                                                          файлы
     * @param to    Путь до папки, в которую будут копироваться файлы
     * @return Возвращает массив путей скопированных файлов
     */
    private static Path[] copyFiles(Path[] files, int begin, int end, Path to) 
                                                                 throws IOException {
        Path[] newFiles = new Path[end - begin];
        System.out.println("Копирование файлов [" + begin + "; " + (end - 1) + 
                         "] из папки " + files[begin].getParent() + " в папку " + to);
        for (int i = begin; i < end; i++) {
            newFiles[i - begin] = Paths.get(to.toString() + "/" + 
                                                              files[i].getFileName());
            Files.copy(files[i], newFiles[i - begin]);
            System.out.println("\tФайл " + files[i].getFileName() + " скопирован");
        }
        System.out.println();
        return newFiles;
    }

    /**
     * Функция для перемещения некоторых файлов, начиная с позиции begin, и 
     *                                        заканчивая позицией end - 1 в папку to.
     * Возвращает массив путей файлов, которые были перемещены.
     *
     * @param files Массив файлов, которые нужно переместить
     * @param begin Начальная позиция, с которой нужно переместить файлы
     * @param end   Конечная позиция (не включается), до которой нужно переместить
    *                                                                          файлы
     * @param to    Путь до папки, в которую будут перемещаться файлы
     * @return Возвращает массив путей файлов, которые были перемещены.
     */
    private static Path[] moveFiles(Path[] files, int begin, int end, Path to) 
                                                                 throws IOException {
        Path[] newFiles = new Path[end - begin];
        System.out.println("Перемещение файлов [" + begin + "; " + (end - 1) + 
                         "] из папки " + files[begin].getParent() + " в папку " + to);
        for (int i = begin; i < end; i++) {
            newFiles[i - begin] = Paths.get(to.toString() + "/" + 
                                                              files[i].getFileName());
            Files.move(files[i], newFiles[i - begin]);
            System.out.println("\tФайл " + files[i].getFileName() + " перемещен");
        }
        System.out.println();
        return newFiles;
    }

    /**
     * Функция для вывода списка файлов в заданной директории
     *
     * @param dir Путь до директории
     */
    private static void printFilesList(Path dir) {
        System.out.println("Список файлов в папке " + dir + ": ");
        File[] filesList = dir.toFile().listFiles();
        if (filesList.length == 0) {
            System.out.println("\tПапка пуста");
        } else {
            for (File file : filesList) {
                System.out.println("\t" + file);
            }
        }
        System.out.println();
    }

    public static void main(String[] args) throws IOException {
        Path rootDir = Paths.get("");

        /*Создаем временные папки*/
        Path dir = createTmpDir(rootDir, "tmp");
        Path copyDir = createTmpDir(rootDir, "copy_tmp");
        Path moveDir = createTmpDir(rootDir, "move_tmp");

        System.out.println();

        /*Создаем временные файлы в первой папке*/
        Path[] files = createTmpFiles(dir, N);

        /*Копируем первую половину файлов из первой папки во вторую*/
        Path[] copyFiles = copyFiles(files, 0, N / 2, copyDir);
        printFilesList(copyDir);

        /*Перемещаем вторую половину файлов из первой папки в третью папку*/
        Path[] moveFiles = moveFiles(files, N / 2, N, moveDir);
        printFilesList(moveDir);

        /*Удаляем все созданные временные файлы*/
        deleteTmpFiles(files);
        deleteTmpFiles(copyFiles);
        deleteTmpFiles(moveFiles);

        /*Удаляем все созданные временные папки*/
        deleteTmpDir(dir);
        deleteTmpDir(copyDir);
        deleteTmpDir(moveDir);
    }
}

Проект можно взять здесь


Рис. 2. Вывод программы


На следующем шаге мы продолжим изучение класса Files

Предыдущий шаг Содержание Следующий шаг