Сам node.js не предоставляет API для непосредственного копирования файлов. Если вы хотите скопировать файлы или каталоги с Node.js, вам необходимо использовать другие API для их реализации. Вы можете использовать readfile и writefile непосредственно для копирования одного файла, что проще. Если вы копируете все файлы в каталоге, а каталог также может содержать подкаталоги, вам необходимо использовать более продвинутый API.
поток
Потоки - это способ перемещения данных node.js. Потоки в node.js читаются/считываются, и модули HTTP и файловой системы используют потоки. В файловой системе при использовании потоков для чтения файлов большой файл не может быть прочитал одновременно, но будет прочитать несколько раз. При чтении это будет реагировать на события данных. Вы можете работать на данных чтения до прочтения файла. Точно так же при записи в потоку большие файлы не записываются за один раз, как при чтении. Этот способ перемещения данных очень эффективен, особенно для больших файлов. Использование потоков намного быстрее, чем ждать, чтобы все большие файлы были прочитаны перед работой файлов.
трубопровод
Если вы хотите иметь полный контроль при чтении и написании потоков, вы можете использовать события данных. Но для простой репликации файлов потоки считывания и потоки записи могут передавать данные через трубопроводы.
Практическое применение:
Кода -копия выглядит следующим образом:
var fs = require ('fs'),
stat = fs.stat;
/*
* Скопируйте все файлы в каталоге, включая подкаталоги
* @param {string} каталог, который необходимо скопировать
* @param {string} копирование в указанный каталог
*/
var copy = function (src, dst) {
// Читать все файлы/каталоги в каталоге
fs.readdir (src, function (err, paths) {
if (err) {
бросить ошибку;
}
paths.foreach (function (path) {
var _src = src + '/' + path,
_dst = dst + '/' + path,
читаемый, записывается;
stat (_src, function (err, st) {
if (err) {
бросить ошибку;
}
// определить, является ли это файлом
if (st. shiSfile ()) {
// Создать поток чтения
читаемый = fs.createreadStream (_SRC);
// Создать поток записи
Запись = fs.createwritestream (_dst);
// Передача потоков через трубопроводы
читаемый.pipe (записи);
}
// Если это каталог, вызовите себя рекурсивно
else if (st.isdirectory ()) {
существует (_src, _dst, копия);
}
});
});
});
};
// Перед копированием каталога необходимо определить, существует ли каталог. Если его не существует, вам нужно сначала создать каталог.
var существует = function (src, dst, callback) {
fs.exists (dst, function (существует) {
// уже существует
if (существует) {
обратный вызов (SRC, DST);
}
// не существует
еще{
fs.mkdir (dst, function () {
обратный вызов (SRC, DST);
});
}
});
};
// скопировать каталог
существует ('./src', './build', copy);