Node.js'de dizini kaldırmadan tüm dosyalar dizinden nasıl kaldırılır


102

Node.js kullanarak bir dizinin kendisini kaldırmadan tüm dosyalar bir dizinden nasıl kaldırılır?
Geçici dosyaları kaldırmak istiyorum. Henüz dosya sistemlerinde iyi değilim.

Dosyaları ve dizini kaldıracak bu yöntemi buldum . Bunun içinde böyle bir şey /path/to/directory/*işe yaramaz.

Hangi komutların kullanılması gerektiğini gerçekten bilmiyorum. Yardım için teşekkürler.


2
Joker karakterler kullanmak istiyorsanız, npmjs.org/package/glob adresine bakın .
Felix Kling

1
sadece api'ye bakın, içinde bu kadar zor olan ne? dosyaları bir dizinde almanız ve ardından silmeniz gerekir.
Sikorski

2
Glob işi yaptı, teşekkürler!
youbetternot

Yanıtlar:


162

Tüm dosyaları bir dizinden kaldırmak için, önce kullanarak dizindeki tüm dosyaları listelemeniz gerekir fs.readdir, ardından fs.unlinkher dosyayı kaldırmak için kullanabilirsiniz . Ayrıca fs.readdirsadece dosya adlarını da verecektir, tam yolu elde etmek için dizin adıyla bir araya gelmelisiniz.

İşte bir örnek

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;
    });
  }
});

Düğüm sürüm 14'ü güncelleyin

Tüm dosyaları yinelemeli olarak kaldırmak için recursivekullanabileceğiniz bir bayrak vardır rmdir. Daha fazla bilgi için nodejs belgelerine bakın .

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

const directory = 'test';

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

4
bu harika çalışıyor ve çoğunun zaten gerekli fs ve yolu olacak, böylece bir bonus, ekstra paket gerekmez. ben sadece path.join (__ dirname,' ../../public/uploads') için 'test' takas
russiansummer

3
2p eklemek için, pasaj harika ve akılda tutulması gereken tek şey, eşzamansız olması ve komut dosyası / otomasyon durumlarında eşzamanlı sürümünü kullanmak isteyebileceğiniz fs.readdirSync,. Sadece tüm dosyaları atayın: const files = fs.readdirSync(directory);ve aynı şekilde döngü yapın for (const file of files) {.
04'te yeniden canlandı

Nasıl klasör dışlamak için ".git" in 'test' dizinine?
hizmetli

Bu durumu kaldırmak için for döngüsüne bir if ifadesi ekleyebilirsiniz, ancak dosya ve klasörleri özyinelemeli olarak kaldırmak istiyorsanız, bazı npm paketi kullanmak isteyebilirsiniz. npmjs.com/package/fs-extra
Rodrigo5244

46

Evet, bir fs-extra modülü var . .emptyDir()Bu modülün içinde işi yapan bir yöntem var. İşte bir örnek:

const fsExtra = require('fs-extra')

fsExtra.emptyDirSync(fileDir)

Bu modülün asenkron versiyonu da vardır. Bağlantıya herkes göz atabilir.


3
Çok kullanışlı modül, denemelisiniz, kesinlikle seveceğiniz birçok işlev var.
gts

1
Evet, neden önemsiz olmayan bir şeyi uyguluyorsunuz?
manuman94

1
Küçük bir uyarı, bu yol, sorunun istenen davranışından biraz farklı bir davranışa sahiptir, çünkü emptyDirişlev yoksa dizini oluşturur.
programmerRaj

35

Rimraf denen çok kullanışlı bir paket var. Düğüm için UNIX rm -rf komutudur.

Yine de çok güçlü olabilir çünkü kullanarak klasörleri çok kolay silebilirsiniz. Aşağıdaki komutlar klasörün içindeki dosyaları silecektir. * Simgesini kaldırırsanız, günlük klasörünü kaldırırsınız.

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

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


Bir fonksiyonla çözülebilecek olan IMO, asla bir paket ile çözülmemelidir.
Aditya Anand

1
@AdityaAnand - ne işlevi? bazı paketleri içe aktarmadan veya kendi başınıza bir ton kod yazmadan imkansız
vsync

12

Eşzamansız kullanmak ve 8+ düğümünde beklemek istiyorsanız @ Waterscroll'un yanıtına dayalı olarak:

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
harika! Klasörde belirli bir dosyada tutmak istediğim için tam
aradığım şey

1
return await PromiseGereksiz olan bir not . Sadece yapabilirsin return Promise. toRunFonksiyon bir söz geri getirildiğinde bu yüzden, uygulama o üzerinde bekliyor olabilir, zaman uyumsuz olduğunu.
ItalyPaleAle

Artık const { promises: fs } = require('fs');10+ düğümünden kullanabileceğinizi düşünüyorum.
Shikyo

0

🚀 grafik-fs


Yüklemek

npm i graph-fs

Kullanım

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

directory.clear(); // <--
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.