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.

kamu lebih baik
sumber
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!'));
Rodrigo5244
sumber
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.

Samiul Alam
sumber
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

Nicolas Guérinet
sumber
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();
Jason Kim
sumber
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(); // <--
Yairopro
sumber