Копирование папки рекурсивно в Node.js: fs.cp и fs.cpSync

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для рекурсивного копирования директории и её содержимого в Node.js рекомендуется модуль fs-extra и его функция copySync. Сначала выполните установку модуля при помощи npm install fs-extra, затем вы можете воспользоваться следующим кодом:

JS
Скопировать код
const fs = require('fs-extra');

// Инициируем процесс копирования
fs.copySync('/source/folder', '/destination/folder', { overwrite: true });

Этот скрипт рекурсивно скопирует все файлы и вложенные папки из исходной директории в целевую.

Если вас больше устраивают асинхронные операции, можете использовать функцию copy. Для облегчения вашего кода вы также можете использовать async/await:

JS
Скопировать код
const fs = require('fs-extra');

// Асинхронное копирование с использованием коллбека
fs.copy('/source/folder', '/destination/folder', err => {
  if (err) console.error(err);
  else console.log('Директория успешно скопирована!');
});

// Асинхронное копирование при помощи async/await
async function copyFolder() {
  try {
    await fs.copy('/source/folder', '/destination/folder');
    console.log('Директория успешно скопирована!');
  } catch (err) {
    console.error(err);
  }
}

copyFolder();
Кинга Идем в IT: пошаговый план для смены профессии

Код начинается с понимания

Всё становится значительно проще, когда вы разбираетесь в спецификах. До версии Node v16.7.0 рекурсивное копирование папок было сложно реализуемой задачей, требующей ручной обработки файлов. Однако всё изменилось с добавлением методов fs.cp и fs.cpSync, предоставляющих нативные и производительные решения.

Эти функции были внедрены в Node v16.7.0, полностью изменяя подход к копированию. Следите за обновлениями в Node.js, чтобы быть в курсе изменений и обеспечить стабильность вашего кода.

Обратите внимание, что асинхронные функции требуют правильной обработки ошибок. Возможно, вам пригодятся коллбеки в fs.cp и блоки try/catch при использовании async/await в fs-extra. Это позволит вашему коду корректно обрабатывать все возникающие вопросы.

Эффективные практики

Работа с путями

Модуль path предоставляет обеспеченный способ работы с путями файлов, особого выделения заслуживает его эффективность при кроссплатформенной разработке:

JS
Скопировать код
const path = require('path');
let sourcePath = path.join('source', 'folder'); // 'source/folder'
let destPath = path.join('destination', 'folder'); // 'destination/folder'

Проверка наличия директории

Перед созданием новых папок или копированием файлов убедитесь, что целевой путь не занят:

JS
Скопировать код
const fs = require('fs-extra');
const dir = '/path/to/a/shiny/new/directory';

if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir);
}

Сохранение метаданных

Если вы хотите сохранить атрибуты файлов, такие как временнЫе метки, исключительно полезной будет функция fs.copyFileSync:

JS
Скопировать код
const fs = require('fs');

fs.copyFileSync('/source/file.txt', '/destination/file.txt');

Обработка поддиректорий

Прежде чем современные рекурсивные функции были разработаны, при копировании требовалось делать различия между файлами и директориями, для этого применяли fs.lstatSync().isDirectory().

Визуализация

Процесс копирования папки в Node.js напоминает игру в сборку блоков, где все части необходимо аккуратно переложить на новое место без потерь.

Идем за пределы fs.cp

Дополнительные возможности: fs-extra

Модуль fs-extra расширяет стандартный fs, добавляя дополнительные методы и упрощая повседневное использование:

JS
Скопировать код
fs.copySync('/source/folder', '/destination/folder', { overwrite: false });

Альтернативные методы

Ранее для рекурсивных операций применяли модуль wrench.js. Однако его время прошло, и заменил его собой fs-extra.

Производительность

При копировании больших объемов данных или массивов важно обеспечить отслеживание производительности, чтобы гарантировать быстроту и эффективность процесса.

Безопасность и обслуживание

Следите за обновлениями

Обновления Node.js эквивалентны регулярной медицинской проверке: не пропускайте их и адаптируйте код под новые возможности.

Обращение с асинхронными операциями

При работе с асинхронностью важно применять безопасные практики, такие как try/catch для async/await.

Кроссплатформенность

Убедитесь, что ваш код корректно работает во всех операционных системах.

Полезные материалы