Node.js - File System

API của Node.js là một công nghệ lập trình phía máy chủ. Do đó, một ứng dụng Node.js có thể cần tương tác với hệ thống tệp vật lý của máy chủ. API của Node.js bao gồm mô-đun fs cho phép nhà phát triển thực hiện các thao tác đọc/ghi trên các tệp đĩa. Mô-đun fs trong Node.js cung cấp các phương thức đồng bộ cũng như không đồng bộ cho việc xử lý tệp.

Để sử dụng các chức năng hệ thống tệp, bạn cần nhập mô-đun fs bằng cách sử dụng cú pháp sau −

var fs = require("fs")

Synchronous vs Asynchronous

Mỗi phương thức trong mô-đun fs đều có phiên bản đồng bộ cũng như không đồng bộ. Các phương thức không đồng bộ lấy tham số cuối cùng là hàm gọi lại (callback) hoàn thành và tham số đầu tiên của hàm gọi lại là lỗi (error).

Ví dụ, phương pháp đồng bộ để ghi dữ liệu vào một tệp là −

fs.writeFileSync(file, data[, options])

Mặt khác, phiên bản không đồng bộ của nó có cú pháp sau −

fs.writeFile(file, data[, options], callback)

Các phương thức bất đồng bộ không chặn trong bản chất so với các phương thức đồng bộ.

Đối với các đoạn mã ví dụ trong chương này, chúng ta sẽ sử dụng một tệp văn bản có tên là input.txt với nội dung sau −

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Writing a file

Chương trình dưới đây cho thấy cách ghi dữ liệu vào một tệp bằng cả phương pháp đồng bộ và không đồng bộ.

const fs = require('fs');
var text = `Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
`;

console.log("Writing synchronously");
fs.writeFileSync("input.txt", text);

console.log("Writing asynchronously");
fs.writeFile('input.txt', text, function (err) { 

   if (err)
      console.log(err);
   else
      console.log('Write operation complete.');
});

Output

Writing synchronously
Writing asynchronously
Write operation complete.

Reading a file

Phương thức ReadFile() trong module fs đọc một tệp không đồng bộ. Nó có cú pháp như sau −

fs.readFile(fileName [,options], callback)

Mặt khác, phương thức ReadFileSync() là phiên bản đồng bộ của nó, với cú pháp như sau −

fs.readFileSync(fileName [,options])

Example

Chương trình sau đọc tệp input.txt một cách đồng bộ cũng như không đồng bộ.

const fs = require('fs');

console.log("Reading synchronously");
data = fs.readFileSync("input.txt");
console.log(data.toString());

console.log("Reading asynchronously");
fs.readFile('input.txt', function (err, data) {
   if (err) {
      return console.error(err);
   }
   console.log("Asynchronous read: " + data.toString());
});
console.log('Read operation complete.');

Output

Reading synchronously
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Reading asynchronously
Read operation complete.
Asynchronous read: Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Open a file

Phương thức readFile() và writeFile() mở và đóng tệp để đọc/ghi một cách ngầm định. Thay vào đó, bạn có thể mở tệp một cách rõ ràng, thiết lập chế độ mở tệp để chỉ định xem có sử dụng nó để đọc hay ghi, và sau đó đóng tệp.

Phương thức open() có chữ ký sau −

fs.open(path, flags[, mode], callback)

Parameters

  • path − Đây là chuỗi có tên tệp bao gồm đường dẫn.

  • flags − Các cờ chỉ ra hành vi của tệp sẽ được mở. Tất cả các giá trị có thể đã được đề cập bên dưới.

  • mode − Nó thiết lập chế độ tệp (quyền và các bit dính), nhưng chỉ nếu tệp được tạo ra. Mặc định là 0666, có thể đọc và ghi.

  • callback − Đây là hàm callback nhận hai tham số (err, fd).

Các giá trị của tham số flag là −

Sr.No. Flag & Description
1 r Open file for reading. An exception occurs if the file does not exist.
2 r+ Open file for reading and writing. An exception occurs if the file does not exist.
3 rs Open file for reading in synchronous mode.
4 rs+ Open file for reading and writing, asking the OS to open it synchronously. See notes for 'rs' about using this with caution.
5 w Open file for writing. The file is created (if it does not exist) or truncated (if it exists).
6 wx Like 'w' but fails if the path exists.
7 w+ Open file for reading and writing. The file is created (if it does not exist) or truncated (if it exists).
8 wx+ Like 'w+' but fails if path exists.
9 a Open file for appending. The file is created if it does not exist.
10 ax Like 'a' but fails if the path exists.
11 a+ Open file for reading and appending. The file is created if it does not exist.
12 ax+ Like 'a+' but fails if the the path exists.

Hãy mở một tệp “input.txt” để ghi dữ liệu vào đó.

const fd = fs.open('input.txt', 'w', (err, fd) => {
   if (err) {
      console.log(err);
      return;
   }
});

Phương thức open() trả về một tham chiếu đến tệp, được gọi là File Descriptor. Một file descriptor là một số nguyên duy nhất và được sử dụng làm đối số cho các phương thức thực hiện các thao tác ghi và đọc.

Phương thức write() trong mô-đun fs lưu dữ liệu vào tệp được tham chiếu bởi bộ mô tả tệp mà phương thức open() trả về.

write(fd, string[, position[, encoding]], callback)

Parameters

  • fd − Mô tả tệp

  • string − dữ liệu sẽ được ghi

  • position − để bắt đầu viết từ Mặc định: null

  • encoding − chuỗi mã hóa ký tự Mặc định: 'utf8'

  • callback − Hàm callback sẽ được gọi.

Đoạn mã sau sẽ ghi văn bản đã cho vào tệp mà chúng ta đã mở ở trên.

var data = `Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
`;

if (err) {
   console.log(err);
   return;
}

Luôn được khuyến nghị đóng tệp đã mở, đặc biệt nếu tệp được mở ở chế độ có thể ghi.

// Close the file
fs.close(fd, (err) => {
   if (err) {
      console.log(err);
      return;
   }
});

Hãy cùng ghép tất cả các đoạn mã này lại thành một chương trình để mở một tệp ở chế độ ghi, ghi một số dữ liệu vào đó và đóng nó lại.

Example

const fs = require('fs');

// Open a file for writing
const fd = fs.open('input.txt', 'w', (err, fd) => {
   if (err) {
      console.log(err);
      return;
   }

   // Write some data to the file
   var data = `Tutorials Point is giving self learning content
   to teach the world in simple and easy way!!!!!
   `;

   fs.write(fd, data, (err) => {
      if (err) {
         console.log(err);
         return;
      }

      // Close the file
      fs.close(fd, (err) => {
         if (err) {
            console.log(err);
            return;
         }

         console.log('The file was written successfully!');
      });
   });
});

Khi được thực thi, chương trình trên sẽ tạo ra file input.txt trong thư mục hiện tại.

Để đọc lại tệp, nó phải được mở ở chế độ đọc. Phương thức read() trong mô-đun fs sử dụng mô tả tệp và lấy dữ liệu trong đó vào một đối tượng bộ đệm.

read(fd, buffer[, options], callback)

Parameters

  • fd − mô tả tệp

  • buffer − Bộ đệm mà dữ liệu sẽ được ghi vào.

  • options − độ lệch, độ dài và vị trí

  • callback − hàm sẽ được gọi.

Để đọc lại dữ liệu trong input.txt, hãy sử dụng phương thức read() như sau −

Example

var fs = require('fs');

fs.open('test.txt', 'r', function (err, fd) {
    
   if (err) {
      return console.error(err);
   }
    
   var buffr = Buffer.alloc(1024);
    
   fs.read(fd, buffr, function (err) {
       
      if (err) throw err;
         else
      console.log(buffr.toString());
   });
        
   // Close the opened file.
   fs.close(fd, function (err) {
      if (err) throw err;
   });
});

Chạy chương trình trên. Nội dung của file input.txt của bạn sẽ được lấy và hiển thị trên bảng điều khiển.

Promises API

Trong một ứng dụng Node.js, có thể có một số lượng lớn các callback lồng nhau nếu cần thực hiện nhiều hoạt động khác nhau một cách bất đồng bộ. Tuy nhiên, mã nguồn có thể trở nên rối rắm, thường được gọi là "callback hell". Để khắc phục vấn đề này, JavaScript đã giới thiệu khái niệm về promises.

Một promise về cơ bản là một cải tiến của các callback thực hiện các tác vụ bất đồng bộ. Nó đại diện cho một hoạt động sẽ được hoàn thành hoặc từ chối. Nếu promise được hoàn thành, nó sẽ được giải quyết; ngược lại, nó sẽ bị từ chối. Các promise, khác với các callback thông thường, có thể được nối chuỗi với nhau.

Trong các phiên bản Node.js sau phiên bản 10, mô-đun fs chứa các phương thức quản lý tệp thực hiện khái niệm promise. (Các phương thức callback và đồng bộ cũng có sẵn).

Các hàm bất đồng bộ mới sử dụng cú pháp async/await. Hàm được tiền tố bằng từ khóa async và nó luôn trả về một promise. Từ khóa await khiến JavaScript chờ cho đến khi promise đó được giải quyết và trả về kết quả của nó.

Phiên bản API Promises của phương thức writeFile() trong mô-đun fs như sau −

fsPromises.writeFile(file, data[, options])

Parameters

  • file − tên tệp hoặc FileHandle

  • data − chuỗi hoặc Buffer. Phương thức này trả về một đối tượng Promise. Nó ghi dữ liệu vào một tệp một cách không đồng bộ, thay thế tệp nếu nó đã tồn tại. dữ liệu có thể là một chuỗi hoặc một buffer.

Chương trình sau sử dụng phương thức writeFile() đã được chuyển đổi thành Promise.

Example

const fs = require("fs");
var data = `Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
`;
async function write_file() {
   await fs.promises.writeFile("input.txt", data);
   console.log("Data written successfully");
}

write_file();

Mặt khác, phương thức readFile() trong API Promises có cú pháp sau −

fsPromises.readFile(path[, options])#

Parameters

  • path − tên tệp hoặc FileHandle

  • các tùy chọn bao gồm encoding, flag, signal

The method returns − một Promise. Nó đọc toàn bộ nội dung của một tệp một cách bất đồng bộ.

Example

const fs = require("fs");

async function read_file() {
   const secret = await fs.promises.readFile("input.txt");
   console.log(secret.toString());
}

read_file();

Để lấy nội dung của tệp (input.txt), hãy lưu đoạn mã trên và chạy từ dòng lệnh.

Get File Information

Syntax

Dưới đây là cú pháp của phương thức để lấy thông tin về một tệp −

fs.stat(path, callback)

Parameters

Dưới đây là mô tả về các tham số được sử dụng −

  • path − Đây là chuỗi có tên tệp bao gồm đường dẫn.

  • callback − Đây là hàm callback nhận hai đối số (err, stats) trong đó stats là một đối tượng của loại fs.Stats được in ra dưới đây trong ví dụ.

Ngoài các thuộc tính quan trọng được in dưới đây trong ví dụ, có một số phương thức hữu ích có sẵn trong lớp fs.Stats có thể được sử dụng để kiểm tra loại tệp. Các phương thức này được trình bày trong bảng sau.

Sr.No. Method & Description
1 stats.isFile() Returns true if file type of a simple file.
2 stats.isDirectory() Returns true if file type of a directory.
3 stats.isBlockDevice() Returns true if file type of a block device.
4 stats.isCharacterDevice() Returns true if file type of a character device.
5 stats.isSymbolicLink() Returns true if file type of a symbolic link.
6 stats.isFIFO() Returns true if file type of a FIFO.
7 stats.isSocket() Returns true if file type of asocket.

Example

Hãy tạo một tệp js có tên main.js với mã sau −

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 chạy main.js để xem kết quả −

$ node main.js

Xác minh đầu ra.

Going to get file info!
{ 
   dev: 1792,
   mode: 33188,
   nlink: 1,
   uid: 48,
   gid: 48,
   rdev: 0,
   blksize: 4096,
   ino: 4318127,
   size: 97,
   blocks: 8,
   atime: Sun Mar 22 2015 13:40:00 GMT-0500 (CDT),
   mtime: Sun Mar 22 2015 13:40:57 GMT-0500 (CDT),
   ctime: Sun Mar 22 2015 13:40:57 GMT-0500 (CDT) 
}
Got file info successfully!
isFile ? true
isDirectory ? false

Closing a File

Syntax

Cú pháp để đóng một tệp đã mở như sau −

fs.close(fd, callback)

Parameters

Dưới đây là mô tả về các tham số được sử dụng −

  • fd − Đây là mô tả tệp được trả về bởi phương thức fs.open() của tệp.

  • callback − Đây là hàm callback. Không có đối số nào khác ngoài một ngoại lệ có thể xảy ra được cung cấp cho hàm callback hoàn thành.

Example

Hãy tạo một tệp js có tên main.js với mã sau −

var fs = require("fs");
var buf = new Buffer(1024);

console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to read the file");
   
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes) {
      if (err) {
         console.log(err);
      }

      // Print only read bytes to avoid junk.
      if(bytes > 0) {
         console.log(buf.slice(0, bytes).toString());
      }

      // Close the opened file.
      fs.close(fd, function(err) {
         if (err) {
            console.log(err);
         } 
         console.log("File closed successfully.");
      });
   });
});

Bây giờ hãy chạy main.js để xem kết quả −

$ node main.js

Xác minh đầu ra.

Going to open an existing file
File opened successfully!
Going to read the file
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

File closed successfully.

Truncate a File

Syntax

Dưới đây là cú pháp của phương thức để cắt ngắn một tệp đã mở −

fs.ftruncate(fd, len, callback)

Parameters

Dưới đây là mô tả về các tham số được sử dụng −

  • fd − Đây là mô tả tệp được trả về bởi fs.open().

  • len − Đây là độ dài của tệp sau đó tệp sẽ bị cắt ngắn.

  • callback − Đây là hàm callback. Không có đối số nào khác ngoài một ngoại lệ có thể xảy ra được cung cấp cho hàm callback hoàn thành.

Example

Hãy tạo một tệp js có tên main.js với mã sau −

var fs = require("fs");
var buf = new Buffer(1024);

console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to truncate the file after 10 bytes");
   
   // Truncate the opened file.
   fs.ftruncate(fd, 10, function(err) {
      if (err) {
         console.log(err);
      } 
      console.log("File truncated successfully.");
      console.log("Going to read the same file"); 
      
      fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
         if (err) {
            console.log(err);
         }

         // Print only read bytes to avoid junk.
         if(bytes > 0) {
            console.log(buf.slice(0, bytes).toString());
         }

         // Close the opened file.
         fs.close(fd, function(err) {
            if (err) {
               console.log(err);
            } 
            console.log("File closed successfully.");
         });
      });
   });
});

Bây giờ hãy chạy main.js để xem kết quả −

$ node main.js

Xác minh đầu ra.

Going to open an existing file
File opened successfully!
Going to truncate the file after 10 bytes
File truncated successfully.
Going to read the same file
Tutorials 
File closed successfully.

Delete a File

Syntax

Dưới đây là cú pháp của phương thức để xóa một tệp −

fs.unlink(path, callback)

Parameters

Dưới đây là mô tả về các tham số được sử dụng −

  • path − Đây là tên file bao gồm đường dẫn.

  • callback − Đây là hàm callback. Không có đối số nào khác ngoài một ngoại lệ có thể xảy ra được cung cấp cho hàm callback hoàn thành.

Example

Hãy tạo một tệp js có tên main.js với mã sau −

var fs = require("fs");

console.log("Going to delete an existing file");
fs.unlink('input.txt', function(err) {
   if (err) {
      return console.error(err);
   }
   console.log("File deleted successfully!");
});

Bây giờ hãy chạy main.js để xem kết quả −

$ node main.js

Xác minh đầu ra.

Going to delete an existing file
File deleted successfully!

Create a Directory

Syntax

Dưới đây là cú pháp của phương thức để tạo một thư mục −

fs.mkdir(path[, mode], callback)

Parameters

Dưới đây là mô tả về các tham số được sử dụng −

  • path − Đây là tên thư mục bao gồm đường dẫn.

  • mode − Đây là quyền truy cập thư mục cần được thiết lập. Mặc định là 0777.

  • callback − Đây là hàm callback. Không có đối số nào khác ngoài một ngoại lệ có thể xảy ra được cung cấp cho hàm callback hoàn thành.

Example

Hãy tạo một tệp js có tên main.js với mã sau −

var fs = require("fs");

console.log("Going to create directory /tmp/test");
fs.mkdir('/tmp/test',function(err) {
   if (err) {
      return console.error(err);
   }
   console.log("Directory created successfully!");
});

Bây giờ hãy chạy main.js để xem kết quả −

$ node main.js

Xác minh đầu ra.

Going to create directory /tmp/test
Directory created successfully!

Read a Directory

Syntax

Dưới đây là cú pháp của phương thức để đọc một thư mục −

fs.readdir(path, callback)

Parameters

Dưới đây là mô tả về các tham số được sử dụng −

  • path − Đây là tên thư mục bao gồm đường dẫn.

  • callback − Đây là hàm callback nhận hai tham số (err, files) trong đó files là một mảng chứa tên của các tệp trong thư mục, không bao gồm '.' và '..'.

Example

Hãy tạo một tệp js có tên main.js với mã sau −

var fs = require("fs");

console.log("Going to read directory /tmp");
fs.readdir("/tmp/",function(err, files) {
   if (err) {
      return console.error(err);
   }
   files.forEach( function (file) {
      console.log( file );
   });
});

Bây giờ hãy chạy main.js để xem kết quả −

$ node main.js

Xác minh đầu ra.

Going to read directory /tmp
ccmzx99o.out
ccyCSbkF.out
employee.ser
hsperfdata_apache
test
test.txt

Remove a Directory

Syntax

Dưới đây là cú pháp của phương thức để xóa một thư mục −

fs.rmdir(path, callback)

Parameters

Dưới đây là mô tả về các tham số được sử dụng −

  • path − Đây là tên thư mục bao gồm đường dẫn.

  • callback − Đây là hàm callback. Không có đối số nào khác ngoài một ngoại lệ có thể xảy ra được cung cấp cho hàm callback hoàn thành.

Example

Hãy tạo một tệp js có tên main.js với mã sau −

var fs = require("fs");

console.log("Going to delete directory /tmp/test");
fs.rmdir("/tmp/test",function(err) {
   if (err) {
      return console.error(err);
   }
   console.log("Going to read directory /tmp");
   
   fs.readdir("/tmp/",function(err, files) {
      if (err) {
         return console.error(err);
      }
      files.forEach( function (file) {
         console.log( file );
      });
   });
});

Bây giờ hãy chạy main.js để xem kết quả −

$ node main.js

Xác minh đầu ra.

Going to read directory /tmp
ccmzx99o.out
ccyCSbkF.out
employee.ser
hsperfdata_apache
test.txt

Methods Reference