O próprio Node.js não fornece uma API para copiar diretamente arquivos. Se você deseja copiar arquivos ou diretórios com o Node.js, precisará usar outras APIs para implementá -lo. Você pode usar o ReadFile e o Writefile diretamente para copiar um único arquivo, o que é mais fácil. Se você copiar todos os arquivos em um diretório e o diretório também poderá conter subdiretos, precisará usar uma API mais avançada.
fluxo
Os fluxos são a maneira como node.js move os dados. Os fluxos no Node.js são legíveis/graváveis, e os módulos HTTP e do sistema de arquivos usam fluxos. No sistema de arquivos, ao usar fluxos para ler arquivos, um arquivo grande pode não ser lido de uma só vez, mas será lido várias vezes. Ao ler, ele responderá aos eventos de dados. Você pode operar nos dados de leitura antes que o arquivo seja lido. Da mesma forma, ao escrever em um fluxo, arquivos grandes não são escritos ao mesmo tempo, assim como a leitura. Essa maneira de mover dados é muito eficiente, especialmente para arquivos grandes. O uso de fluxos é muito mais rápido do que esperar que todos os arquivos grandes sejam lidos antes de operar os arquivos.
oleoduto
Se você deseja ter controle completo ao ler e escrever fluxos, pode usar eventos de dados. Mas, para replicação simples de arquivos, os fluxos de leitura e os fluxos de gravação podem transferir dados através de pipelines.
Aplicação prática:
A cópia do código é a seguinte:
var fs = requer ('fs'),
stat = fs.stat;
/*
* Copie todos os arquivos no diretório, incluindo subdiretos
* @param {string} diretório que precisa ser copiado
* @param {string} copiar para o diretório especificado
*/
var cópia = função (src, dst) {
// Leia todos os arquivos/diretórios no diretório
fs.readdir (src, function (err, caminhos) {
if (err) {
lança err;
}
Paths.ForEach (função (caminho) {
var _src = src + '/' + caminho,
_dst = dst + '/' + caminho,
legível, gravável;
stat (_src, function (err, st) {
if (err) {
lança err;
}
// determinar se é um arquivo
if (St.isfile ()) {
// Crie um fluxo de leitura
legível = fs.createReadstream (_src);
// Crie um fluxo de gravação
gravidade = fs.createwritestream (_dst);
// transfere fluxos através de pipelines
leitura.pipe (gravável);
}
// Se for um diretório, chame -se recursivamente
caso contrário, se (St.isDirectory ()) {
existe (_src, _dst, cópia);
}
});
});
});
};
// Antes de copiar o diretório, você precisa determinar se o diretório existe. Se não existir, você precisará criar um diretório primeiro.
var exist = function (src, dst, retorno de chamada) {
fs.exists (dst, função (existe) {
// já existe
se (existe) {
retorno de chamada (SRC, DST);
}
// não existe
outro{
fs.mkdir (dst, function () {
retorno de chamada (SRC, DST);
});
}
});
};
// Copie o diretório
existe ('./src', './build', cópia);