Node.js - Hệ thống tệp

Chào mừng các bạn future programmers! Hôm nay, chúng ta sẽ cùng khám phá thế giới thú vị của Node.js và module Hệ thống tệp của nó. Là giáo viên máy tính gần gũi của bạn, tôi ở đây để hướng dẫn bạn qua hành trình này với rất nhiều ví dụ và giải thích. Hãy căng dây và bắt đầu nhé!

Node.js - File System

Tương tự vs Không tương tự

Trước khi chúng ta nhảy vào các thao tác tệp, hãy nói về hai khái niệm quan trọng: thao tác tương tự và thao tác không tương tự.

Hãy tưởng tượng bạn đang ở một quán cà phê. Trong một thế giới tương tự, bạn sẽ đặt cà phê, chờ đợi cho đến khi nó được làm xong, và sau đó chuyển sang nhiệm vụ tiếp theo. Trong một thế giới không tương tự, bạn sẽ đặt cà phê và sau đó tiếp tục công việc của bạn trong khi barista chuẩn bị nó.

Trong Node.js, chúng ta có cả hai phương thức tương tự và không tương tự cho các thao tác tệp. Hãy xem một ví dụ:

const fs = require('fs');

// Đọc tương tự
const data = fs.readFileSync('hello.txt', 'utf8');
console.log(data);

// Đọc không tương tự
fs.readFile('hello.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});

Trong phiên bản tương tự, chương trình của chúng ta chờ đợi cho đến khi tệp được đọc xong trước khi tiếp tục. Trong phiên bản không tương tự, nó tiếp tục thực thi trong khi tệp đang được đọc, và sau đó chạy một hàm callback khi xong.

Ghi vào tệp

Bây giờ, hãy học cách ghi vào một tệp. Đó giống như để lại một lời nhắn cho chính bạn trong tương lai!

const fs = require('fs');

// Ghi tương tự
fs.writeFileSync('note.txt', 'Hello, Future Me!');

// Ghi không tương tự
fs.writeFile('note.txt', 'Hello, Future Me!', (err) => {
if (err) throw err;
console.log('File saved!');
});

Trong cả hai trường hợp, chúng ta đang tạo (hoặc ghi đè) một tệp叫做 'note.txt' với nội dung "Hello, Future Me!". Phiên bản không tương tự bao gồm một hàm callback chạy sau khi tệp được ghi.

Đọc tệp

Đọc một tệp giống như mở lời nhắn bạn để lại cho chính mình. Hãy xem cách làm:

const fs = require('fs');

// Đọc tương tự
const data = fs.readFileSync('note.txt', 'utf8');
console.log(data);

// Đọc không tương tự
fs.readFile('note.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});

Cả hai phương pháp đều sẽ hiển thị nội dung của 'note.txt'. Tham số 'utf8' chỉ định mã hóa của tệp.

Mở tệp

Đôi khi, chúng ta muốn có nhiều hơn nữa kiểm soát cách chúng ta tương tác với một tệp. Đó là khi phương thức open được sử dụng:

const fs = require('fs');

// Mở không tương tự
fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
console.log('File opened successfully!');
// Nhớ đóng tệp khi bạn đã xong
fs.close(fd, (err) => {
if (err) throw err;
});
});

Điều này mở 'myfile.txt' trong chế độ đọc ('r'). fd trong callback là một bộ chỉ thị tệp, mà chúng ta sẽ sử dụng cho các thao tác tiếp theo trên tệp.

API Promises

Đối với những ai thích làm việc với Promises (đừng lo nếu bạn chưa biết những gì này!), Node.js cung cấp một API dựa trên Promises cho các thao tác tệp:

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

async function readMyFile() {
try {
const data = await fs.readFile('myfile.txt', 'utf8');
console.log(data);
} catch (error) {
console.error('Error reading file:', error);
}
}

readMyFile();

Điều này đạt được cùng kết quả như ví dụ readFile không tương tự trước đó, nhưng sử dụng cú pháp JavaScript hiện đại.

Lấy thông tin tệp

Thắc mắc về thông tin của một tệp? Node.js có thể cung cấp cho bạn:

const fs = require('fs');

fs.stat('myfile.txt', (err, stats) => {
if (err) throw err;
console.log(`File size: ${stats.size} bytes`);
console.log(`Is it a directory? ${stats.isDirectory()}`);
console.log(`Is it a file? ${stats.isFile()}`);
});

Điều này cung cấp cho chúng ta thông tin như kích thước tệp, liệu nó có phải là thư mục hay tệp hay không, và hơn thế nữa.

Đóng tệp

Nhớ luôn đóng tệp khi bạn đã xong với chúng. Đó giống như đậy nắp kem đánh răng!

const fs = require('fs');

fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
// Thực hiện một số thao tác...
fs.close(fd, (err) => {
if (err) throw err;
console.log('File closed successfully');
});
});

Cắt ngắn tệp

Đôi khi bạn muốn giữ tệp nhưng xóa bỏ nội dung của nó. Đó là khi phương thức truncate được sử dụng:

const fs = require('fs');

fs.truncate('myfile.txt', 0, (err => {
if (err) throw err;
console.log('File content cleared!');
});

Điều này giảm kích thước tệp xuống 0 byte, hiệu quả清除 nội dung của nó.

Xóa tệp

Khi bạn hoàn toàn không cần tệp nữa, bạn có thể xóa nó:

const fs = require('fs');

fs.unlink('myfile.txt', (err) => {
if (err) throw err;
console.log('File deleted successfully');
});

Hãy cẩn thận với phương thức này - không có nút undo trong thực tế!

Tạo thư mục

Cần một thư mục mới? Dưới đây là cách bạn tạo một thư mục:

const fs = require('fs');

fs.mkdir('mynewfolder', (err) => {
if (err) throw err;
console.log('Directory created successfully!');
});

Đọc thư mục

Muốn xem những gì trong một thư mục? Dưới đây là cách:

const fs = require('fs');

fs.readdir('.', (err, files) => {
if (err) throw err;
console.log('Directory contents:');
files.forEach(file => {
console.log(file);
});
});

Điều này liệt kê tất cả các tệp và thư mục con trong thư mục hiện tại.

Xóa thư mục

Và cuối cùng, nếu bạn muốn xóa một thư mục:

const fs = require('fs');

fs.rmdir('mynewfolder', (err) => {
if (err) throw err;
console.log('Directory removed successfully');
});

Lưu ý rằng điều này chỉ hoạt động trên các thư mục trống.

Tham khảo phương thức

Dưới đây là bảng tóm tắt các phương thức chúng ta đã covered:

Phương thức Mô tả
readFile Đọc toàn bộ nội dung của một tệp
writeFile Ghi dữ liệu vào một tệp, thay thế tệp nếu nó đã tồn tại
open Mở một tệp để đọc hoặc ghi
close Đóng một bộ chỉ thị tệp
stat Lấy thông tin về một tệp
truncate Cắt ngắn một tệp đến một độ dài chỉ định
unlink Xóa một tệp
mkdir Tạo một thư mục mới
readdir Đọc nội dung của một thư mục
rmdir Xóa một thư mục

Và thế là xong! Bạn đã được trang bị các kiến thức cơ bản về các thao tác hệ thống tệp trong Node.js. Nhớ rằng, thực hành làm cho hoàn hảo, vì vậy đừng ngần ngại thử nghiệm với các phương thức này. Chúc các bạn may mắn!

Credits: Image by storyset