Przeczytałem już dokumentację Node.js i, chyba że coś przeoczyłem, nie mówi w szczególności, jakie parametry zawierają niektóre operacje fs.mkdir()
. Jak widać w dokumentacji, to niewiele.
Obecnie mam ten kod, który próbuje utworzyć folder lub użyć istniejącego zamiast tego:
fs.mkdir(path,function(e){
if(!e || (e && e.code === 'EEXIST')){
//do something with contents
} else {
//debug
console.log(e);
}
});
Ale zastanawiam się, czy to właściwy sposób, aby to zrobić? Czy sprawdzenie kodu EEXIST
to właściwy sposób, aby wiedzieć, że folder już istnieje? Wiem, że mogę to zrobić fs.stat()
przed utworzeniem katalogu, ale byłoby to już dwa trafienia do systemu plików.
Po drugie, czy istnieje pełna lub przynajmniej bardziej szczegółowa dokumentacja Node.js, która zawiera szczegółowe informacje o tym, jakie obiekty błędów zawierają, jakie parametry oznaczają itp.
javascript
node.js
Joseph
źródło
źródło
e &&
. Jeśli!e
zawiedzie, to wiesz, żee
to prawda.Odpowiedzi:
Dobrym sposobem na to jest użycie modułu mkdirp .
Użyj go, aby uruchomić funkcję wymagającą katalogu. Oddzwanianie jest wywoływane po utworzeniu ścieżki lub jeśli ścieżka już istnieje. Błąd
err
jest ustawiany, jeśli mkdirp nie utworzył ścieżki do katalogu.źródło
fs.exists(Sync)
.Edycja: Ponieważ ta odpowiedź jest bardzo popularna, zaktualizowałem ją, aby odzwierciedlała aktualne praktyki.
Węzeł> = 10
Nowa
{ recursive: true }
opcja Node'sfs
pozwala teraz na to natywnie. Ta opcja naśladuje zachowanie systemu UNIXmkdir -p
. Rekurencyjnie upewni się, że każda część ścieżki istnieje i nie wyśle błędu, jeśli którakolwiek z nich się pojawi.(Uwaga: wciąż może generować błędy, takie jak
EPERM
lubEACCESS
, więc lepiej zawiń go,try {} catch (e) {}
jeśli twoja implementacja jest na to podatna).Wersja synchroniczna.
Wersja asynchroniczna
Starsze wersje węzłów
Za pomocą a
try {} catch (err) {}
możesz to osiągnąć bardzo wdzięcznie, nie spotykając warunków wyścigu.Aby uniknąć martwego czasu między sprawdzeniem istnienia a utworzeniem katalogu, po prostu staramy się go utworzyć od razu i zignorować błąd, jeśli tak jest
EEXIST
(katalog już istnieje).Jeśli błąd nie jest
EEXIST
, powinniśmy jednak rzucić błąd, ponieważ możemy mieć do czynienia z czymś takim jakEPERM
lubEACCES
Dla
mkdir -p
-Jak rekurencyjnego zachowań, np./a/b/c
, trzeba by nazwać na każdej części dirpath, np./a
,./a/b
,.a/b/c
źródło
Jeśli chcesz szybko i zabrudzić jedną wkładkę, użyj tego:
źródło
fs.exists
jest przestarzałe: nodejs.org/api/fs.html#fs_fs_exists_path_callbackDokumenty node.js, aby w
fs.mkdir
zasadzie odroczyć stronę podręcznika systemu Linux dlamkdir(2)
. Oznacza to, żeEEXIST
będzie to wskazane również, jeśli ścieżka istnieje, ale nie jest katalogiem, który tworzy niezręczną skrzynkę narożną, jeśli wybierzesz tę trasę.Lepiej jest zadzwonić,
fs.stat
co powie ci, czy ścieżka istnieje i czy jest to katalog w jednym wywołaniu. W przypadku (zakładam, że) normalnego przypadku, w którym katalog już istnieje, jest to tylko jeden trafiony system plików.Te
fs
metody modułowe są cienkimi opakowaniami wokół natywnych interfejsów API języka C, dlatego należy sprawdzić strony podręcznika, do których odwołuje się dokumentacja node.js, w celu uzyskania szczegółowych informacji.źródło
stat
wcześniejmkdir
może mieć wpływ na warunki wyścigowe - pamiętaj o tym.Możesz użyć tego:
źródło
statSync
spowoduje błąd, jeśli jednostka w ogóle nie istnieje, powodując awarię kodu. Musisz owinąć to wtry/catch
blok.fs.existsSync()
ifs.exists()
będą przestarzałe.Proponuję rozwiązanie bez modułów (akumulacja modułów nigdy nie jest zalecana ze względu na łatwość konserwacji, szczególnie w przypadku małych funkcji, które można zapisać w kilku wierszach ...):
OSTATNIA AKTUALIZACJA :
W wersji 10.12.0 opcje rekurencyjne implementacji NodeJS:
AKTUALIZACJA :
źródło
fs.exists()
jest przestarzałe w węźle v9. użyjfs.access()
zamiast tego. (zwraca,undefined
jeśli plik istnieje; w przeciwnym razie zgłasza błądENOENT
)fs.mkdirSync('my/new/folder/create', {recursive: true})
?Możesz także użyć programu fs-extra , który zapewnia często używane operacje na plikach.
Przykładowy kod:
dokumenty tutaj: https://github.com/jprichardson/node-fs-extra#mkdirsdir-callback
źródło
Oto kod ES6, którego używam do utworzenia katalogu (jeśli nie istnieje):
Uwaga:
createDirectory
funkcji normalizuję ścieżkę, aby zagwarantować, że typ separatora ścieżek systemu operacyjnego będzie używany konsekwentnie (np. Zmieni się toC:\directory/test
wC:\directory\test
(w systemie Windows)fs.exists
jest przestarzałe , dlatego używamfs.stat
do sprawdzenia, czy katalog już istniejeENOENT
( E rror NO ENT ry)fs.mkdir
fs.mkdir
niż jej blokujący odpowiednik,fs.mkdirSync
a ze względu na zawijaniePromise
zagwarantuje, że ścieżka katalogu zostanie zwrócona dopiero po pomyślnym utworzeniu kataloguźródło
Moim zdaniem lepiej nie liczyć trafień w system plików podczas kodowania w JavaScript. Jednak (1)
stat
&mkdir
i (2)mkdir
i sprawdzić (lub odrzutów) kod błędu, obie strony mają prawo sposobów na to, co chcesz.źródło
źródło
Możesz to wszystko zrobić za pomocą modułu systemu plików.
Naprawdę nie musisz nawet sprawdzać, czy katalog istnieje. Poniższy kod gwarantuje również, że katalog już istnieje lub został utworzony.
źródło
Odpowiedź Raugarala, ale z funkcją -p. Brzydkie, ale działa:
źródło
Tak jak nowszą alternatywą dla odpowiedzi Teemu Ikonen , która jest bardzo prosta i czytelna, jest użycie
ensureDir
metodyfs-extra
pakietu.Może być stosowany nie tylko jako rażący zamiennik wbudowanego
fs
modułu, ale ma także wiele innych funkcji oprócz funkcjifs
pakietu.ensureDir
Sposób, jak sama nazwa wskazuje, zapewnia, że katalog istnieje. Jeśli struktura katalogów nie istnieje, zostanie utworzona. Lubićmkdir -p
. Nie tylko folder końcowy, zamiast tego tworzona jest cała ścieżka, jeśli jeszcze nie istnieje.powyższy jest jego
async
wersją. Ma również metodę synchroniczną, aby wykonać to w formieensureDirSync
metody.źródło
Powyższa odpowiedź @ Liberateur nie zadziałała dla mnie (Node v8.10.0). Niewielka modyfikacja pomogła, ale nie jestem pewien, czy jest to właściwy sposób. Proszę zasugeruj.
źródło