Saya berharap ini akan menjadi hal yang sederhana, tetapi saya tidak dapat menemukan apa pun di luar sana untuk melakukannya.
Saya hanya ingin mendapatkan semua folder / direktori dalam folder / direktori yang diberikan.
Jadi misalnya:
<MyFolder>
|- SomeFolder
|- SomeOtherFolder
|- SomeFile.txt
|- SomeOtherFile.txt
|- x-directory
Saya berharap mendapatkan array:
["SomeFolder", "SomeOtherFolder", "x-directory"]
Atau yang di atas dengan jalan jika itu yang dilayani ...
Jadi apakah ada yang sudah ada untuk melakukan hal di atas?
require('path').resolve(__dirname, file)
const getDirectories = srcPath => fs.readdirSync(srcPath).filter(file => fs.statSync(path.join(srcPath, file)).isDirectory())
lstatSync
sebagai gantinya.Berkat fitur sintaksis JavaScript ES6 (ES2015), one liner:
Versi sinkron
Versi asinkron untuk Node.js 10+ (percobaan)
sumber
Daftar direktori menggunakan jalur.
sumber
Solusi rekursif
Saya datang ke sini untuk mencari cara mendapatkan semua subdirektori, dan semua subdirektori mereka, dll. Berdasarkan jawaban yang diterima , saya menulis ini:
sumber
if (recursive) return [srcpath, ...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; else return [...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; }
Ini harus dilakukan:
CoffeeScript (sinkronisasi)
CoffeeScript (async)
JavaScript (async)
sumber
fs
metode sinkron .(err, dirs)
); itu tidak akan memanggil kembali di hadapan file dot atau folder; itu rentan terhadap semua kondisi balapan; mungkin memanggil kembali sebelum memeriksa semua entri.Atau, jika Anda dapat menggunakan perpustakaan eksternal, Anda dapat menggunakan
filehound
. Ini mendukung panggilan balik, janji dan sinkronisasi panggilan.Menggunakan janji:
Menggunakan panggilan balik:
Sinkronkan panggilan:
Untuk informasi lebih lanjut (dan contoh), periksa dokumen: https://github.com/nspragg/filehound
Penafian: Saya penulis.
sumber
Dengan versi node.js> = v10.13.0, fs.readdirSync akan mengembalikan array objek fs.Dirent jika
withFileTypes
opsi disetel ketrue
.Jadi kamu bisa menggunakan,
sumber
.filter(c => c.isDirectory())
akan lebih mudah daripada menggunakanreduce()
.filter(c => c.isDirectory()).map(c => c.name)
daripadareduce
panggilan.sumber
Menggunakan fs-extra, yang menjanjikan panggilan async fs, dan sintaks yang baru menunggu async:
sumber
Dan versi async dari getDirectories, Anda memerlukan modul async untuk ini:
sumber
Jawaban ini tidak menggunakan fungsi pemblokiran seperti
readdirSync
ataustatSync
. Itu tidak menggunakan dependensi eksternal atau menemukan dirinya di kedalaman neraka panggilan balik.Alih-alih, kami menggunakan kenyamanan JavaScript modern seperti Janji dan
async-await
sintaksis. Dan hasil asinkron diproses secara paralel; tidak secara berurutan -Saya akan menginstal paket contoh, dan kemudian menguji fungsi kami -
Mari kita lihat itu bekerja -
Menggunakan modul umum
Parallel
,, kita dapat menyederhanakan definisidirs
-The
Parallel
modul yang digunakan di atas adalah pola yang diekstraksi dari satu set fungsi yang dirancang untuk memecahkan masalah yang sama. Untuk penjelasan lebih lanjut, lihat Tanya Jawab terkait ini .sumber
Versi CoffeeScript dari jawaban ini , dengan penanganan kesalahan yang tepat:
Tergantung pada async
Atau, gunakan modul untuk ini! (Ada modul untuk semuanya. [Rujukan?])
sumber
Jika Anda perlu menggunakan semua
async
versi. Anda dapat memiliki sesuatu seperti ini.Catat panjang direktori, gunakan itu sebagai indikator untuk mengetahui apakah semua tugas stat async selesai.
Jika tugas async stat selesai, semua file stat telah diperiksa, jadi panggil panggilan balik
Ini hanya akan berfungsi selama Node.js adalah utas tunggal, karena mengasumsikan tidak ada dua tugas async yang akan meningkatkan penghitung pada saat yang sama.
Seperti yang Anda lihat, ini adalah pendekatan "kedalaman pertama", dan ini bisa mengakibatkan panggilan balik neraka, dan itu tidak cukup "fungsional". Orang-orang mencoba untuk menyelesaikan masalah ini dengan Promise, dengan membungkus tugas async menjadi objek Promise.
sumber
gunakan fs 、 modul path bisa mendapat folder. ini menggunakan Janji. Jika Anda akan mendapatkan isinya , Anda dapat mengubah isDirectory () ke isFile () Nodejs - fs - fs.Stats .Terakhir , Anda bisa mendapatkan file'name file'extname dan seterusnya Nodejs --- Path
sumber
Versi async sepenuhnya dengan ES6, hanya paket asli, fs.promises dan async / tunggu, apakah operasi file secara paralel:
Diuji, itu bekerja dengan baik.
sumber
Untuk berjaga-jaga jika ada orang lain yang berakhir di sini dari pencarian web, dan Grunt sudah ada dalam daftar ketergantungan mereka, jawaban untuk ini menjadi sepele. Inilah solusi saya:
sumber
Pendekatan rekursif lain
Terima kasih kepada Mayur karena telah mengenal saya
withFileTypes
. Saya menulis kode berikut untuk mendapatkan file folder tertentu secara rekursif. Itu dapat dengan mudah dimodifikasi untuk mendapatkan hanya direktori.sumber
pemrograman fungsional
sumber