O projeto em que estou trabalhando (node.js) implica muitas operações com o sistema de arquivos (cópia / leitura / gravação etc.). Gostaria de saber quais métodos são os mais rápidos e ficaria feliz em receber um conselho. Obrigado.
javascript
node.js
bonbonez
fonte
fonte
Respostas:
Esta é uma boa maneira de copiar um arquivo em uma linha de código usando fluxos:
No nó v8.5.0, copyFile foi adicionado
fonte
createReadStream
e oscreateWriteStream
erros, para não obter uma única linha (embora ainda seja tão rápido).cp test.log newLog.log
via brutarequire('child_process').exec
?copy
não é portátil no Windows, ao contrário de uma solução completa do Node.js.child_process.execFile('/bin/cp', ['--no-target-directory', source, target])
.fs.createReadStream('./init/xxx.json').pipe(fs.createWriteStream('xxx.json'));
O mesmo mecanismo, mas isso adiciona o tratamento de erros:
fonte
WriteStream
unpipe apenas. Você teria que se chamarrd.destroy()
. Pelo menos foi o que aconteceu comigo. Infelizmente, não há muita documentação, exceto o código-fonte.cb
significa? o que devemos passar como terceiro argumento?Não consegui fazer o
createReadStream/createWriteStream
método funcionar por algum motivo, mas, usando ofs-extra
módulo npm, ele funcionou imediatamente. Não tenho certeza da diferença de desempenho.fs-extra
npm install --save fs-extra
fonte
fs.copy(src, dst, callback);
, e estes devem resolver a preocupação de @ mvillar.Desde Node.js 8.5.0 temos novos fs.copyFile e fs.copyFileSync métodos.
Exemplo de uso:
fonte
copyFile()
erro ocorre ao substituir arquivos mais longos. Cortesia deuv_fs_copyfile()
até Node v8.7.0 (libuv 1.15.0). veja github.com/libuv/libuv/pull/1552Rápido para escrever e conveniente de usar, com gerenciamento de promessas e erros.
O mesmo com sintaxe assíncrona / aguardada:
fonte
new Promise(function(resolve, reject) { resolve(1); resolve(2); reject(3); reject(4); console.log("DONE"); }).then(console.log.bind(console), function(e){console.log("E", e);});
e procurei as especificações sobre isso e você está certo: Tentar resolver ou rejeitar uma promessa resolvida não tem efeito. Talvez você possa estender sua resposta e explicar por que você escreveu a função dessa maneira? Obrigado :-)close
deve serfinish
para fluxos graváveis./dev/stdin
, isso é um bug github.com/joyent/node/issues/25375Bem, geralmente é bom evitar operações de arquivo assíncronas. Aqui está o exemplo de sincronização curto (isto é, sem manipulação de erros):
fonte
*Sync
métodos é totalmente contrário à filosofia dos nodejs! Eu também acho que eles estão sendo depreciados lentamente. A ideia do nodejs é que ele seja único e orientado a eventos.A solução de Mike Schilling com tratamento de erros com um atalho para o manipulador de eventos de erro.
fonte
Se você não se importa em ser assíncrono e não está copiando arquivos do tamanho de gigabytes, prefere não adicionar outra dependência apenas para uma única função:
fonte
fs.existsSync
chamada deve ser omitida. O arquivo pode desaparecer no período entre afs.existsSync
ligação e afs.readFileSync
ligação, o que significa que afs.existsSync
ligação não nos protege de nada.false
sefs.existsSync
falhar provavelmente é uma ergonomia ruim, porque poucos consumidorescopySync
pensam em inspecionar manualmente o valor de retorno toda vez que é chamado, assim como não fazemos parafs.writeFileSync
et al. . Lançar uma exceção é realmente preferível.É isso que eu pessoalmente uso para copiar um arquivo e substituir outro arquivo usando node.js :)
fonte
Para cópias rápidas, você deve usar a
fs.constants.COPYFILE_FICLONE
bandeira. Ele permite que (para sistemas de arquivos que suportam isso) não copie o conteúdo do arquivo. Apenas uma nova entrada de arquivo é criada, mas aponta para uma cópia em gravação "clone" de do arquivo de origem.Fazer nada / menos é a maneira mais rápida de fazer alguma coisa;)
https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback
Em vez disso, usando promessas:
fonte
fs.promises.copyFile
solução do benweet, verificando a visibilidade do arquivo antes da cópia:
fonte
Por que não usar o nodejs construído na função de cópia?
Ele fornece as versões assíncrona e sincronizada:
https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags
fonte
A solução de Mike , mas com promessas:
fonte
Melhoria de uma outra resposta.
Recursos:
promise
, o que facilita o uso em um projeto maior.Uso:
Código:
fonte
todas as soluções acima que não verificam a existência de um arquivo de origem são perigosas ... por exemplo
caso contrário, há um risco em um cenário, caso a origem e o destino sejam substituídos por engano, seus dados serão perdidos permanentemente sem perceber nenhum erro.
fonte