Próbuję utworzyć pełną ścieżkę, jeśli nie istnieje.
Kod wygląda następująco:
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest);
Ten kod działa świetnie, o ile istnieje tylko jeden podkatalog (newDest, taki jak „dir1”), jednak gdy istnieje ścieżka do katalogu, taka jak („dir1 / dir2”), kończy się niepowodzeniem z błędem: ENOENT, brak takiego pliku lub katalogu
Chciałbym móc utworzyć pełną ścieżkę z jak najmniejszą liczbą wierszy kodu.
Czytałem, że na fs jest opcja rekurencyjna i wypróbowałem to w ten sposób
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest,'0777', true);
Wydaje mi się, że rekurencyjne tworzenie katalogu, który nie istnieje, powinno być takie proste. Czy coś mi brakuje, czy muszę przeanalizować ścieżkę i sprawdzić każdy katalog i utworzyć go, jeśli jeszcze nie istnieje?
Jestem całkiem nowy w Node. Może używam starej wersji FS?
Odpowiedzi:
Jedną z opcji jest użycie modułu shelljs
npm zainstaluj shelljs
Z tej strony:
Jak zauważyli inni, istnieją inne, bardziej ukierunkowane moduły. Ale poza mkdirp ma mnóstwo innych użytecznych operacji powłoki (takich jak which, grep itp ...) i działa w systemie Windows i * nix
źródło
Edytować
Wersja NodeJS
10.12.0
dodała natywną obsługę obumkdir
imkdirSync
tworzenie katalogu rekurencyjnego z następującąrecursive: true
opcją:A jeśli wolisz
fs Promises API
, możesz pisaćOryginalna odpowiedź
Twórz katalogi rekurencyjnie, jeśli nie istnieją! ( Zero zależności )
Stosowanie
Próbny
Spróbuj!
Wyjaśnienia
EISDIR
dla Mac iEPERM
iEACCES
dla Windows. Dziękuję wszystkim komentarzom zgłaszającym @PediT., @JohnQ, @ deed02392, @robyoder i @Almenon.{isRelativeToScript: true}
.path.sep
ipath.resolve()
, a nie tylko/
konkatenacja, w celu uniknięcia problemów między platformami.fs.mkdirSync
i obsługa błędu za pomocątry/catch
if zgłoszonego w celu obsługi warunków wyścigu: inny proces może dodać plik między wywołaniami dofs.existsSync()
ifs.mkdirSync()
i powoduje wyjątek.if (!fs.existsSync(curDir) fs.mkdirSync(curDir);
. Ale jest to anty-wzorzec, który pozostawia kod podatny na warunki wyścigu. Podziękowania dla @GershomMaes za komentarz dotyczący sprawdzenia istnienia katalogu.źródło
Bardziej niezawodną odpowiedzią jest użycie mkdirp .
Następnie kontynuuj zapisywanie pliku w pełnej ścieżce za pomocą:
źródło
fs-extra dodaje metody systemu plików, które nie są zawarte w natywnym module fs. To kropla w zastępstwie fs.
zainstalować
fs-extra
$ npm install --save fs-extra
Dostępne są opcje synchronizacji i asynchronizacji.
https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureDir.md
źródło
memfs
do testów jednostkowych. To nie ma :-( github.com/jprichardson/node-fs-extra/issues/274Korzystając z redukuj, możemy sprawdzić, czy każda ścieżka istnieje i stworzyć ją w razie potrzeby, również w ten sposób myślę, że jest łatwiejsza do naśladowania. Edytowane, dzięki @Arvin, powinniśmy użyć path.sep, aby uzyskać właściwy separator segmentów ścieżki specyficzny dla platformy.
źródło
Ta funkcja została dodana do node.js w wersji 10.12.0, więc jest to tak proste, jak przekazanie opcji
{recursive: true}
jako drugiego argumentu dofs.mkdir()
wywołania. Zobacz przykład w oficjalnych dokumentach .Nie ma potrzeby stosowania zewnętrznych modułów ani własnej implementacji.
źródło
Wiem, że to stare pytanie, ale nodejs v10.12.0 obsługuje to teraz natywnie z
recursive
opcją ustawioną na true. fs.mkdirźródło
Teraz z NodeJS> =
10.12.0
możesz używaćfs.mkdirSync(path, { recursive: true })
fs.mkdirSyncźródło
Przykład dla systemu Windows (bez dodatkowych zależności i obsługi błędów)
źródło
Możesz po prostu rekurencyjnie sprawdzić, czy folder istnieje lub nie ma w ścieżce, i sprawić, by folder nie był obecny. ( BRAK BIBLIOTEKI ZEWNĘTRZNEJ )
źródło
Możesz użyć następnej funkcji
const recursiveUpload = (path: string) => {const path = path.split ("/")
Więc co to robi:
paths
zmienną, w której przechowuje każdą ścieżkę samodzielnie jako element tablicy.Mam nadzieję, że to pomoże!
Nawiasem mówiąc, w Node 10.12.0 można użyć rekurencyjnego tworzenia ścieżek, podając je jako dodatkowy argument.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => { if (err) throw err; });
https://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_options
źródło
Za dużo odpowiedzi, ale oto rozwiązanie bez rekurencji, które działa poprzez podzielenie ścieżki, a następnie ponowne utworzenie jej od lewej do prawej
Dla tych, którzy martwią się kompatybilnością z Windowsem i Linuksem, po prostu zamień ukośnik na podwójny lewy ukośnik `` \ '' w obu powyższych wystąpieniach, ale TBH mówimy o węźle fs, a nie linii poleceń Windows, a ta pierwsza jest dość wybaczająca, a powyższy kod po prostu zadziała Windows i jest bardziej kompletnym rozwiązaniem dla wielu platform.
źródło
path.sep
przechodzi jako albo / lub \\ dla mnie.path.delimiter
jest lub ;.źródło
Asynchroniczny sposób rekurencyjnego tworzenia katalogów:
źródło
Oto moja imperatywna wersja
mkdirp
dla nodejs.źródło
A co z tym podejściem:
Działa to dla ścieżki względnej.
źródło
W oparciu o odpowiedź Mouneera o zerowych zależnościach, oto nieco bardziej przyjazny dla początkujących
Typescript
wariant, jako moduł:źródło
Tak czysty jak ten :)
źródło
Miałem problemy z rekurencyjną opcją fs.mkdir, więc utworzyłem funkcję, która wykonuje następujące czynności:
Sprawia, że każdy katalog jest potrzebny, w tym plik końcowy
źródło
Exec może powodować bałagan w Windows. Jest bardziej "nodie" rozwiązanie. Zasadniczo masz wywołanie rekurencyjne, aby sprawdzić, czy katalog istnieje i zagłębić się w potomek (jeśli istnieje) lub go utworzyć. Oto funkcja, która utworzy dzieci i wywoła funkcję po zakończeniu:
}
źródło
Ta wersja działa lepiej w systemie Windows niż najlepsza odpowiedź, ponieważ rozumie oba,
/
apath.sep
ukośniki działają w systemie Windows tak, jak powinny. Obsługuje ścieżki bezwzględne i względne (względemprocess.cwd
).źródło