Czy istnieje prostszy sposób skopiować folder i całą jego zawartość bez konieczności ręcznego robi sekwencję fs.readir
, fs.readfile
, fs.writefile
rekurencyjnie?
Zastanawiam się tylko, czy brakuje mi funkcji, która idealnie działałaby w ten sposób
fs.copy("/path/to/source/folder","/path/to/destination/folder");
javascript
node.js
utracone źródło
źródło
źródło
Odpowiedzi:
Możesz użyć modułu ncp . Myślę, że tego potrzebujesz
źródło
npm install ncp
i działa w mniej niż 30 s. Dzięki.To jest moje podejście do rozwiązania tego problemu bez żadnych dodatkowych modułów. Po prostu używając wbudowanych
fs
ipath
modułów.Uwaga: używa funkcji odczytu / zapisu fs, więc nie kopiuje żadnych metadanych (czas utworzenia itp.). W węźle 8.5 dostępne są
copyFileSync
funkcje, które wywołują funkcje kopiowania systemu operacyjnego, a zatem również kopiują metadane. Nie testowałem ich jeszcze, ale powinno działać po prostu je wymienić. (Zobacz https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags )źródło
javascript var fs = require('fs'); var path = require('path');
fs.copy
lubfs.copySync
tak jak one wywołują funkcje kopiowania na poziomie systemu operacyjnego w MacOS i Windows, a więc faktycznie kopiować pliki.fs.copyFile
a jeśli przekopiesz się przez źródło węzła, które zobaczysz na komputerach Mac i Windows, wywołują funkcję specyficzną dla systemu operacyjnego, aby skopiować plikIstnieje kilka modułów obsługujących kopiowanie folderów wraz z ich zawartością. Najpopularniejszy byłby klucz
Alternatywą byłby node-fs-extra
źródło
wrench
jest to przestarzałe i powinno zostać zastąpione przeznode-fs-extra
( github.com/jprichardson/node-fs-extra )Oto funkcja, która rekurencyjnie kopiuje katalog i jego zawartość do innego katalogu:
źródło
fs.lstatSync
zamiastfs.statSync
)linking
nie kopiuje .. Problem polega na tym, że kiedy modyfikujesz zawartość połączonego pliku, oryginalny plik też się zmieni.fs-extra
pracował dla mnie kiedyncp
iwrench
:https://www.npmjs.com/package/fs-extra
źródło
wrench
poleca użytkownikom używanie,fs-extra
ponieważ wycofał swoją bibliotekę.W przypadku systemu Linux / unix można użyć składni powłoki
Otóż to!
źródło
Moduł FS-extra działa jak urok.
Zainstaluj fs-extra
Poniżej znajduje się program do kopiowania katalogu źródłowego do katalogu docelowego.
Bibliografia
fs-extra: https://www.npmjs.com/package/fs-extra
Przykład: NodeJS Tutorial - Node.js Kopiuj folder
źródło
Tak bym to zrobił osobiście:
działa dla folderów i plików
źródło
Stworzyłem mały przykład roboczy, który kopiuje folder źródłowy do innego folderu docelowego w zaledwie kilku krokach (w oparciu o odpowiedź @ shift66 przy użyciu ncp):
krok 1 - Zainstaluj moduł ncp:
krok 2 - utwórz copy.js (zmień zmienne srcPath i destPath na cokolwiek potrzebujesz):
krok 3 - biegnij
źródło
W przypadku węzła 10 jest to całkiem proste.
To zakłada,
dest
że nie istnieje.źródło
require('util').promisify
withfs.mkdir
ifs.copyFile
zamiastrequire('fs').promises
, co jest nadal eksperymentalne w wersji 11.1.withFileTypes
opcję? Ponieważ to oszczędza cistat
połączeniawithFileTypes
opcji.Znam już tak wiele odpowiedzi, ale nikt nie odpowiedział w prosty sposób. Jeśli chodzi o oficjalną dokumentację fs-exra , możesz to zrobić bardzo łatwo
źródło
{ recursive: true }
z dokumentu github , o którym wspomniałeś. Nie wiem, czy to działa.Ponieważ buduję prosty skrypt węzłowy, nie chciałem, aby użytkownicy skryptu musieli importować kilka zewnętrznych modułów i zależności, więc założyłem swój limit myślenia i szukałem uruchomionych poleceń z basha muszla.
Ten fragment kodu node.js rekurencyjnie kopiuje folder o nazwie node-webkit.app do folderu o nazwie build:
Podziękowania dla Lance'a Pollarda z dzone za rozpoczęcie pracy.
Powyższy fragment kodu jest ograniczony do platform opartych na Uniksie, takich jak Mac OS i Linux, ale podobna technika może działać w systemie Windows.
źródło
@ mallikarjun-m dziękuję!
fs-extra zrobił to samo i może nawet zwrócić Promise, jeśli nie dostarczysz wywołania zwrotnego! :)
źródło
Ten z obsługą dowiązań symbolicznych + nie zgłasza, jeśli katalog istnieje.
źródło
Ten kod będzie działał dobrze, rekurencyjnie kopiując dowolny folder do dowolnej lokalizacji. Tylko Windows.
Działa idealnie w mojej grze tekstowej do tworzenia nowych graczy.
źródło
Próbowałem fs-extra i copy-dir, aby kopiować folder-rekurencyjnie. ale ja to chce
Więc napisałem własne:
i podobną funkcję mkdirs, która jest alternatywą dla mkdirp
źródło
Napisałem tę funkcję zarówno do kopiowania (copyFileSync), jak i przenoszenia (renameSync) plików rekurencyjnie między katalogami:
źródło
Jeśli jesteś w Linuksie i wydajność nie jest problemem, możesz użyć
exec
funkcji zchild_process
modułu, aby wykonać polecenie bash:W niektórych przypadkach uznałem to rozwiązanie za bardziej przejrzyste niż pobieranie całego modułu lub nawet używanie
fs
modułu.źródło
ncp blokuje deskryptor pliku i uruchamia wywołanie zwrotne, gdy nie został jeszcze odblokowany. Zamiast tego polecam użycie modułu rekurencyjno-kopiującego . Obsługuje wydarzenia i możesz być pewien w zakończeniu kopii.
źródło
Zachowaj ostrożność podczas odbierania paczki. Niektóre pakiety, takie jak copy-dir, nie obsługują kopiowania dużych plików dłuższych niż 0x1fffffe8 znaków. Pojawi się błąd, taki jak:
Doświadczyłem czegoś takiego w jednym z moich projektów. Ostatecznie musiałem zmienić pakiet, z którego korzystałem i dostosować dużo kodu. Powiedziałbym, że nie jest to zbyt przyjemne doświadczenie.
Jeśli potrzebujesz wielu źródeł i wielu kopii docelowych, możesz użyć lepszej kopii i napisać coś takiego:
lub nawet :
źródło
TAK,
ncp
jestcool
jednak ...Możesz chcieć / powinieneś obiecać, że jego funkcja będzie
super cool
. Skoro już to robisz, dodaj go do plikutools
pliku, aby użyć go ponownie.Poniżej znajduje się działająca wersja, która jest
Async
i używaPromises
.index.js
tools.js
źródło
Najłatwiejszym rozwiązaniem tego problemu jest użycie tylko modułu „fs” i „Path” oraz pewnej logiki .....
Wszystkie pliki w folderze głównym są kopiowane z Nową Nazwą, jeśli chcesz, po prostu ustaw numer wersji, tj. ....................... "var v = 'Twój katalog Imię'"
w zawartości przedrostka nazwy pliku V dodanej z nazwą pliku.
źródło
Oto jak zrobiłem:
następnie:
Następnie wywołaj metodę:
źródło