fs.unlinkSync(): Xóa File Cực Gắt, Đừng Để Thằng Khác Dọn Dẹp
Nodejs

fs.unlinkSync(): Xóa File Cực Gắt, Đừng Để Thằng Khác Dọn Dẹp

Author

Admin System

@root

Ngày xuất bản

20 Mar, 2026

Lượt xem

3 Lượt

"fs.unlinkSync()"

Chào các đệ tử Gen Z của anh Creyt! Hôm nay, chúng ta sẽ cùng nhau "dọn dẹp" một khái niệm nghe có vẻ đơn giản nhưng lại cực kỳ quan trọng trong thế giới Node.js: fs.unlinkSync(). Nghe cái tên đã thấy mùi "dọn nhà" rồi đúng không?

1. fs.unlinkSync() là gì mà ngầu vậy?

Tưởng tượng thế này, các em có một cái "ổ cứng ảo" ngay trong ứng dụng Node.js của mình. Đôi khi, các em tạo ra những file tạm bợ, những dữ liệu không còn cần thiết nữa, giống như mấy cái ảnh chụp màn hình meme sau khi đã gửi cho crush vậy đó. Để giữ cho "ổ cứng" của mình luôn "sạch sẽ" và không bị "rác" chiếm chỗ, chúng ta cần một công cụ để "quẳng" mấy cái file vô giá trị kia đi.

Và đó chính là lúc fs.unlinkSync() ra tay! Nó là một hàm trong module fs (File System) của Node.js, dùng để xóa một file khỏi hệ thống. Từ unlink ở đây không phải là "hủy liên kết" đâu nhé, mà nó là thuật ngữ cổ điển trong hệ thống UNIX/Linux để chỉ việc xóa một file (thực chất là gỡ bỏ liên kết đến inode của file đó, nhưng thôi, chuyện đó để sau).

Cái từ Sync phía sau mới là điểm đáng chú ý nè. Nó có nghĩa là đồng bộ (synchronous). Khi em gọi fs.unlinkSync(), chương trình của em sẽ đứng hình, chờ đợi cho đến khi file đó được xóa xong xuôi thì mới chịu làm việc khác. Giống như em đang đứng chờ máy giặt xong mới chịu đi phơi đồ vậy đó. Trong lúc chờ, mọi tác vụ khác của chương trình đều bị block (chặn lại). Nghe có vẻ hơi "khó tính" đúng không? Đúng vậy, nó "khó tính" thật, nhưng đôi khi lại rất tiện lợi!

Tóm lại: fs.unlinkSync() dùng để xóa một file cụ thể khỏi hệ thống, và nó làm việc đó một cách đồng bộ, tức là mọi thứ khác phải chờ nó làm xong.

2. Code Ví Dụ Minh Họa: Xóa File Cực Gắt!

Để các em dễ hình dung, anh Creyt sẽ "tạo hiện trường" và sau đó "dọn dẹp" nó luôn. Đầu tiên, chúng ta sẽ tạo một file tạm, sau đó dùng fs.unlinkSync() để xóa nó đi. Nhớ là phải dùng try...catch để bắt lỗi nhé, không thì Node.js nó "dỗi" là toang ngay!

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

const fileName = 'file_rac_tam_thoi.txt';
const filePath = path.join(__dirname, fileName);

// Bước 1: Tạo một file tạm để chúng ta có cái mà xóa
try {
    fs.writeFileSync(filePath, 'Đây là nội dung rác mà anh Creyt tạo ra để xóa.', 'utf8');
    console.log(`Đã tạo file: ${fileName}`);

    // Bước 2: Kiểm tra xem file có tồn tại không trước khi xóa
    if (fs.existsSync(filePath)) {
        console.log(`File ${fileName} đang tồn tại. Chuẩn bị xóa...`);

        // Bước 3: Dùng fs.unlinkSync() để xóa file
        fs.unlinkSync(filePath);
        console.log(`Đã xóa file: ${fileName} thành công!`);
    } else {
        console.log(`File ${fileName} không tồn tại để xóa. Có vẻ ai đó đã dọn trước rồi.`);
    }

} catch (err) {
    // Bước 4: Xử lý lỗi nếu có (ví dụ: file không tồn tại, không có quyền xóa)
    if (err.code === 'ENOENT') {
        console.error(`Lỗi: File '${fileName}' không tồn tại. Không thể xóa.`);
    } else if (err.code === 'EPERM') {
        console.error(`Lỗi: Không có quyền xóa file '${fileName}'.`);
    } else {
        console.error(`Đã xảy ra lỗi khi thao tác với file: ${err.message}`);
    }
}

// Bước 5: Kiểm tra lại xem file còn tồn tại không
if (!fs.existsSync(filePath)) {
    console.log(`Xác nhận: File ${fileName} đã biến mất khỏi thế gian.`);
} else {
    console.log(`Xác nhận: File ${fileName} vẫn còn đó. Có gì đó sai sai...`);
}

Khi chạy đoạn code trên, các em sẽ thấy một file file_rac_tam_thoi.txt được tạo ra, sau đó nó sẽ biến mất trong tích tắc. Đó chính là sức mạnh của unlinkSync()!

Illustration

3. Mẹo Vặt & Best Practices từ "Lão Làng" Creyt

Anh Creyt có vài lời khuyên chân thành cho các em khi "sử dụng" unlinkSync():

  • Sync vs. Async: Cuộc chiến không hồi kết (cho Node.js app): fs.unlinkSync() là đồng bộ, nên nó sẽ block Event Loop của Node.js. Điều này có nghĩa là trong khi nó đang xóa file, server của em sẽ không thể xử lý bất kỳ request nào khác. Trong môi trường web server (như Express, NestJS), việc này là cực kỳ nguy hiểm và có thể làm "chết" ứng dụng của em nếu file lớn hoặc thao tác chậm. Luôn ưu tiên dùng fs.unlink() (phiên bản bất đồng bộ) hoặc fs.promises.unlink() với async/await cho các ứng dụng web hoặc bất kỳ đâu cần hiệu năng cao. unlinkSync chỉ nên dùng cho các script nhỏ, CLI tool, hoặc các tác vụ setup/teardown mà việc blocking không ảnh hưởng lớn.

  • Luôn luôn dùng try...catch, không thì ăn hành!: Giống như ví dụ trên, việc xóa file có thể thất bại vì nhiều lý do (file không tồn tại, không có quyền ghi/xóa, file đang bị ứng dụng khác khóa...). Nếu không có try...catch, chương trình của em sẽ "crash" ngay lập tức. Hãy luôn chuẩn bị tâm lý cho những điều bất ngờ!

  • Quyền lực đi kèm trách nhiệm (và quyền truy cập): Đảm bảo rằng ứng dụng Node.js của em có đủ quyền để xóa file trong thư mục đích. Chạy ứng dụng với quyền "root" hoặc "admin" chỉ khi thực sự cần thiết và hiểu rõ rủi ro, không thì "tự bắn vào chân" đấy.

  • Kiểm tra sự tồn tại của file trước khi xóa: Mặc dù try...catch sẽ bắt lỗi ENOENT (file không tồn tại), việc kiểm tra bằng fs.existsSync() trước khi xóa có thể giúp code của em "sạch" hơn và tránh những lỗi không cần thiết khi file đã bị xóa bởi một tiến trình khác. Hoặc đôi khi, việc file không tồn tại không phải là một lỗi mà là một trạng thái mong muốn.

4. Ứng Dụng Thực Tế: Ai đang dùng unlinkSync()?

Trong thế giới thực, fs.unlinkSync() (hoặc phổ biến hơn là fs.unlink() bất đồng bộ) được sử dụng trong rất nhiều tình huống:

  • Dọn dẹp file tạm: Khi người dùng upload ảnh lên server, server có thể tạo ra các phiên bản ảnh đã resize, thumbnail. Sau khi xử lý xong và lưu vào database hoặc cloud storage, các file gốc hoặc file tạm này cần được xóa đi để tiết kiệm dung lượng.
  • Xóa log file cũ: Các hệ thống thường tạo ra log file để ghi lại hoạt động. Để tránh log file phình to vô hạn, các script định kỳ sẽ xóa những log file quá cũ.
  • Cache Invalidation: Khi dữ liệu cache trên disk không còn hợp lệ, hệ thống có thể xóa các file cache đó để buộc ứng dụng phải tạo lại cache mới.
  • Trong các bài kiểm thử (Unit/Integration Tests): Sau khi chạy xong một bộ test, các file tạm hoặc database tạm được tạo ra trong quá trình test cần được dọn dẹp để đảm bảo môi trường sạch sẽ cho lần chạy test tiếp theo. Đây là một case rất hợp lý để dùng unlinkSync trong các hàm afterEach hoặc afterAll của các test framework.

Các "ông lớn" như Facebook, Google, TikTok... đều có những hệ thống quản lý file khổng lồ, và chắc chắn họ dùng các phiên bản bất đồng bộ và tối ưu hơn rất nhiều để xử lý việc xóa file hàng tỷ lần mỗi ngày. Còn unlinkSync của chúng ta, nó như một "công cụ" đơn giản nhưng hiệu quả cho những tác vụ nhỏ, cần sự chắc chắn tức thì.

5. Thử Nghiệm của anh Creyt & Khi nào nên dùng?

Anh Creyt từng "ngây thơ" thử dùng fs.unlinkSync() để xóa một file log dung lượng vài GB trong một ứng dụng web đang chạy. Kết quả là... server "đứng hình" vài giây, người dùng thì than trời vì trang web không phản hồi. Đúng là "sai một ly, đi một dặm"!

Vậy, khi nào thì nên dùng fs.unlinkSync()?

  • Các script CLI (Command Line Interface) đơn giản: Khi bạn viết một script để tự động hóa tác vụ trên máy tính cá nhân, việc blocking Event Loop không phải là vấn đề lớn.
  • Trong các hàm setup/teardown của test: Như đã nói ở trên, trong các framework test (như Jest, Mocha), bạn có thể dùng unlinkSync trong beforeAll, afterAll, beforeEach, afterEach để tạo hoặc dọn dẹp môi trường test. Lúc này, việc blocking chỉ ảnh hưởng đến quá trình test chứ không phải ứng dụng thực tế.
  • Khi bạn chắc chắn rằng việc blocking Event Loop không gây ra vấn đề hiệu năng hoặc trải nghiệm người dùng: Đây là trường hợp hiếm hoi và cần sự hiểu biết sâu sắc về kiến trúc ứng dụng của mình. Tốt nhất là nên tránh trừ khi có lý do cực kỳ chính đáng.

Và khi nào thì tuyệt đối không nên dùng fs.unlinkSync()?

  • Trong các HTTP request handler của một ứng dụng web Node.js: Trừ khi đó là một tác vụ cực kỳ nhỏ và nhanh đến mức không thể cảm nhận được độ trễ.
  • Trong bất kỳ hàm callback nào mà bạn mong đợi Event Loop tiếp tục xử lý các tác vụ khác: Ví dụ, trong một vòng lặp lớn, việc gọi unlinkSync nhiều lần sẽ biến ứng dụng của bạn thành "con rùa bò" ngay lập tức.

Vậy đó, các em đã thấy fs.unlinkSync() tuy nhỏ nhưng có võ, và quan trọng là phải biết dùng nó đúng lúc, đúng chỗ. Đừng để nó trở thành "thủ phạm" làm chậm ứng dụng của mình nhé! Học lập trình là phải thực tế, phải hiểu rõ công cụ mình đang dùng, chứ không phải cứ thấy hàm là xài bừa đâu. Nhớ lấy lời anh Creyt!

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!