วิธีลบไฟล์ทั้งหมดออกจากไดเร็กทอรีโดยไม่ต้องลบไดเร็กทอรีใน Node.js


101

วิธีลบไฟล์ทั้งหมดออกจากไดเร็กทอรีโดยไม่ต้องลบไดเร็กทอรีโดยใช้ Node.js
ฉันต้องการลบไฟล์ชั่วคราว ฉันยังไม่ดีกับระบบไฟล์ใด ๆ

ฉันพบวิธีนี้ซึ่งจะลบไฟล์และไดเรกทอรี ในนั้นสิ่งที่ต้องการ/path/to/directory/*จะไม่ทำงาน

ฉันไม่รู้จริงๆว่าควรใช้คำสั่งอะไร ขอบคุณสำหรับความช่วยเหลือ


2
หากคุณต้องการใช้สัญลักษณ์แทนตรวจสอบnpmjs.org/package/glob
Felix Kling

1
แค่ค้นหา api มันยากขนาดนั้นเลยเหรอ? คุณต้องรับไฟล์ในไดเร็กทอรีจากนั้นจึงลบออก
Sikorski

2
ลูกโลกทำงานเสร็จแล้วขอบคุณ!
youbetternot

คำตอบ:


161

ในการลบไฟล์ทั้งหมดออกจากไดเร็กทอรีก่อนอื่นคุณต้องแสดงรายการไฟล์ทั้งหมดในไดเร็กทอรีโดยใช้fs.readdirจากนั้นคุณสามารถใช้fs.unlinkเพื่อลบแต่ละไฟล์ได้ นอกจากนี้fs.readdirจะให้เฉพาะชื่อไฟล์คุณต้องเชื่อมต่อกับชื่อไดเรกทอรีเพื่อรับเส้นทางแบบเต็ม

นี่คือตัวอย่าง

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

อัปเดตโหนดเวอร์ชัน 14

มีrecursiveแฟล็กที่คุณสามารถใช้rmdirเพื่อลบไฟล์ทั้งหมดแบบวนซ้ำได้ ดูเอกสาร nodejsสำหรับข้อมูลเพิ่มเติม

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

const directory = 'test';

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

4
สิ่งนี้ใช้งานได้ดีและส่วนใหญ่จะมี fs และ path ที่จำเป็นอยู่แล้วดังนั้นจึงเป็นโบนัสโดยไม่จำเป็นต้องมีแพ็คเกจเพิ่มเติม ฉันเพียงแค่สลับออก 'ทดสอบ' สำหรับ path.join (dirname __' ../../public/uploads')
russiansummer

3
หากต้องการเพิ่ม 2p ตัวอย่างข้อมูลนั้นยอดเยี่ยมและมีเพียงสิ่งเดียวที่ควรทราบก็คือเป็นแบบ async และในกรณีการเขียนสคริปต์ / ระบบอัตโนมัติคุณอาจต้องการใช้เวอร์ชันซิงโครนัสไฟล์fs.readdirSync. เพียงแค่กำหนดไฟล์ทั้งหมด: และวิธีการเดียวกันห่วงconst files = fs.readdirSync(directory); for (const file of files) {
เปิดเผย

จะแยกโฟลเดอร์".git"ในไดเร็กทอรี"test" ได้อย่างไร?
5 เสิร์ฟ

คุณสามารถเพิ่มคำสั่ง if ใน for loop เพื่อลบกรณีนั้นได้ แต่ถ้าคุณต้องการลบไฟล์และโฟลเดอร์แบบวนซ้ำคุณอาจต้องการใช้แพ็คเกจ npm npmjs.com/package/fs-extra
Rodrigo5244

45

ใช่มีโมดูลFS-พิเศษ มีวิธีการ.emptyDir()ในโมดูลนี้ซึ่งทำงานได้ นี่คือตัวอย่าง:

const fsExtra = require('fs-extra')

fsExtra.emptyDirSync(fileDir)

นอกจากนี้ยังมีเวอร์ชันอะซิงโครนัสของโมดูลนี้ด้วย ทุกคนสามารถตรวจสอบลิงก์


3
โมดูลที่มีประโยชน์มากคุณควรทดลองใช้มี funciotions มากมายที่คุณจะต้องหลงรักอย่างแน่นอน
gts

1
ใช่ทำไมต้องใช้สิ่งที่ไม่สำคัญ
manuman94

1
คำเตือนเล็กน้อยวิธีนี้มีพฤติกรรมที่แตกต่างจากพฤติกรรมที่ต้องการของคำถามเล็กน้อยเนื่องจากemptyDirฟังก์ชันจะสร้างไดเร็กทอรีหากไม่มีอยู่
programmerRaj

35

มีแพ็คเกจที่เรียกว่า rimraf ที่มีประโยชน์มาก เป็นคำสั่ง UNIX rm -rf สำหรับโหนด

อย่างไรก็ตามมันอาจมีประสิทธิภาพมากเกินไปเพราะคุณสามารถลบโฟลเดอร์ได้อย่างง่ายดายโดยใช้มัน คำสั่งต่อไปนี้จะลบไฟล์ภายในโฟลเดอร์ หากคุณลบ * คุณจะลบโฟลเดอร์บันทึก

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

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


IMO สิ่งที่แก้ไขได้ด้วยฟังก์ชันไม่ควรแก้ไขด้วยแพ็คเกจ
อาทิตยาอานันท์

1
@AdityaAnand - ฟังก์ชั่นอะไร? เป็นไปไม่ได้หากไม่นำเข้าแพ็คเกจหรือเขียนโค้ดจำนวนมากด้วยตัวเอง
vsync

12

จากการตอบสนองของ @ Waterscroll หากคุณต้องการใช้ async และรอในโหนด 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
เยี่ยมมาก! สิ่งที่ฉันกำลังค้นหาตามที่ต้องการเก็บไว้ในไฟล์เฉพาะในโฟลเดอร์: D
Silve2611

1
เพียงบันทึกที่return await Promiseซ้ำซ้อน return Promiseคุณก็สามารถทำ toRunฟังก์ชั่น async ดังนั้นเมื่อสัญญาจะถูกส่งกลับ app สามารถรอคอยว่า
ItalyPaleAle

ตอนนี้คุณสามารถใช้ได้const { promises: fs } = require('fs');จากโหนด 10+ ฉันเชื่อ
Shikyo

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.