Dọn Dẹp Folder Rỗng: fs.rmdir() & fs.rm() trong Node.js
Nodejs

Dọn Dẹp Folder Rỗng: fs.rmdir() & fs.rm() trong Node.js

Author

Admin System

@root

Ngày xuất bản

20 Mar, 2026

Lượt xem

2 Lượt

"fs.rmdir()"

Chào các 'dev-er' trẻ tuổi, hôm nay chúng ta sẽ 'đào sâu' vào một khái niệm tưởng chừng đơn giản nhưng lại cực kỳ quan trọng trong thế giới Node.js: 'dọn dẹp nhà cửa' cho các thư mục của bạn. Cụ thể là 'thằng' fs.rmdir() và 'đứa em bá đạo' fs.rm().

1. fs.rmdir() là gì? Nó để làm gì?

Imagine thế này: Bạn vừa 'code xong' một project nhỏ, hoặc chạy một cái script nào đó tạo ra cả đống thư mục tạm bợ, xong xuôi rồi thì chúng rỗng toẹt ra đó, nhìn 'ngứa mắt' cực. fs.rmdir() sinh ra là để giải quyết cái sự 'ngứa mắt' đó!

fs.rmdir() (File System Remove Directory) đúng như tên gọi, là một hàm trong module fs của Node.js giúp bạn xóa một thư mục. Nghe đơn giản đúng không? Nhưng mà, có một 'cú lừa' nho nhỏ ở đây, mà anh Creyt sẽ bật mí ngay.

Nó giống như việc bạn muốn 'phá dỡ' một cái nhà kho cũ. fs.rmdir() chỉ cho phép bạn phá dỡ cái kho đó khi nó hoàn toàn trống rỗng, không còn một cái vớ, một cọng rơm hay bất cứ thứ gì bên trong. Nếu có dù chỉ là một hạt bụi, nó cũng 'báo lỗi' ngay tắp lự.

Mục đích chính: Dọn dẹp các thư mục không còn cần thiết, giúp giữ cho cấu trúc dự án của bạn sạch sẽ, gọn gàng, tránh 'rác' digital.

2. Code Ví Dụ Minh Họa (Cả fs.rmdirfs.rm)

Ok, lý thuyết là vậy, giờ 'nhúng tay' vào code để thấy rõ hơn nhé. Anh sẽ cho ví dụ cả fs.rmdir (dù nó đang dần bị thay thế) và fs.rm (phiên bản hiện đại, 'xịn xò' hơn).

Đầu tiên, hãy tạo một vài thư mục 'rác' để chúng ta thực hành:

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

const emptyDir = path.join(__dirname, 'empty_folder');
const nonEmptyDir = path.join(__dirname, 'non_empty_folder');
const fileInNonEmpty = path.join(nonEmptyDir, 'my_file.txt');

// Tạo các thư mục và file để test
fs.mkdirSync(emptyDir, { recursive: true });
fs.mkdirSync(nonEmptyDir, { recursive: true });
fs.writeFileSync(fileInNonEmpty, 'Nội dung file này sẽ ngăn xóa folder!', 'utf8');

console.log('Đã tạo các thư mục để thử nghiệm.');
console.log(`- Thư mục rỗng: ${emptyDir}`);
console.log(`- Thư mục không rỗng: ${nonEmptyDir}`);

Ví dụ 1: Sử dụng fs.rmdir() (Asynchronous)

Đây là cách truyền thống, nhưng nhớ là nó chỉ hoạt động với thư mục rỗng!

// Xóa thư mục rỗng bằng fs.rmdir()
fs.rmdir(emptyDir, (err) => {
  if (err) {
    console.error(`Lỗi khi xóa ${emptyDir} bằng fs.rmdir():`, err.message);
    return;
  }
  console.log(`Đã xóa thành công thư mục rỗng: ${emptyDir} bằng fs.rmdir().`);

  // Thử xóa thư mục không rỗng bằng fs.rmdir()
  fs.rmdir(nonEmptyDir, (err) => {
    if (err) {
      console.error(`\nLỗi (có chủ đích) khi xóa ${nonEmptyDir} bằng fs.rmdir():`, err.message);
      console.log('--> Như anh Creyt đã nói, fs.rmdir() không thể xóa thư mục không rỗng!');
      return;
    }
    console.log(`Đã xóa thành công thư mục không rỗng: ${nonEmptyDir} bằng fs.rmdir(). (KHÔNG THỂ XẢY RA)`);
  });
});

Khi chạy đoạn code trên, bạn sẽ thấy empty_folder bị xóa, nhưng non_empty_folder thì không, và một lỗi sẽ được log ra. Đó là 'cái bẫy' của fs.rmdir().

Gợi Ý Đọc Tiếp
V8 Engine: Siêu Động Cơ Phía Sau Node.js Của Gen Z

3 Lượt xem

Ví dụ 2: Sử dụng fs.rm() (Phiên bản 'Pro' hơn)

fs.rm() là 'thế hệ mới' được giới thiệu từ Node.js 14, nó 'đa năng' hơn rất nhiều. Nó có thể xóa cả file lẫn thư mục, và quan trọng nhất, nó có thể xóa thư mục không rỗng một cách 'thần thánh' với option recursive: true.

// Hãy tạo lại emptyDir và nonEmptyDir để thử nghiệm với fs.rm()
fs.mkdirSync(emptyDir, { recursive: true });
fs.mkdirSync(nonEmptyDir, { recursive: true });
fs.writeFileSync(fileInNonEmpty, 'Nội dung file này sẽ ngăn xóa folder!', 'utf8');

// Xóa thư mục rỗng bằng fs.rm()
fs.rm(emptyDir, { recursive: true }, (err) => {
  if (err) {
    console.error(`Lỗi khi xóa ${emptyDir} bằng fs.rm():`, err.message);
    return;
  }
  console.log(`\nĐã xóa thành công thư mục rỗng: ${emptyDir} bằng fs.rm().`);

  // Xóa thư mục không rỗng bằng fs.rm() với recursive: true
  fs.rm(nonEmptyDir, { recursive: true, force: true }, (err) => {
    if (err) {
      console.error(`Lỗi khi xóa ${nonEmptyDir} bằng fs.rm():`, err.message);
      return;
    }
    console.log(`Đã xóa thành công thư mục không rỗng: ${nonEmptyDir} bằng fs.rm() với recursive: true.`);
  });
});

Giải thích recursive: trueforce: true:

  • recursive: true: Nói cho Node.js biết là 'hãy xóa tất cả mọi thứ bên trong thư mục này, rồi mới xóa chính nó'. Đây là 'chìa khóa' để xóa thư mục không rỗng.
  • force: true: (Từ Node.js 15.0.0) Khi recursivetrue, nếu một thư mục hoặc file không tồn tại, nó sẽ không báo lỗi. Điều này cực kỳ tiện lợi khi bạn không chắc chắn liệu thư mục có tồn tại hay không và chỉ muốn đảm bảo nó bị xóa.
Illustration

3. Mẹo & Best Practices từ 'lão làng' Creyt

  • Quên fs.rmdir() đi, dùng fs.rm()! Nghe có vẻ 'phũ' nhưng đây là lời khuyên chân thành nhất của anh. fs.rmdir() đã bị deprecated (không khuyến khích dùng nữa) từ Node.js 14. Dùng fs.rm() với recursive: true là tiêu chuẩn mới, 'xịn xò' hơn, ít rắc rối hơn nhiều.
  • Luôn luôn xử lý lỗi: Dù bạn dùng fs.rmdir() hay fs.rm(), việc xóa file hệ thống luôn tiềm ẩn rủi ro. Hãy luôn có if (err) hoặc dùng try...catch nếu bạn dùng phiên bản Sync hoặc Promises để bắt lỗi và xử lý chúng một cách 'tử tế'. Chuyện 'xóa nhầm' là ác mộng của mọi developer.
  • Cẩn trọng với recursive: trueforce: true: Hai 'thần chú' này mạnh mẽ như 'thần chú Avada Kedavra' vậy. Nó có thể 'thổi bay' cả một cây thư mục mà không hỏi lại. Hãy chắc chắn bạn đang xóa đúng cái cần xóa! Double-check path trước khi chạy, đặc biệt trong môi trường production.
  • Sử dụng path.join(): Luôn dùng path.join() để nối các phần của đường dẫn. Nó giúp code của bạn hoạt động mượt mà trên mọi hệ điều hành (Windows dùng \, Linux/macOS dùng /).

4. Ứng dụng Thực Tế (Ở đâu mà 'thằng' này được dùng?)

Bạn nghĩ rằng việc xóa thư mục chỉ là 'chuyện vặt'? Sai lầm! Nó là một phần không thể thiếu trong nhiều hệ thống 'khủng' đấy:

  • Dọn dẹp cache/file tạm: Các website lớn như Facebook, Google hay bất kỳ ứng dụng web nào có chức năng upload file đều có thể tạo ra các thư mục tạm thời để lưu trữ file trước khi xử lý. Sau khi xử lý xong, những thư mục này cần được dọn dẹp định kỳ.
  • CI/CD Pipelines (Jenkins, GitHub Actions, GitLab CI): Khi bạn deploy code mới, các hệ thống tự động này thường tạo ra các thư mục build tạm thời. Sau khi build xong và deploy thành công, chúng sẽ xóa các thư mục đó để giải phóng không gian.
  • Hệ thống quản lý nội dung (CMS): Nếu bạn có một CMS cho phép người dùng upload ảnh, video, và sau đó xóa chúng, thì backend sẽ cần dùng các hàm như fs.rm() để xóa file và thư mục tương ứng trên server.
  • Local Development Tools: Các công cụ như npm khi chạy npm clean hay npm prune cũng ngầm dùng các chức năng tương tự để dọn dẹp các module không dùng nữa.

5. Thử Nghiệm của Anh Creyt và Hướng Dẫn Nên Dùng Cho Case Nào

Anh Creyt đã từng 'đau đầu' với fs.rmdir() hồi mới vào nghề. Hồi đó, cứ muốn xóa một thư mục có file bên trong là y như rằng nó 'giãy nảy' lên báo lỗi ENOTEMPTY. Phải viết thêm một hàm đệ quy để duyệt qua từng file, xóa từng file, rồi mới xóa được thư mục mẹ. 'Cực hình' lắm!

Bài học kinh nghiệm:

  • Nếu bạn dùng Node.js 14 trở lên: Hãy 'mạnh dạn' dùng fs.rm(). Nó là 'cứu cánh' cho mọi vấn đề xóa thư mục. Đây là lựa chọn 'đi thẳng vào vấn đề' nhất.

    • Dùng khi: Bạn cần xóa một thư mục bất kể nó rỗng hay không rỗng, ví dụ: xóa thư mục uploads/temp sau khi xử lý file, xóa thư mục build cũ, xóa toàn bộ thư mục node_modules để cài lại.
    • Ví dụ: fs.rm('./my_project/temp_data', { recursive: true, force: true }, callback);
  • Nếu bạn 'buộc phải' dùng Node.js cũ hơn (trước 14) hoặc muốn một lớp bảo vệ 'thừa thãi': Thì mới nghĩ đến fs.rmdir(). Nhưng hãy nhớ là bạn sẽ phải tự code logic để đảm bảo thư mục đó rỗng trước khi gọi rmdir.

    • Dùng khi: Bạn có một logic phức tạp để đảm bảo thư mục đã 'sạch sẽ' trước khi xóa, hoặc trong các hệ thống legacy không thể nâng cấp Node.js. (Thực ra, nếu phải làm vậy thì cũng nên cân nhắc viết một hàm xóa đệ quy riêng).
    • Ví dụ (Legacy): Bạn sẽ phải fs.readdir để list các file, fs.unlink từng file, rồi mới fs.rmdir.

Lời khuyên cuối cùng từ anh Creyt: Trong thế giới lập trình hiện đại, hiệu quả và an toàn là trên hết. fs.rm() với recursive: trueforce: true là 'công cụ' bạn cần thành thạo để 'dọn dẹp' file system của mình một cách 'chuyên nghiệp' và 'không đổ mồ hôi'. Hãy dùng nó một cách 'thông minh' và 'có trách nhiệm' nhé các 'dev-er'!

Thuộc Series: Nodejs

Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!

#tech #cyberpunk #laravel
Chỉnh sửa bài viết

Bình luận (0)

Vui lòng Đăng Nhập để Bình luận

Hỗ trợ Markdown cơ bản
Nguyễn Văn A
1 ngày trước

Tính năng này đỉnh quá ad ơi, chờ mãi mới thấy một blog Tiếng Việt có UI/UX xịn như vầy!