Proyek yang sedang saya kerjakan (node.js) menyiratkan banyak operasi dengan sistem file (menyalin / membaca / menulis dll). Saya ingin tahu metode mana yang paling cepat, dan saya senang mendapatkan saran. Terima kasih.
javascript
node.js
bonbonez
sumber
sumber
Jawaban:
Ini adalah cara yang baik untuk menyalin file dalam satu baris kode menggunakan stream:
Dalam simpul v8.5.0, copyFile ditambahkan
sumber
createReadStream
dan jugacreateWriteStream
kesalahannya, sehingga Anda tidak akan mendapatkan satu kalimat (meskipun itu akan tetap sama cepatnya).cp test.log newLog.log
melaluirequire('child_process').exec
?copy
tidak portabel di Window, bertentangan dengan solusi Node.js penuh.child_process.execFile('/bin/cp', ['--no-target-directory', source, target])
.fs.createReadStream('./init/xxx.json').pipe(fs.createWriteStream('xxx.json'));
Mekanisme yang sama, tetapi ini menambahkan penanganan kesalahan:
sumber
WriteStream
hanya akan menghapusnya. Anda harus menyebutrd.destroy()
diri Anda sendiri. Setidaknya itulah yang terjadi pada saya. Sayangnya tidak ada banyak dokumentasi kecuali dari kode sumber.cb
berdiri? apa yang harus kita sampaikan sebagai argumen ketiga?Saya tidak bisa mendapatkan
createReadStream/createWriteStream
metode ini bekerja karena alasan tertentu, tetapi menggunakanfs-extra
modul npm itu berhasil segera. Saya tidak yakin dengan perbedaan kinerja.fs-extra
npm install --save fs-extra
sumber
fs.copy(src, dst, callback);
, dan ini harus menyelesaikan masalah @ mvillar.Sejak Node.js 8.5.0 kami memiliki fs.copyFile baru dan fs.copyFileSync metode.
Contoh Penggunaan:
sumber
copyFile()
disadap saat menimpa file yang lebih panjang. Atas perkenanuv_fs_copyfile()
sampai Node v8.7.0 (libuv 1.15.0). lihat github.com/libuv/libuv/pull/1552Cepat untuk menulis dan nyaman digunakan, dengan manajemen janji dan kesalahan.
Sama dengan sintaks async / await:
sumber
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);});
dan mencari spesifikasi ini dan Anda benar: Mencoba untuk menyelesaikan atau menolak janji yang telah diselesaikan tidak akan berpengaruh. Mungkin Anda bisa memperluas jawaban dan menjelaskan mengapa Anda telah menulis fungsi dengan cara ini? Terima kasih :-)close
harusfinish
untuk stream yang dapat ditulisi./dev/stdin
, itu adalah bug github.com/joyent/node/issues/25375Yah, biasanya ada baiknya menghindari operasi file yang tidak sinkron. Berikut adalah contoh sinkronisasi pendek (mis. Tidak ada penanganan kesalahan):
sumber
*Sync
metode ini benar-benar bertentangan dengan filosofi nodejs '! Saya juga berpikir mereka perlahan-lahan ditinggalkan. Seluruh ide dari nodejs adalah bahwa itu single threaded dan event-driven.Solusi Mike Schilling dengan penanganan kesalahan dengan jalan pintas untuk penangan peristiwa kesalahan.
sumber
Jika Anda tidak peduli itu async, dan tidak menyalin file berukuran gigabyte, dan lebih suka tidak menambahkan ketergantungan lain hanya untuk satu fungsi:
sumber
fs.existsSync
panggilan harus dihilangkan. File dapat hilang pada waktu antarafs.existsSync
panggilan danfs.readFileSync
panggilan, yang berartifs.existsSync
panggilan tidak melindungi kita dari apa pun.false
jikafs.existsSync
gagal cenderung ergonomi yang buruk karena hanya sedikit konsumen yangcopySync
akan berpikir untuk memeriksa secara manual nilai pengembalian setiap kali disebut, lebih dari yang kami lakukan untukfs.writeFileSync
et al. . Melempar pengecualian sebenarnya lebih disukai.Inilah yang saya pribadi gunakan untuk menyalin file dan mengganti file lain menggunakan node.js :)
sumber
Untuk salinan cepat Anda harus menggunakan
fs.constants.COPYFILE_FICLONE
bendera. Ini memungkinkan (untuk sistem file yang mendukung ini) untuk tidak benar-benar menyalin konten file. Hanya entri file baru yang dibuat, tetapi itu menunjuk ke Copy-on-Write "klon" dari file sumber.Untuk tidak melakukan apa-apa / kurang adalah cara tercepat untuk melakukan sesuatu;)
https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback
Sebaliknya, menggunakan janji:
sumber
fs.promises.copyFile
solusi benweet memeriksa visibilitas file sebelum menyalin:
sumber
Mengapa tidak menggunakan nodejs built in fungsi salin?
Ini memberikan versi async dan sinkronisasi:
https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags
sumber
Solusi Mike , tetapi dengan janji:
sumber
Perbaikan satu jawaban lainnya.
Fitur:
promise
, yang membuatnya lebih mudah digunakan dalam proyek yang lebih besar.Pemakaian:
Kode:
sumber
semua solusi di atas yang tidak memeriksa keberadaan file sumber berbahaya ... mis
jika tidak ada risiko dalam skenario jika sumber dan target diganti secara tidak sengaja, data Anda akan hilang secara permanen tanpa memperhatikan adanya kesalahan.
sumber