Node.js - 文件系统


Node 使用标准 POSIX 函数的简单包装器来实现文件 I/O。可以使用以下语法导入节点文件系统(fs)模块 -

var fs = require("fs")

同步与异步

fs 模块中的每个方法都有同步和异步形式。异步方法将最后一个参数作为完成函数回调,将回调函数的第一个参数作为错误。最好使用异步方法而不是同步方法,因为前者在程序执行期间不会阻塞程序,而后者会阻塞程序。

例子

创建一个名为input.txt的文本文件,其中包含以下内容 -

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

让我们使用以下代码创建一个名为main.js的 js 文件 -

var fs = require("fs");

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

// Synchronous read
var data = fs.readFileSync('input.txt');
console.log("Synchronous read: " + data.toString());

console.log("Program Ended");

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

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

Program Ended
Asynchronous read: Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

本章的以下部分提供了一组有关主要文件 I/O 方法的好示例。

打开文件

句法

以下是以异步模式打开文件的方法的语法 -

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

参数

这是所使用参数的描述 -

  • path - 这是包含路径的文件名的字符串。

  • flags - 标志指示要打开的文件的Behave。下面提到了所有可能的值。

  • mode - 它设置文件模式(权限和粘性位),但前提是文件已创建。默认为0666,可读可写。

  • 回调- 这是获取两个参数(err,fd)的回调函数。

旗帜

读/写操作的标志是 -

先生。 标志和描述
1

r

打开文件进行读取。如果文件不存在,则会发生异常。

2

r+

打开文件进行读取和写入。如果文件不存在,则会发生异常。

3

RS

打开文件以同步模式读取。

4

RS+

打开文件进行读写,要求操作系统同步打开。有关谨慎使用此选项的信息,请参阅“rs”的注释。

5

w

打开文件进行写入。文件被创建(如果不存在)或截断(如果存在)。

6

wx

与“w”类似,但如果路径存在则失败。

7

瓦+

打开文件进行读取和写入。文件被创建(如果不存在)或截断(如果存在)。

8

wx+

与“w+”类似,但如果路径存在则失败。

9

A

打开文件进行追加。如果文件不存在,则创建该文件。

10

斧头

与 'a' 类似,但如果路径存在则失败。

11

一个+

打开文件进行读取和追加。如果文件不存在,则创建该文件。

12

斧头+

与“a+”类似,但如果路径存在则失败。

例子

让我们创建一个名为main.js的 js 文件,其中包含以下代码来打开文件 input.txt 进行读写。

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!");     
});

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

Going to open file!
File opened successfully!

获取文件信息

句法

以下是获取文件信息的方法的语法 -

fs.stat(path, callback)

参数

这是所使用参数的描述 -

  • path - 这是包含路径的文件名的字符串。

  • 回调- 这是回调函数,它获取两个参数(err,stats),其中stats是 fs.Stats 类型的对象,在下面的示例中打印。

除了下面示例中打印的重要属性之外,fs.Stats类中还有几个有用的方法可用于检查文件类型。下表给出了这些方法。

先生。 方法及说明
1

统计数据.isFile()

如果文件类型为简单文件,则返回 true。

2

stats.isDirectory()

如果目录的文件类型返回 true。

3

stats.isBlockDevice()

如果文件类型为块设备,则返回 true。

4

stats.isCharacterDevice()

如果文件类型为字符设备,则返回 true。

5

stats.isSymbolicLink()

如果文件类型为符号链接,则返回 true。

6

统计数据.isFIFO()

如果文件类型为 FIFO,则返回 true。

7

统计.isSocket()

如果文件类型为 asocket,则返回 true。

例子

让我们使用以下代码创建一个名为main.js的 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());    
});

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

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

写入文件

句法

以下是写入文件的方法之一的语法 -

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

如果文件已存在,此方法将覆盖该文件。如果您想写入现有文件,那么您应该使用另一种可用的方法。

参数

这是所使用参数的描述 -

  • path - 这是包含路径的文件名的字符串。

  • data - 这是要写入文件的字符串或缓冲区。

  • options - 第三个参数是一个包含{encoding,mode,flag}的对象。默认情况下。编码为 utf8,模式为八进制值 0666。标志为 'w'

  • 回调- 这是回调函数,它获取单个参数 err,在发生任何写入错误时返回错误。

例子

让我们创建一个名为main.js的 js 文件,其中包含以下代码 -

var fs = require("fs");

console.log("Going to write into existing file");
fs.writeFile('input.txt', 'Simply Easy Learning!', function(err) {
   if (err) {
      return console.error(err);
   }
   
   console.log("Data written successfully!");
   console.log("Let's read newly written data");
   
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("Asynchronous read: " + data.toString());
   });
});

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

Going to write into existing file
Data written successfully!
Let's read newly written data
Asynchronous read: Simply Easy Learning!

读取文件

句法

以下是从文件读取的方法之一的语法 -

fs.read(fd, buffer, offset, length, position, callback)

该方法将使用文件描述符来读取文件。如果您想直接使用文件名读取文件,那么您应该使用另一种可用的方法。

参数

这是所使用参数的描述 -

  • fd - 这是 fs.open() 返回的文件描述符。

  • buffer - 这是数据将被写入的缓冲区。

  • offset - 这是缓冲区中开始写入的偏移量。

  • length - 这是一个整数,指定要读取的字节数。

  • position - 这是一个整数,指定从文件中的位置开始读取。如果position为空,则从当前文件位置读取数据。

  • 回调- 这是获取三个参数(err、bytesRead、buffer)的回调函数。

例子

让我们使用以下代码创建一个名为main.js的 js 文件 -

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);
      }
      console.log(bytes + " bytes read");
      
      // Print only read bytes to avoid junk.
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

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

关闭文件

句法

以下是关闭打开的文件的语法 -

fs.close(fd, callback)

参数

这是所使用参数的描述 -

  • fd - 这是由 file fs.open() 方法返回的文件描述符。

  • 回调- 这是回调函数,除了可能的异常之外,不会向完成回调提供任何参数。

例子

让我们创建一个名为main.js的 js 文件,其中包含以下代码 -

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.");
      });
   });
});

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

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.

截断文件

句法

以下是截断打开文件的方法的语法 -

fs.ftruncate(fd, len, callback)

参数

这是所使用参数的描述 -

  • fd - 这是 fs.open() 返回的文件描述符。

  • len - 这是文件的长度,之后文件将被截断。

  • 回调- 这是回调函数,除了可能的异常之外,不会向完成回调提供任何参数。

例子

让我们创建一个名为main.js的 js 文件,其中包含以下代码 -

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.");
         });
      });
   });
});

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

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.

删除文件

句法

以下是删除文件方法的语法 -

fs.unlink(path, callback)

参数

这是所使用参数的描述 -

  • path - 这是包含路径的文件名。

  • 回调- 这是回调函数,除了可能的异常之外,不会向完成回调提供任何参数。

例子

让我们创建一个名为main.js的 js 文件,其中包含以下代码 -

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!");
});

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

Going to delete an existing file
File deleted successfully!

创建目录

句法

以下是创建目录的方法的语法 -

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

参数

这是所使用参数的描述 -

  • path - 这是包含路径的目录名称。

  • mode - 这是要设置的目录权限。默认为 0777。

  • 回调- 这是回调函数,除了可能的异常之外,不会向完成回调提供任何参数。

例子

让我们创建一个名为main.js的 js 文件,其中包含以下代码 -

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!");
});

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

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

阅读目录

句法

以下是读取目录的方法的语法 -

fs.readdir(path, callback)

参数

这是所使用参数的描述 -

  • path - 这是包含路径的目录名称。

  • 回调- 这是回调函数,它获取两个参数(错误,文件),其中文件是目录中不包括“.”的文件名称的数组。和 '..'。

例子

让我们创建一个名为main.js的 js 文件,其中包含以下代码 -

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 );
   });
});

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

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

删除目录

句法

以下是删除目录的方法的语法 -

fs.rmdir(path, callback)

参数

这是所使用参数的描述 -

  • path - 这是包含路径的目录名称。

  • 回调- 这是回调函数,除了可能的异常之外,不会向完成回调提供任何参数。

例子

让我们创建一个名为main.js的 js 文件,其中包含以下代码 -

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 );
      });
   });
});

现在运行 main.js 来查看结果 -

$ node main.js

验证输出。

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

方法参考