Le projet sur lequel je travaille (node.js) implique de nombreuses opérations avec le système de fichiers (copie / lecture / écriture, etc.). Je voudrais savoir quelles méthodes sont les plus rapides et je serais heureux de recevoir un conseil. Merci.
javascript
node.js
bonbonez
la source
la source
Réponses:
C'est un bon moyen de copier un fichier sur une seule ligne de code à l'aide de flux:
Dans le nœud v8.5.0, copyFile a été ajouté
la source
createReadStream
et lescreateWriteStream
erreurs, de sorte que vous n'obtiendrez pas de doublure (bien que ce soit toujours aussi rapide).cp test.log newLog.log
viarequire('child_process').exec
?copy
n'est pas portable sur Windows, contrairement à une solution Node.js complète.child_process.execFile('/bin/cp', ['--no-target-directory', source, target])
.fs.createReadStream('./init/xxx.json').pipe(fs.createWriteStream('xxx.json'));
Même mécanisme, mais cela ajoute la gestion des erreurs:
la source
WriteStream
volonté ne fait que la rediriger. Vous devezrd.destroy()
vous appeler . C'est du moins ce qui m'est arrivé. Malheureusement, il n'y a pas beaucoup de documentation à l'exception du code source.cb
stand? que devons-nous passer comme troisième argument?Je n'ai pas pu faire fonctionner la
createReadStream/createWriteStream
méthode pour une raison quelconque, mais en utilisant lefs-extra
module npm, cela a fonctionné tout de suite. Je ne suis pas sûr de la différence de performances.fs-extra
npm install --save fs-extra
la source
fs.copy(src, dst, callback);
devraient résoudre les problèmes de @ mvillar.Depuis Node.js 8.5.0, nous avons de nouvelles méthodes fs.copyFile et fs.copyFileSync .
Exemple d'utilisation:
la source
copyFile()
bug est survenu lors du remplacement de fichiers plus longs. Avec l'aimable autorisation deuv_fs_copyfile()
till Node v8.7.0 (libuv 1.15.0). voir github.com/libuv/libuv/pull/1552Rapide à écrire et pratique à utiliser, avec gestion des promesses et des erreurs.
Idem avec la syntaxe async / wait:
la source
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);});
et de rechercher les spécifications à ce sujet et vous avez raison: tenter de résoudre ou de rejeter une promesse résolue n'a aucun effet. Peut-être pourriez-vous étendre votre réponse et expliquer pourquoi vous avez écrit la fonction de cette façon? Merci :-)close
devrait êtrefinish
pour les flux inscriptibles./dev/stdin
, c'est un bug github.com/joyent/node/issues/25375Eh bien, il est généralement préférable d'éviter les opérations de fichiers asynchrones. Voici l'exemple de synchronisation courte (c'est-à-dire sans gestion d'erreur):
la source
*Sync
méthodes est totalement contraire à la philosophie de nodejs! Je pense également qu'ils sont progressivement dépréciés. L'idée de nodejs est qu'il s'agit d'un seul thread et piloté par les événements.Solution de Mike Schilling avec gestion des erreurs avec un raccourci pour le gestionnaire d'événements d'erreur.
la source
Si vous ne vous souciez pas que ce soit asynchrone, et que vous ne copiez pas de fichiers de taille gigaoctet, et préférez ne pas ajouter une autre dépendance juste pour une seule fonction:
la source
fs.existsSync
appel doit être omis. Le fichier pourrait disparaître dans l'intervalle entre l'fs.existsSync
appel et l'fs.readFileSync
appel, ce qui signifie que l'fs.existsSync
appel ne nous protège de rien.false
cas d'fs.existsSync
échec est probablement une mauvaise ergonomie car peu de consommateurscopySync
penseront à inspecter manuellement la valeur de retour à chaque appel, pas plus que nous ne le faisons pourfs.writeFileSync
et al. . Il est préférable de lever une exception.C'est ce que j'utilise personnellement pour copier un fichier et remplacer un autre fichier en utilisant node.js :)
la source
Pour des copies rapides, vous devez utiliser le
fs.constants.COPYFILE_FICLONE
drapeau. Il permet (pour les systèmes de fichiers qui le prennent en charge) de ne pas réellement copier le contenu du fichier. Seule une nouvelle entrée de fichier est créée, mais elle pointe vers un «clone» de copie sur écriture du fichier source.Ne rien faire / moins est le moyen le plus rapide de faire quelque chose;)
https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback
Utiliser des promesses à la place:
la source
fs.promises.copyFile
La solution de benweet vérifiant la visibilité du fichier avant la copie:
la source
Pourquoi ne pas utiliser la fonction de copie intégrée de nodejs?
Il fournit une version asynchrone et sync:
https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags
la source
La solution de Mike , mais avec des promesses:
la source
Amélioration d'une autre réponse.
Fonctionnalités:
promise
, ce qui le rend plus facile à utiliser dans un projet plus important.Usage:
Code:
la source
toutes les solutions ci-dessus qui ne vérifient pas l'existence d'un fichier source sont dangereuses ... par exemple
sinon, il y a un risque dans un scénario au cas où la source et la cible sont remplacées par une erreur, vos données seront définitivement perdues sans remarquer aucune erreur.
la source