Cách xóa tất cả các tệp khỏi thư mục mà không cần xóa thư mục trong Node.js


101

Làm cách nào để xóa tất cả các tệp khỏi một thư mục mà không xóa chính thư mục đó bằng Node.js?
Tôi muốn xóa các tệp tạm thời. Tôi không giỏi với hệ thống tập tin.

Tôi đã tìm thấy phương pháp này , nó sẽ loại bỏ các tệp và thư mục. Trong đó, một cái gì đó như /path/to/directory/*sẽ không hoạt động.

Tôi thực sự không biết những lệnh nào nên sử dụng. Cảm ơn đã giúp đỡ.


2
Nếu bạn muốn sử dụng ký tự đại diện, hãy xem npmjs.org/package/glob .
Felix Kling

1
chỉ cần tra cứu api, có gì khó trong đó? bạn phải lấy các tệp trong một thư mục và sau đó xóa chúng.
Sikorski

2
Glob đã hoàn thành công việc, cảm ơn bạn!
youbetternot

Câu trả lời:


161

Để xóa tất cả các tệp khỏi một thư mục, trước tiên bạn cần liệt kê tất cả các tệp trong thư mục đang sử dụng fs.readdir, sau đó bạn có thể sử dụng fs.unlinkđể xóa từng tệp. Ngoài ra fs.readdirsẽ chỉ cung cấp tên tệp, bạn cần phải ghép với tên thư mục để có được đường dẫn đầy đủ.

Đây là một ví dụ

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

Cập nhật phiên bản nút 14

Có một recursivecờ mà bạn có thể sử dụng rmdirđể xóa tất cả các tệp một cách đệ quy. Xem tài liệu nodejs để biết thêm thông tin.

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

const directory = 'test';

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

4
điều này hoạt động tuyệt vời và hầu hết sẽ có fs và đường dẫn cần thiết để có phần thưởng, không cần gói bổ sung. tôi vừa hoán đổi 'test' cho path.join (__ dirname, '../../public/uploads')
russiansummer

3
để thêm 2p., đoạn mã rất tuyệt và chỉ có một điều cần lưu ý là nó không đồng bộ và trong các trường hợp tập lệnh / tự động hóa, bạn có thể muốn sử dụng phiên bản đồng bộ của nó fs.readdirSync,. Chỉ cần gán tất cả các tệp: const files = fs.readdirSync(directory);và lặp lại theo cùng một cách for (const file of files) {.
vui vẻ vào

Làm cách nào để loại trừ thư mục ".git" trong thư mục "test" ?
5ervant

Bạn có thể thêm câu lệnh if trong vòng lặp for để loại bỏ trường hợp đó, nhưng nếu bạn muốn loại bỏ đệ quy các tệp và thư mục, bạn có thể muốn sử dụng một số gói npm. npmjs.com/package/fs-extra
Rodrigo5244

45

Có, có một mô-đun fs-extra . Có một phương thức .emptyDir()bên trong mô-đun này thực hiện công việc. Đây là một ví dụ:

const fsExtra = require('fs-extra')

fsExtra.emptyDirSync(fileDir)

Cũng có một phiên bản không đồng bộ của mô-đun này. Bất kỳ ai cũng có thể kiểm tra liên kết.


3
Mô-đun rất hữu ích, bạn nên dùng thử, có rất nhiều chức năng mà bạn chắc chắn sẽ thích.
gts

1
Vâng, tại sao lại thực hiện một thứ không hề tầm thường.
manuman94,

1
Chỉ cần một cảnh báo nhỏ, cách này có hành vi hơi khác so với hành vi mong muốn của câu hỏi, vì emptyDirhàm tạo thư mục nếu nó không tồn tại.
lập trình

35

Có gói gọi là rimraf rất tiện dụng. Đây là lệnh UNIX rm -rf cho nút.

Tuy nhiên, nó cũng có thể quá mạnh vì bạn có thể xóa các thư mục rất dễ dàng bằng cách sử dụng nó. Các lệnh sau sẽ xóa các tệp bên trong thư mục. Nếu bạn xóa dấu *, bạn sẽ xóa thư mục nhật ký.

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

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


IMO, những gì có thể được giải quyết bằng một hàm, không bao giờ được giải quyết bằng một gói.
Aditya Anand

1
@AdityaAnand - chức năng gì? không thể nào không nhập một số gói hoặc tự viết một tấn mã
vsync

12

Dựa trên phản hồi của @ Waterscroll, nếu bạn muốn sử dụng không đồng bộ và chờ đợi trong nút 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
tuyệt quá! Chỉ là những gì tôi đang tìm kiếm như tôi muốn giữ lại trong hồ sơ cụ thể trong thư mục: D
Silve2611

1
Chỉ cần một lưu ý return await Promiselà thừa. Bạn chỉ có thể làm return Promise. Các toRunchức năng là async, vì vậy khi một lời hứa được trả lại, các ứng dụng có thể chờ đợi vào điều đó.
ItalyPaleAle

const { promises: fs } = require('fs');Tôi tin rằng bây giờ bạn có thể sử dụng từ nút 10+.
Shikyo

0

🚀 graph-fs


Tải về

npm i graph-fs

Sử dụng

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

directory.clear(); // <--
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.