Miałem nadzieję, że będzie to prosta rzecz, ale nie mogę znaleźć niczego, co by to zrobiło.
Chcę tylko uzyskać wszystkie foldery / katalogi w danym folderze / katalogu.
Na przykład:
<MyFolder>
|- SomeFolder
|- SomeOtherFolder
|- SomeFile.txt
|- SomeOtherFile.txt
|- x-directory
Spodziewałbym się uzyskać szereg:
["SomeFolder", "SomeOtherFolder", "x-directory"]
Lub powyższe ze ścieżką, jeśli tak to było podawane ...
Czy istnieje już coś, co można zrobić powyżej?
require('path').resolve(__dirname, file)
const getDirectories = srcPath => fs.readdirSync(srcPath).filter(file => fs.statSync(path.join(srcPath, file)).isDirectory())
lstatSync
zamiast tego.Dzięki funkcjom składni JavaScript ES6 (ES2015) jest to jedna linijka:
Wersja synchroniczna
Wersja asynchroniczna dla Node.js 10+ (eksperymentalna)
źródło
Wyświetl listę katalogów, używając ścieżki.
źródło
Rozwiązanie rekurencyjne
Przybyłem tutaj w poszukiwaniu sposobu na uzyskanie wszystkich podkatalogów i wszystkich ich podkatalogów itp. Opierając się na przyjętej odpowiedzi , napisałem:
źródło
if (recursive) return [srcpath, ...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; else return [...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; }
To powinno to zrobić:
CoffeeScript (synchronizacja)
CoffeeScript (asynchroniczny)
JavaScript (asynchronizacja)
źródło
fs
metod synchronicznych .(err, dirs)
); nie oddzwoni w obecności plików lub folderów dot; jest podatny na wszystkie warunki wyścigu; może oddzwonić, zanim sprawdzi wszystkie wpisy.Alternatywnie, jeśli możesz korzystać z bibliotek zewnętrznych, możesz użyć
filehound
. Obsługuje połączenia zwrotne, obietnice i synchronizację połączeń.Korzystanie z obietnic:
Korzystanie z oddzwaniania:
Synchronizuj połączenie:
Aby uzyskać dodatkowe informacje (i przykłady), sprawdź dokumenty: https://github.com/nspragg/filehound
Oświadczenie: Jestem autorem.
źródło
W przypadku wersji node.js> = v10.13.0 fs.readdirSync zwróci tablicę obiektów fs.Dirent, jeśli
withFileTypes
opcja jest ustawiona natrue
.Możesz więc użyć
źródło
.filter(c => c.isDirectory())
byłoby prostsze niż używaniereduce()
.filter(c => c.isDirectory()).map(c => c.name)
nadreduce
wezwanie chociaż.źródło
Używając fs-extra, który obiecuje asynchroniczne wywołania fs, a nowa oczekuje na składnię asynchroniczną:
źródło
I asynchroniczna wersja getDirectories, potrzebujesz modułu asynchronicznego do tego:
źródło
Ta odpowiedź nie używa funkcji blokowania takich jak
readdirSync
lubstatSync
. Nie wykorzystuje zewnętrznych zależności ani nie znajduje się w głębinach piekła zwrotnego.Zamiast tego korzystamy z nowoczesnych udogodnień JavaScript, takich jak obietnice i
async-await
składnie. Wyniki asynchroniczne są przetwarzane równolegle; nie po kolei -Zainstaluję przykładowy pakiet, a następnie przetestuję naszą funkcję -
Zobaczmy, jak to działa -
Za pomocą uogólnionego modułu
Parallel
możemy uprościć definicjędirs
-Zastosowany
Parallel
powyżej moduł był wzorem wyodrębnionym z zestawu funkcji zaprojektowanych w celu rozwiązania podobnego problemu. Aby uzyskać więcej wyjaśnień, zobacz powiązane pytania i odpowiedzi .źródło
Wersja odpowiedzi CoffeeScript z odpowiednią obsługą błędów:
Zależy od asynchronizacji
Możesz też użyć do tego modułu! (Istnieją moduły do wszystkiego. [Potrzebne źródło])
źródło
Jeśli potrzebujesz użyć wszystkich
async
wersji. Możesz mieć coś takiego.Zapisz długość katalogu, używa go jako wskaźnika, aby stwierdzić, czy wszystkie zadania statystyki asynchronicznej zostały zakończone.
Jeśli zadania asynchroniczne są zakończone, wszystkie statystyki pliku zostały sprawdzone, więc oddzwoń
Będzie to działać tylko tak długo, jak Node.js jest jednym wątkiem, ponieważ zakłada, że żadne dwa zadania asynchroniczne nie zwiększą licznika w tym samym czasie.
Jak widać, jest to podejście „głębokość pierwsza”, co może skutkować piekłem zwrotnym i nie jest do końca „funkcjonalne”. Ludzie próbują rozwiązać ten problem za pomocą Promise, zawijając zadanie asynchroniczne w obiekcie Promise.
źródło
użyć fs, ścieżka moduł dostał folder. ta obietnica użytkowania. Jeśli dostaniesz wypełnienie, możesz zmienić isDirectory () na isFile () Nodejs - fs - fs.Stats . Na koniec możesz uzyskać nazwę pliku nazwa pliku i tak dalej Nodejs --- Ścieżka
źródło
Wersja w pełni asynchroniczna z ES6, tylko pakiety natywne, fs.promises i async / czekają, wykonuje operacje na plikach równolegle:
Testowane, działa ładnie.
źródło
Na wypadek, gdyby ktokolwiek inny znalazł się tutaj podczas wyszukiwania w sieci i gdy Grunt ma już na swojej liście zależności, odpowiedź na to pytanie staje się banalna. Oto moje rozwiązanie:
źródło
Kolejne podejście rekurencyjne
Dzięki Mayurowi za informację o mnie
withFileTypes
. Napisałem następujący kod do rekursywnego pobierania plików z określonego folderu. Można go łatwo modyfikować, aby uzyskać tylko katalogi.źródło
programowanie funkcjonalne
źródło