Dalam aplikasi Node saya, saya perlu menghapus direktori yang memiliki beberapa file, tetapi fs.rmdir
hanya berfungsi pada direktori kosong. Bagaimana saya bisa melakukan ini?
node.js
filesystems
sachin
sumber
sumber
fs.readdir(dirPath)
untuk lintasan lintasan dalam folder, beralihlahfs.unlink(filename)
untuk menghapus setiap file, dan akhirnyafs.rmdir(dirPath)
menghapus folder yang sekarang kosong. Jika Anda perlu kambuh, periksafs.lstat(filename).isDirectory()
.Jawaban:
Ada modul untuk ini yang disebut
rimraf
( https://npmjs.org/package/rimraf ). Ini menyediakan fungsi yang sama denganrm -Rf
Penggunaan Async :
Sinkronkan penggunaan:
sumber
deleteFolderRecursive
dalam jawaban berikut?recursive
opsi: stackoverflow.com/a/57866165/6269864Untuk menghapus folder secara sinkron
sumber
var curPath = path + "/" + file;
denganvar curPath = p.join(path, file);
asalkan Anda menyertakan modul path:var p = require("path")
path.join(dirpath, file)
seharusnya lebih baik daripadapath + "/" + file
Sebagian besar orang yang menggunakan
fs
Node.js ingin fungsi yang dekat dengan "cara Unix" berurusan dengan file. Saya menggunakan fs-extra untuk membawa semua barang keren:Bahkan lebih baik, fs-extra adalah setetes pengganti fs asli. Semua metode dalam fs tidak dimodifikasi dan dilampirkan padanya. Ini berarti Anda dapat mengganti fs dengan fs-extra :
Dan kemudian Anda dapat menghapus folder dengan cara ini:
sumber
removeSync('/tmp/myFolder')
Pada 2019 ...
Pada Node.js 12.10.0 ,
fs.rmdirSync
mendukungrecursive
opsi, sehingga Anda akhirnya dapat melakukan:Di mana
recursive
opsi menghapus seluruh direktori secara rekursif.sumber
recursive: true
dan menghapus folder yang tidak kosong tanpa keluhan.fs.rmdir(path[, options], callback)
ataufs.rmdirSync(path[, options])
fs.rmdir
eksperimental dengan stabilitas 1. "Stabilitas: 1 - Eksperimental. Fitur ini tidak tunduk pada aturan Semantic Versioning. Perubahan atau penghapusan yang tidak kompatibel mundur dapat terjadi pada setiap rilis mendatang. Penggunaan fitur ini tidak disarankan di lingkungan produksi. "Jawaban saya yang dimodifikasi dari @oconnecp ( https://stackoverflow.com/a/25069828/3027390 )
Gunakan path.join untuk pengalaman lintas platform yang lebih baik. Jadi, jangan lupa untuk membutuhkannya.
Juga berganti fungsi menjadi
rimraf
;)sumber
Saya biasanya tidak menghidupkan kembali utas lama tetapi ada banyak churn di sini dan tanpa jawaban rimraf ini semua tampak terlalu rumit bagi saya.
Pertama di Node modern (> = v8.0.0) Anda dapat menyederhanakan proses hanya menggunakan modul inti simpul, sepenuhnya asinkron, dan memparalelkan penautan file secara bersamaan semua dalam fungsi lima baris dan masih dapat dibaca:
Pada catatan lain penjaga untuk serangan jalur traversal tidak sesuai untuk fungsi ini karena
rm -rf
yang membutuhkan argumen dan akan memungkinkan pengguna untukrm -rf /
jika diminta. Itu akan menjadi tanggung jawab naskah untuk menjaga bukanrm
program itu sendiri..isDirectory()
inifalse
untuk sym-link dan dihapus linknya tidak recursed ke dalam.Terakhir namun tidak kalah pentingnya, ada kondisi balapan yang jarang terjadi bahwa rekursi dapat kesalahan jika salah satu entri dibatalkan tautannya atau dihapus di luar skrip ini pada waktu yang tepat saat rekursi ini berjalan. Karena skenario ini tidak khas di sebagian besar lingkungan, kemungkinan besar hal itu dapat diabaikan. Namun, jika diperlukan (untuk beberapa kasus tepi) masalah ini dapat dikurangi dengan contoh yang sedikit lebih kompleks ini:
EDIT: Buat
isDirectory()
fungsi. Hapus direktori yang sebenarnya di bagian akhir. Perbaiki rekursi yang hilang.sumber
await
AndaPromise.all(…)
; Apakah ini disengaja? Sepertinya dalam kondisi saat iniresults.forEach
akan beralih lebih dari janji, sementara kode mengharapkan untuk beralih pada hasil. Apakah saya melewatkan sesuatu?if (!fs.existsSync(dir)) return
readdir
akan melempar kesalahan sebagaimana mestinya. Jika Andarmdir non-existing-dir
kode keluar adalah kesalahan. Ini akan menjadi tanggung jawab konsumen untuk mencoba / menangkap. Ini adalah metode yang sama dijelaskan dalam Node docs ketika datang untuk menggunakan fungsi fs. Mereka mengharapkan Anda untuk mencoba / menangkap dan melihat kesalahancode
untuk menentukan apa yang harus dilakukan. Pemeriksaan tambahan menunjukkan kondisi balapan.fs.exists
digunakan. PS ini adalah solusi bagus.Ini adalah versi async dari jawaban @ SharpCoder
sumber
Saya menulis fungsi ini disebut hapus folder. Itu akan secara rekursif menghapus semua file dan folder di suatu lokasi. Satu-satunya paket yang diperlukan adalah async.
sumber
Jika Anda menggunakan node 8+ ingin asyncronicity dan tidak ingin dependensi eksternal, berikut adalah versi async / menunggu:
sumber
Versi async dari jawaban @ SharpCoder menggunakan fs.promises:
sumber
Saya sampai di sini sambil mencoba untuk melupakan
gulp
dan saya menulis untuk mencapai lebih jauh.gulp-clean
usang untukgulp-rimraf
gulp-rimraf
usang dalam mendukungdelete-files-folders
Saat Anda ingin menghapus file dan folder menggunakan
del
, Anda harus menambahkan/**
untuk penghapusan rekursif.sumber
Paket de facto adalah
rimraf
, tetapi di sini adalah versi async kecil saya:sumber
Dalam versi terbaru dari Node.js (12.10.0 atau lambat), yang
rmdir
fungsi gayafs.rmdir()
,fs.rmdirSync()
danfs.promises.rmdir()
memiliki pilihan eksperimental barurecursive
yang memungkinkan menghapus direktori yang tidak kosong, misalnyaPR terkait di GitHub: https://github.com/nodejs/node/pull/29168
sumber
Menurut
fs
dokumentasi ,fsPromises
saat ini menyediakanrecursive
opsi berdasarkan percobaan, yang, setidaknya dalam kasus saya sendiri di Windows, menghapus direktori dan file apa pun di dalamnya.Apakah
recursive: true
menghapus file di Linux dan MacOS?sumber
Sangat cepat dan tahan gagal
Anda dapat menggunakan
lignator
paket ( https://www.npmjs.com/package/lignator ), lebih cepat daripada kode async (misalnya rimraf) dan lebih banyak bukti kegagalan (terutama di Windows, di mana penghapusan file tidak instan dan file mungkin dikunci oleh proses lain).sumber
Folder Sync dihapus dengan file atau hanya file.
Saya bukan pemberi atau kontributor tetapi saya tidak dapat menemukan solusi yang baik untuk masalah ini dan saya harus menemukan jalan saya ... jadi saya harap Anda akan menyukainya :)
Bekerja sempurna untuk saya dengan sejumlah direktori dan sub direktori bersarang. Perhatian untuk ruang lingkup 'ini' ketika berulang fungsi, implementasi Anda mungkin berbeda. Dalam kasus saya fungsi ini tetap menjadi pengembalian fungsi lain itu sebabnya saya menyebutnya dengan ini.
sumber
Sementara
recursive
merupakan opsi eksperimental darifs.rmdir
sumber
Pembaruan 2020
Dari versi 12.10.0 rekursif Pilihan Pilihan telah ditambahkan untuk opsi.
Perhatikan bahwa penghapusan rekursif bersifat eksperimental .
Jadi yang akan Anda lakukan untuk sinkronisasi:
atau untuk async:
sumber
Cukup gunakan modul rmdir ! itu mudah dan sederhana.
sumber
Alternatif lain adalah menggunakan
fs-promise
modul yang menyediakan versi promisified darifs-extra
modulAnda kemudian dapat menulis seperti contoh ini:
note: async / await membutuhkan versi nodejs terbaru (7.6+)
sumber
Cara cepat dan kotor (mungkin untuk pengujian) bisa langsung menggunakan
exec
atauspawn
metode untuk memanggil panggilan OS untuk menghapus direktori. Baca lebih lanjut tentang proses child_pro NodeJs .Kerugiannya adalah:
Manfaat:
sumber
-f
bendera agar aman, atau memastikan saat mengetik bahwa ia tidak akan menghapus semuanya.exec + rm
adalah perintah yang valid dan berguna dalam simpul yang sering saya gunakan selama pengujian.Saya berharap ada cara untuk melakukan ini tanpa modul tambahan untuk sesuatu yang sangat kecil dan umum, tetapi ini adalah yang terbaik yang bisa saya lakukan.
Pembaruan: Sekarang seharusnya bekerja pada Windows (diuji Windows 10), dan juga harus bekerja pada sistem Linux / Unix / BSD / Mac.
sumber
child_process.execFile
yang tidak memanggil shell, dan berikan argumen secara eksplisit.Ini adalah satu pendekatan menggunakan fungsi promisify dan dua bantuan (ke dan untuk Semua) untuk menyelesaikan janji.
Itu semua tindakan asynchrounous.
sumber
// tanpa menggunakan lib pihak ketiga
sumber
fs.unllinkSync(path.join(FOLDER_PATH, element);
sumber