Bagaimana menghapus semua file dari direktori tanpa menghapus direktori di Node.js


106

Bagaimana cara menghapus semua file dari direktori tanpa menghapus direktori itu sendiri menggunakan Node.js?
Saya ingin menghapus file sementara. Saya belum mahir menggunakan filesystem.

Saya telah menemukan metode ini , yang akan menghapus file dan direktori. Dalam hal itu, sesuatu seperti /path/to/directory/*tidak akan berhasil.

Saya tidak begitu tahu perintah apa yang harus digunakan. Terima kasih untuk bantuannya.


2
Jika Anda ingin menggunakan wildcard, lihat npmjs.org/package/glob .
Felix Kling

1
cari saja apinya, apa susahnya di dalamnya? Anda harus mendapatkan file di direktori dan kemudian menghapusnya.
Sikorski

2
Glob sudah selesai, terima kasih!
tanggal

Jawaban:


169

Untuk menghapus semua file dari direktori, pertama-tama Anda perlu membuat daftar semua file di direktori menggunakan fs.readdir, lalu Anda dapat menggunakan fs.unlinkuntuk menghapus setiap file. Juga fs.readdirhanya akan memberikan nama file, Anda perlu menyesuaikan dengan nama direktori untuk mendapatkan path lengkap.

Berikut ini contohnya

const fs = require('fs');
const path = require('path');

const directory = 'test';

fs.readdir(directory, (err, files) => {
  if (err) throw err;

  for (const file of files) {
    fs.unlink(path.join(directory, file), err => {
      if (err) throw err;
    });
  }
});

Perbarui node versi 14

Ada sebuah recursiveflag yang dapat Anda gunakan rmdiruntuk menghapus semua file secara rekursif. Lihat dokumen nodejs untuk informasi lebih lanjut.

const fs = require('fs').promises;

const directory = 'test';

fs.rmdir(directory, { recursive: true })
  .then(() => console.log('directory removed!'));

4
ini berfungsi dengan baik, dan sebagian besar sudah memiliki fs dan path yang diperlukan sehingga itu adalah bonus, tidak diperlukan paket tambahan. saya baru saja menukar 'test' untuk path.join (__ dirname, '../../public/uploads')
russiansummer

3
untuk menambahkan 2p., cuplikannya bagus dan hanya satu hal yang perlu diingat adalah bahwa itu asinkron dan dalam kasus skrip / otomatisasi Anda mungkin ingin menggunakan versi sinkronnya fs.readdirSync,. Cukup tetapkan semua file: const files = fs.readdirSync(directory);dan ulangi dengan cara yang sama for (const file of files) {.
nikmati

Bagaimana cara mengecualikan folder ".git" di direktori "test" ?
5ervant

Anda dapat menambahkan pernyataan if di loop for untuk menghapus kasus tersebut, tetapi jika Anda ingin menghapus file dan folder secara rekursif, Anda mungkin ingin menggunakan beberapa paket npm. npmjs.com/package/fs-extra
Rodrigo5244

Catatan: Bendera rekursif di fs.promises.rmdir tidak digunakan lagi dan akan memunculkan kesalahan di masa mendatang.
msg45f

49

Ya, ada modul fs-extra . Ada metode .emptyDir()di dalam modul ini yang melakukan pekerjaan itu. Berikut ini contohnya:

const fsExtra = require('fs-extra')

fsExtra.emptyDirSync(fileDir)

Ada juga versi asinkron dari modul ini juga. Siapapun dapat melihat tautannya.


3
Modul yang sangat berguna, Anda harus mencobanya, ada banyak fungsi yang pasti Anda sukai.
gts

1
Ya, kenapa menerapkan sesuatu yang tidak sepele.
manuman94

2
Sedikit peringatan, cara ini memiliki perilaku yang sedikit berbeda dari perilaku pertanyaan yang diinginkan, karena emptyDirfungsinya membuat direktori jika tidak ada.
programmerRaj

36

Ada paket yang disebut rimraf yang sangat berguna. Ini adalah perintah UNIX rm -rf untuk node.

Namun demikian, ini juga bisa menjadi terlalu kuat karena Anda dapat menghapus folder dengan sangat mudah menggunakannya. Perintah berikut akan menghapus file di dalam folder. Jika Anda menghapus *, Anda akan menghapus folder log.

const rimraf = require('rimraf');
rimraf('./log/*', function () { console.log('done'); });

https://www.npmjs.com/package/rimraf


IMO, apa yang bisa diselesaikan dengan suatu fungsi, tidak boleh diselesaikan dengan sebuah paket.
Aditya Anand

1
@AdityaAnand - fungsinya apa? tidak mungkin tanpa mengimpor beberapa paket atau menulis banyak kode sendiri
vsync

12

Mengembangkan respons @ Waterscroll, jika Anda ingin menggunakan asinkron dan menunggu di node 8+:

const fs = require('fs');
const util = require('util');
const readdir = util.promisify(fs.readdir);
const unlink = util.promisify(fs.unlink);
const directory = 'test';

async function toRun() {
  try {
    const files = await readdir(directory);
    const unlinkPromises = files.map(filename => unlink(`${directory}/${filename}`));
    return Promise.all(unlinkPromises);
  } catch(err) {
    console.log(err);
  }
}

toRun();

1
Bagus! Hanya apa yang saya cari karena saya ingin menyimpan file tertentu di folder: D
Silve2611

1
Cuma catatan yang return await Promisemubazir. Anda bisa melakukannya return Promise. The toRunfungsi async, jadi ketika janji dikembalikan, aplikasi dapat menunggu itu.
ItalyPaleAle

Anda sekarang dapat menggunakan const { promises: fs } = require('fs');dari node 10+ saya percaya.
Shikyo

0

🚀 grafik-fs


Install

npm i graph-fs

Menggunakan

const {Node} = require("graph-fs");
const directory = new Node("/path/to/directory");

directory.clear(); // <--
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.