📜  Node.js 文件系统

📅  最后修改于: 2022-05-13 01:56:25.124000             🧑  作者: Mango

Node.js 文件系统

Node.js 是基于 Chrome 的 V8 JavaScript 引擎构建的 JavaScript 运行时。 Node.js 帮助开发人员编写 JavaScript 代码以在服务器端运行,生成动态内容并交付给 Web 客户端。

让 Node.js 脱颖而出的两个特性是:

  • 事件驱动
  • 非阻塞 I/O 模型

关于 Node.js 文件系统:为了处理创建、读取、删除等文件操作,Node.js 提供了一个名为 FS(文件系统)的内置模块。 Node.js 通过提供标准 POSIX 函数的包装器来提供文件 I/O 的功能。根据用户要求,所有文件系统操作都可以具有同步和异步形式。

要使用此文件系统模块,请使用 require() 方法:

var fs = require('fs');

文件系统模块的常见用途:

  • 读取文件
  • 写文件
  • 附加文件
  • 关闭文件
  • 删除文件

什么是同步和异步方法?

  • 同步方法:它们被称为阻塞函数,因为它等待每个操作完成,然后才执行下一个操作,因此阻塞下一个命令的执行,即除非查询已完成执行,否则不会执行命令直到 &从以前的命令中获取所有结果。
  • 异步方法:它们被称为非阻塞函数,因为它从不等待每个操作完成,而是在第一次执行时自行执行所有操作。每个操作的结果将在结果可用后处理,即每个命令将在前一个命令执行后立即执行。上一个命令在后台运行并在完成数据处理后加载结果。
  • 用例:
    • 如果您的操作没有像从数据库中查询大量数据那样做非常繁重的工作,那么请继续使用同步方式,否则使用异步方式。
    • 以异步方式,您可以向用户显示一些进度指示器,而在后台您可以继续您的重量级工作。这是基于 GUI 的应用程序的理想方案。
  • 异步和同步示例:创建一个名为input.txt的文本文件,其内容如下:
    GeeksforGeeks: A computer science portal

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

    输出:

    Asynchronous read: GeeksforGeeks: A computer science portal
    var fs = require("fs");
      
    // Synchronous read
    var data = fs.readFileSync('input.txt');
    console.log("Synchronous read: " + data.toString());
    

    输出:

    Synchronous read: GeeksforGeeks: A computer science portal

打开文件: fs.open() 方法用于创建、读取或写入文件。 fs.readFile() 方法仅用于读取文件, fs.writeFile() 方法仅用于写入文件,而 fs.open() 方法对文件执行多项操作。首先,我们需要加载 fs 类,它是一个访问物理文件系统的模块。

句法:

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

参数:

  • 路径:它保存要读取的文件的名称,或者如果存储在其他位置,则保存整个路径。
  • flags:标志指示要打开的文件的行为。所有可能的值是 (r, r+, rs, rs+, w, wx, w+, wx+, a, ax, a+, ax+)。
  • mode:设置文件的模式,即r-read、w-write、r+-readwrite。它设置为默认为读写。
    • 打回来:

    它是读取文件后调用的回调函数。它需要两个参数:

  • err:如果发生任何错误。
  • 数据:文件的内容。它在执行打开操作后调用。

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

var fs = require("fs");
  
// Asynchronous - Opening File
console.log("opening file!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File open successfully");     
});

输出:

opening file!
File open successfully

读取文件: fs.read() 方法用于读取 fd 指定的文件。此方法将整个文件读入缓冲区。

句法:

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

参数:

  • fd:这是 fs.open() 方法返回的文件描述符。
  • 缓冲区:这是数据将被写入的缓冲区。
  • offset:这是缓冲区中开始写入的偏移量。
  • 长度:这是一个整数,指定要读取的字节数。
  • 位置:这是一个整数,指定从文件中开始读取的位置。如果位置为空,将从当前文件位置读取数据。
  • callback:读取文件后调用的回调函数。它需要两个参数:
    • err:如果发生任何错误。
    • 数据:文件的内容。

示例:让我们创建一个名为main.js的 js 文件,其代码如下:

var fs = require("fs");
var buf = new Buffer(1024);
  
console.log("opening an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("reading 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());
      }
   });
});

输出:

opening an existing file
File opened successfully!
reading the file
GeeksforGeeks: A computer science portal

写入文件:如果文件已经存在,此方法将覆盖文件。 fs.writeFile() 方法用于将指定的数据异步写入文件。默认情况下,如果文件存在,将被替换。 'options' 参数可用于修改方法的功能。

句法:

fs.writeFile(path, data, options, callback)

参数:

  • 路径:它是一个字符串、缓冲区、URL 或文件描述整数,表示必须写入的文件的路径。使用文件描述符将使其行为类似于 fs.write() 方法。
  • 数据:它将写入文件的字符串、缓冲区、TypedArray 或 DataView。
  • options:它是一个字符串或对象,可用于指定将影响输出的可选参数。它具有三个可选参数:
    • encoding:它是一个字符串值,指定文件的编码。默认值为“utf8”。
    • mode:它是一个整数值,指定文件模式。默认值为 0o666。
    • flag:它是一个字符串值,指定写入文件时使用的标志。默认值为“w”。
  • callback:方法执行时调用的函数。
    • err:如果操作失败将抛出的错误。

示例:让我们创建一个名为main.js的 js 文件,其代码如下:

var fs = require("fs");
  
console.log("writing into existing file");
fs.writeFile('input.txt', 'Geeks For Geeks', 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());
   });
});

输出:

writing into existing file
Data written successfully!
Let's read newly written data
Asynchronous read: Geeks For Geeks

追加到文件: fs.appendFile() 方法用于将数据同步追加到文件中。

句法:

fs.appendFile(filepath, data, options, callback);

或者

fs.appendFileSync(filepath, data, options);

参数:

  • filepath:它是一个字符串,指定文件路径。
  • 数据:它是强制性的,它包含您附加到文件的数据。
  • options:它是一个可选参数,指定编码/模式/标志。
  • 回调:函数是强制性的,在将数据附加到文件完成时调用。

示例 1:让我们创建一个名为main.js的 js 文件,其代码如下:

var fs = require('fs');
   
var data = "\nLearn Node.js";
   
// Append data to file
fs.appendFile('input.txt', data, 'utf8',
  
    // Callback function
    function(err) { 
        if (err) throw err;
  
        //  If no error
        console.log("Data is appended to file successfully.")
});

输出:

Data is appended to file successfully.

示例 1:用于同步追加

var fs = require('fs');
   
var data = "\nLearn Node.js";
   
// Append data to file
fs.appendFileSync('input.txt', data, 'utf8');
console.log("Data is appended to file successfully.")

输出:

Data is appended to file successfully.
  • 在将数据附加到 input.txt 文件之前:
    GeeksforGeeks: A computer science portal 
  • 将数据附加到 input.txt 文件后:
    GeeksforGeeks: A computer science portal
    Learn Node.js

关闭文件: fs.close() 方法用于异步关闭给定的文件描述符,从而清除与其关联的文件。这将允许文件描述符被重用于其他文件。在文件描述符上调用 fs.close() 时正在对其执行一些其他操作可能会导致未定义的行为。

句法:

fs.close(fd, callback)

参数:

  • fd:它是一个整数,表示要关闭的文件的文件描述符。
  • 回调:它是一个在方法执行时将被调用的函数。
    • err:如果方法失败会抛出一个错误。

示例:让我们创建一个名为main.js的 js 文件,其代码如下:

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

输出:

File closed successfully.

删除文件: fs.unlink() 方法用于从文件系统中删除文件或符号链接。此函数不适用于目录,因此建议使用 fs.rmdir() 删除目录。

句法:

fs.unlink(path, callback)

参数:

  • 路径:它是一个字符串、缓冲区或 URL,表示必须删除的文件或符号链接。
  • 回调:它是一个在方法执行时将被调用的函数。
    • err:如果方法失败会抛出一个错误。

示例:让我们创建一个名为main.js的 js 文件,其代码如下:

var fs = require("fs");
  
console.log("deleting an existing file");
fs.unlink('input.txt', function(err) {
   if (err) {
      return console.error(err);
   }
   console.log("File deleted successfully!");
});

输出:

deleting an existing file
File deleted successfully!