Node.js cung cấp một hệ thống I/O (Input/Output) tệp mạnh mẽ và linh hoạt, dựa trên các chức năng POSIX tiêu chuẩn, cho phép bạn tương tác với hệ thống tệp tin trên máy tính. Điều này được thực hiện thông qua mô-đun Hệ thống Tệp (fs), một trong những mô-đun cốt lõi của Node.js.
Mô-đun Hệ thống Tệp (fs)
- Mô-đun fs trong Node.js cung cấp một API để làm việc với các tệp và thư mục. Nó bao gồm cả hoạt động đồng bộ và bất đồng bộ, cho phép bạn chọn phương thức phù hợp với nhu cầu của ứng dụng.
- Cách Import Mô-đun fs:Sử dụng
require('fs')
để nhập mô-đun fs vào tệp JavaScript của bạn, sau đó bạn có thể sử dụng các phương thức của nó để thực hiện các hoạt động liên quan đến tệp tin.
Cú pháp:
var fs = require("fs")
Các Chức Năng Cơ Bản của Mô-đun fs
- Đọc và Ghi Tệp Tin:
fs.readFile()
vàfs.writeFile()
cho phép bạn đọc nội dung của tệp tin vào bộ nhớ và ghi nội dung mới vào tệp.- Các phiên bản bất đồng bộ của các hàm này giúp thực hiện các hoạt động mà không chặn luồng chính của ứng dụng.
- Stream và Buffer:
- Để xử lý dữ liệu lớn, mô-đun fs cung cấp các khả năng sử dụng stream (
fs.createReadStream()
vàfs.createWriteStream()
), cho phép bạn xử lý dữ liệu một cách từng phần, giúp tối ưu hóa việc sử dụng bộ nhớ và hiệu suất.
- Để xử lý dữ liệu lớn, mô-đun fs cung cấp các khả năng sử dụng stream (
- Thao Tác với Thư Mục:
- Các hàm như
fs.mkdir()
,fs.readdir()
, vàfs.rmdir()
cho phép bạn tạo, đọc và xóa các thư mục.
- Các hàm như
- Quản Lý Thông Tin Tệp và Thư Mục:
- Hàm
fs.stat()
cung cấp thông tin chi tiết về tệp và thư mục, như kích thước tệp, ngày tạo, và nhiều thông tin khác.
- Hàm
- Xử Lý Lỗi và Ngoại Lệ:
- Trong khi làm việc với I/O tệp, việc xử lý lỗi là quan trọng. Mô-đun fs cung cấp các cơ chế để bắt và xử lý lỗi thông qua callback hoặc promise.
Node.js FS Đọc File
Trong Node.js, mô-đun Hệ thống Tệp (fs) cung cấp các phương thức đồng bộ và không đồng bộ để đọc tệp. Sự khác biệt chính giữa hai phương thức này nằm ở cách chúng xử lý I/O.
Phương thức Không Đồng Bộ
- Phương thức không đồng bộ không chặn việc thực thi chương trình. Khi gọi, Node.js sẽ tiếp tục thực hiện chương trình tiếp theo mà không cần đợi phương thức hoàn thành.
- Khi dữ liệu đã sẵn sàng hoặc có lỗi xảy ra, một hàm gọi lại (callback) được thực thi.
Ví Dụ Đọc File Không Đồng Bộ
File: main.js
var fs = require("fs"); // Đọc file không đồng bộ fs.readFile('input.txt', function (err, data) { if (err) { return console.error(err); } console.log("Asynchronous read: " + data.toString()); });
Trong ví dụ trên, fs.readFile
được sử dụng để đọc file một cách không đồng bộ. Khi dữ liệu được đọc xong, nó sẽ in ra thông tin qua hàm gọi lại.
Phương thức Đồng Bộ
- Phương thức đồng bộ chặn việc thực thi chương trình đến khi hoạt động I/O hoàn thành. Điều này có thể gây cản trở hiệu suất, đặc biệt trong các ứng dụng chạy nhiều hoạt động I/O.
Ví Dụ Đọc File Đồng Bộ
Tiếp tục trong File: main.js
// Đọc file đồng bộ var data = fs.readFileSync('input.txt'); console.log("Synchronous read: " + data.toString()); console.log("Program Ended");
Trong đoạn mã này, fs.readFileSync
được sử dụng để đọc file một cách đồng bộ. Chương trình sẽ chờ cho đến khi file được đọc xong trước khi chuyển sang lệnh tiếp theo.
Chạy Script và So Sánh Kết Quả
Khi chạy script này bằng lệnh node main.js
, bạn sẽ thấy rằng lệnh đọc đồng bộ sẽ hoàn thành trước, sau đó mới đến lệnh đọc không đồng bộ, phản ánh cách Node.js xử lý I/O không đồng bộ.
Sử dụng phương thức không đồng bộ giúp tận dụng tối đa hiệu quả của Node.js, đặc biệt là trong việc xử lý nhiều hoạt động I/O. Nó ngăn chặn việc chương trình bị chặn, cho phép xử lý nhiều tác vụ cùng một lúc.
Node.js mở một file
Trong Node.js, việc mở file là một thao tác quan trọng, thường được thực hiện thông qua mô-đun Hệ thống Tệp (fs). Hãy xem xét cú pháp và các tham số liên quan khi mở file một cách không đồng bộ.
Cú Pháp
fs.open(path, flags[, mode], callback)
- Phương thức
fs.open
cho phép bạn mở file theo các cách khác nhau tùy thuộc vào tham số được cung cấp. Hãy xem xét ý nghĩa của từng tham số:
Giải Thích Tham Số
- path:
- Là một chuỗi chỉ định đường dẫn tới file cần mở.
- Ví dụ:
'./folder/myfile.txt'
chỉ định đến filemyfile.txt
trong thư mụcfolder
.
- flags:
- Các cờ này chỉ định cách file sẽ được mở.
- Ví dụ:
'r'
cho đọc,'w'
cho ghi,'a'
cho ghi tiếp vào cuối file, và nhiều cờ khác. - Các cờ này xác định hành vi của file (như chỉ đọc, chỉ ghi, v.v.).
- mode:
- Chế độ này đặt quyền cho file mới được tạo.
- Nó là một giá trị số, mặc định là
0666
(có nghĩa là file có thể đọc và ghi được). - Chế độ này thường được sử dụng khi tạo file mới.
- callback:
- Đây là một hàm gọi lại (callback) được thực thi sau khi file được mở.
- Callback nhận hai tham số:
err
(lỗi, nếu có) vàfd
(file descriptor, một tham chiếu đến file đã mở).
Ví Dụ Sử Dụng
fs.open('input.txt', 'r', function (err, fd) { if (err) { return console.error(err); } console.log("File opened successfully!"); });
Trong ví dụ trên, fs.open
được sử dụng để mở file input.txt
ở chế độ đọc (‘r’). Callback sẽ xác nhận rằng file đã được mở thành công hoặc thông báo lỗi nếu có.
Tại Sao Sử Dụng Phương Thức Không Đồng Bộ?
- Sử dụng phương thức không đồng bộ giúp đảm bảo rằng thao tác I/O không làm chặn luồng chính của ứng dụng Node.js.
- Điều này rất quan trọng trong việc duy trì hiệu suất cao và khả năng phản hồi của ứng dụng, đặc biệt trong các tình huống cần xử lý nhiều tác vụ cùng một lúc.
Mở file không đồng bộ trong Node.js là một phần cơ bản của việc quản lý và xử lý tệp tin, cho phép các ứng dụng tương tác với hệ thống tệp một cách hiệu quả và linh hoạt.
Flags cho Read/Write
Sau đây là danh sách các cờ cho hoạt động đọc / ghi:
Flag | Description |
r | mở tệp để đọc. một ngoại lệ xảy ra nếu tệp không tồn tại. |
r + | mở tệp để đọc và ghi. một ngoại lệ xảy ra nếu tệp không tồn tại. |
rs | mở tệp để đọc ở chế độ đồng bộ. |
rs + | mở tệp để đọc và ghi, yêu cầu hệ điều hành mở nó đồng bộ. xem ghi chú cho ‘rs’ về việc sử dụng nó một cách thận trọng. |
w | mở tệp để viết. tệp được tạo (nếu nó không tồn tại) hoặc bị cắt bớt (nếu nó tồn tại). |
wx | như ‘w’ nhưng không thành công nếu đường dẫn tồn tại. |
w + | mở tệp để đọc và ghi. tệp được tạo (nếu nó không tồn tại) hoặc bị cắt bớt (nếu nó tồn tại). |
wx + | như ‘w +’ nhưng không thành công nếu đường dẫn tồn tại. |
a | mở tệp để bổ sung. tệp được tạo nếu nó không tồn tại. |
ax | như ‘a’ nhưng không thành công nếu đường dẫn tồn tại. |
a+ | mở tệp để đọc và bổ sung. tệp được tạo nếu nó không tồn tại. |
ax+ | mở tệp để đọc và bổ sung. tệp được tạo nếu nó không tồn tại. |
Tạo tệp JavaScript có tên “main.js” có mã sau để mở tệp input.txt để đọc và ghi.
File: main.js
var fs = require("fs"); // Asynchronous - Opening File console.log("Going to open file!"); fs.open('input.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("File opened successfully!"); });
Mở dấu nhắc lệnh Node.js và chạy main.js:
node main.js
Phương pháp thông tin tệp Node.js
Sau đây là cú pháp của phương thức để lấy thông tin tệp.
fs.stat(path, callback)
Giải thích tham số:
- Path: Đây là chuỗi có tên tệp bao gồm cả đường dẫn.
- Callback: Đây là hàm gọi lại nhận hai đối số (err, stats) trong đó stats là một đối tượng của kiểu fs.Stats.
Phương thức của stats
Method | Description |
stats.isfile () | trả về true nếu loại tệp của một tệp đơn giản. |
stats.isdirectory () | trả về true nếu loại tệp của một thư mục. |
stats.isblockdevice () | trả về true nếu loại tệp của thiết bị khối. |
stats.ischaracterdevice () | trả về true nếu loại tệp của thiết bị ký tự. |
stats.issymboliclink () | trả về true nếu loại tệp của một liên kết tượng trưng. |
stats.isfifo () | trả về giá trị true nếu loại tệp của một loại ngũ cốc. |
stats.issocket () | trả về true nếu loại tệp asocket. |
Hãy lấy một ví dụ để tạo một tệp JavaScript có tên là main.js có mã sau:
File: main.js
var fs = require("fs"); console.log("Going to get file info!"); fs.stat('input.txt', function (err, stats) { if (err) { return console.error(err); } console.log(stats); console.log("Got file info successfully!"); // Check file type console.log("isFile ? " + stats.isFile()); console.log("isDirectory ? " + stats.isDirectory()); });
Bây giờ hãy mở dấu nhắc lệnh Node.js và chạy main.js
node main.js