Projekt, nad którym pracuję (node.js) zakłada wiele operacji z systemem plików (kopiowanie / odczytywanie / zapisywanie itp.). Chciałbym wiedzieć, które metody są najszybsze i chętnie udzielę porady. Dzięki.
javascript
node.js
bonbonez
źródło
źródło
Odpowiedzi:
Jest to dobry sposób na skopiowanie pliku w jednym wierszu kodu przy użyciu strumieni:
W węźle 8.5.0 dodano copyFile
źródło
createReadStream
icreateWriteStream
błędy, abyś nie dostał linijki (choć byłoby to tak samo szybkie).cp test.log newLog.log
przezrequire('child_process').exec
?copy
nie jest przenośny w systemie Windows, w przeciwieństwie do pełnego rozwiązania Node.js.child_process.execFile('/bin/cp', ['--no-target-directory', source, target])
.fs.createReadStream('./init/xxx.json').pipe(fs.createWriteStream('xxx.json'));
Ten sam mechanizm, ale dodaje obsługę błędów:
źródło
WriteStream
spowoduje tylko usunięcie z niego zapisów. Musisz zadzwonić dord.destroy()
siebie. Przynajmniej tak mi się stało. Niestety nie ma zbyt wiele dokumentacji oprócz kodu źródłowego.cb
skrót co powinniśmy przekazać jako trzeci argument?Z
createReadStream/createWriteStream
jakiegoś powodu nie byłem w stanie uruchomić tej metody, ale przy użyciufs-extra
modułu npm zadziałało od razu. Nie jestem jednak pewien różnicy w wydajności.fs-extra
npm install --save fs-extra
źródło
fs.copy(src, dst, callback);
powinny one rozwiązać problem @ mvillar.Od wersji Node.js 8.5.0 mamy nowe metody fs.copyFile i fs.copyFileSync .
Przykład użycia:
źródło
copyFile()
jest to błąd podczas nadpisywania dłuższych plików. Dzięki uprzejmościuv_fs_copyfile()
till Node v8.7.0 (libuv 1.15.0). patrz github.com/libuv/libuv/pull/1552Szybki do pisania i wygodny w użyciu, z zarządzaniem obietnicami i błędami.
To samo dotyczy składni async / await:
źródło
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);});
i sprawdziłem specyfikację w tym zakresie i masz rację: próba rozwiązania lub odrzucenia rozwiązanej obietnicy nie ma żadnego efektu. Być może mógłbyś rozszerzyć swoją odpowiedź i wyjaśnić, dlaczego napisałeś tę funkcję w ten sposób? Dzięki :-)close
powinno byćfinish
dla zapisywalnych strumieni./dev/stdin
, jest to błąd github.com/joyent/node/issues/25375Zazwyczaj dobrze jest unikać asynchronicznych operacji na plikach. Oto krótki przykład synchronizacji (tzn. Bez obsługi błędów):
źródło
*Sync
metod jest całkowicie sprzeczne z filozofią Nodejsa! Myślę też, że są powoli przestarzałe. Cała idea nodejs polega na tym, że jest jednowątkowy i sterowany zdarzeniami.Rozwiązanie Mike'a Schillinga z obsługą błędów ze skrótem do obsługi zdarzenia błędu.
źródło
Jeśli nie obchodzi Cię asynchronizacja i nie kopiujesz plików o wielkości gigabajtów, a raczej nie dodałbyś innej zależności tylko dla jednej funkcji:
źródło
fs.existsSync
Połączenie powinno być pominięte. Plik może zniknąć w czasie międzyfs.existsSync
rozmową afs.readFileSync
rozmową, co oznacza, żefs.existsSync
rozmowa nie chroni nas przed niczym.false
przypadkufs.existsSync
niepowodzenia jest prawdopodobnie słabą ergonomią, ponieważ niewielu konsumentówcopySync
pomyśli o ręcznym sprawdzaniu wartości zwrotu za każdym razem, gdy jest wywoływane, podobnie jak myfs.writeFileSync
i inni. . Zgłaszanie wyjątku jest właściwie preferowane.To jest to, czego osobiście używam, aby skopiować plik i zastąpić inny plik za pomocą node.js :)
źródło
W przypadku szybkich kopii należy użyć
fs.constants.COPYFILE_FICLONE
flagi. Pozwala (dla systemów plików, które to obsługują) nie kopiować zawartości pliku. Tworzony jest tylko nowy wpis pliku, ale wskazuje on opcję Kopiuj przy zapisie „klon” pliku źródłowego .Nic nie robić / to najszybszy sposób na zrobienie czegoś;)
https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback
Zamiast tego użyj obietnic:
źródło
fs.promises.copyFile
rozwiązanie benweet sprawdzające widoczność pliku przed kopiowaniem:
źródło
Dlaczego nie skorzystać z wbudowanej funkcji kopiowania nodejs?
Zapewnia zarówno wersję asynchroniczną, jak i synchronizacyjną:
https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags
źródło
Rozwiązanie Mike'a , ale z obietnicami:
źródło
Ulepszenie jednej innej odpowiedzi.
Funkcje:
promise
, co ułatwia użycie w większym projekcie.Stosowanie:
Kod:
źródło
wszystkie powyższe rozwiązania, które nie sprawdzają istnienia pliku źródłowego, są niebezpieczne ... np
w przeciwnym razie istnieje ryzyko w przypadku, gdy źródło i cel zostaną omyłkowo zastąpione, dane zostaną trwale utracone bez zauważenia błędu.
źródło