目录
一:如何读整个文件内容?
二:如何写入整个文件内容?
三:如何在文件中的指定位置处读入内容?
四:如何在文件中的指定位置处写入内容?
五:如何创建与读取目录?
六:如何查看与修改文件或目录的信息?
首页 web前端 前端问答 nodejs中哪个模块提供文件操作api

nodejs中哪个模块提供文件操作api

Nov 10, 2021 am 11:59 AM
nodejs 文件操作

在nodejs中,文件系统模块提供文件操作api。文件系统模块(简称fs模块)允许用户访问计算机上的文件系统并与之交互;使用fs模块可以实现文件及目录的创建,写入、删除等操作。

nodejs中哪个模块提供文件操作api

本教程操作环境:windows7系统、nodejs 12.19.0版,DELL G3电脑。

一:如何读整个文件内容?

注意:读取文件和写入文件可能理解很枯燥,但是我每次学习这样的文章的时候都是为了下一篇文章做好准备的,因为我下一篇文章的demo需要使用到该方面的知识,所以我就会把需要的理解的知识统统记录一遍的。

在Node.js中,使用fs模块来实现所有文件及目录的创建,写入及删除操作。

1、读文件的方法:

在执行读文件操作时,可以使用readFile方法与readFileSync方法读取文件,有Sync等字样的是同步方法,没有这个字样的是异步方法读取,同步方法和异步方法的区别是:同步方法立即返回操作的结果,先看下相关的API:

1)readFileSync同步读取文件API

使用方法读取如下:

fs.readFileSync(filename, [options]);
登录后复制

filename参数:用于指定读取文件的完整文件路径及文件名。

options参数:该值为一个对象,它可以指定读取文件时使用flag属性指定该文件采取什么操作,默认为 'r'; 可以指定值有如下:

  • 'r': 读取文件,如果文件不存在会抛出异常。

  • 'r+': 读取并写入文件,如果文件不存在会抛出异常。

  • 'rs': 同步方式读取文件并且通知操作系统忽略本地文件系统的缓存,如果文件不存在会抛出异常。

  • 'w': 写入文件,如果文件不存在则创建该文件,如果文件已存在则清空文件内容。

  • 'w+': 读取并写入文件,其他功能和 'w'一样。

  • 'a': 追加写入文件,如果文件不存在则创建该文件。

  • 'a+': 读取并追加写入文件,文件不存在就创建文件。

在options参数中,我们可以使用 encoding属性指定使用何种编码格式来读取该文件,属性值有 'utf-8', 'ascii', 'base64', 下面先看看简单的demo。如下所示:

先看下目录结构如下:

### 目录结构如下:
demo1                                       # 工程名
|   |--- readFile                           # 读取文件的文件夹            
|   | |-- index.html                        # html文件
|   | |-- index.js                          # js文件
|   | |-- package.json          
|   | |-- node_modules
登录后复制

如下代码读取文件代码:

const fs = require('fs');
try {
  const data = fs.readFileSync('./index.html', 'utf-8');
  // 等待操作结果返回,然后打印结果
  console.log(data);
} catch(e) {
  console.log('读取文件发生错误');
}
登录后复制

在命令行中执行 node index.js 然后打印结果如下:

2) 异步读取文件的API使用方法如下:

fs.readFile(filename, [options], callback);
登录后复制

filename 和 options 和 同步方法的参数是一样的。

callback参数 是用于文件读取完后执行的回调函数。如下代码所示:

const fs = require('fs');
fs.readFile('./index.html', 'utf-8', (err, data) => {
  if (err) {
    console.log('读取文件时发生错误');
  } else {
    console.log(data);
  }
});
登录后复制

执行的结果和上面是一样的。这里就不截图了。

二:如何写入整个文件内容?

写入文件,我们使用fs模块中的 writeFile 方法 或 wirteFileSync方法。writeFile使用方法如下(wirteFileSync方法类似,无非没有callback参数):

fs.writeFile(filename, data, [options], callback);
登录后复制

filename参数 为指定需要被写入文件的完整路径及文件名。

data参数 为指定需要写入的内容,值可以是一个字符串或一个Buffer对象,该字符串或缓冲区中的内容将被完整地写入到文件中。

options值为一个对象(可选),选项名为flag,它有如下选项值:

  • 'flag': 用于指定该文件采取何种操作,默认值为 'w', 含义是写入文件。该指定项所有值和上面readFile的值是一样的。
    (文件不存在就创建该文件,文件存在时重写该文件)。

  • 'mode': 该属性用于指定当文件被打开时对该文件的读写权限。默认值为 0666(可读写)。还有很多值自己可以百度了解下。

  • 'encoding': 用于指定使用何种编码格式来写入该文件。可指定属性值为 'utf8'、'ascii'、'base64'。

  • callback: 该参数用于文件读取完毕时执行的回调函数。

下面我们简单的做一个demo,在我们目录下的 index.js 文件中编写代码,在该目录下创建一个 message.txt文件并写入两行文字。如下代码:

const fs = require('fs');
const str = '这是第一行。\r\n这是第二行';
fs.writeFile('./message.txt', str, (err) => {
  if (err) {
    console.log('写入文件操作失败');
  } else {
    console.log('写入文件操作成功');
  }
});
登录后复制

如下图执行命令:

在目录下会生成 message.txt文件,如下图

然后我们打开文件,会看到其写入的内容。

2)写入buffer对象,如下代码:

const fs = require('fs');
const str = new Buffer('我喜爱编程');
fs.writeFile('./message.txt', str, (err) => {  if (err) {
    console.log('写入文件操作失败');
  } else {
    console.log('写入文件操作成功');
  }
});
登录后复制

在message.txt中可以看到 '我喜爱编程' 几个字。

3)设置options参数flag属性选项,比如追加数据这些,如下代码:

const fs = require('fs');
const options = {
  flag: 'a'};
fs.writeFile('./message.txt', '这是追加的数据', options, (err) => {  if (err) {
    console.log('写入文件操作失败');
  } else {
    console.log('写入文件操作成功');
  }
});
登录后复制

message.txt内容编程如下了:我喜爱编程这是追加的数据

4)复制图片文件

我们可以通过readFile方法读取应用程序对应目录下的一个图片文件,在读取文件时使用base64编码,在该回调函数中使用writeFile方法,在该方法中使用base64编码将读取到的图片文件数据复制到另一个图片文件中。如下代码:

const fs = require('fs');

fs.readFile('./images/1.png', 'base64', (err, data) => {
  fs.writeFile('./images/xx.png', data.toString(), 'base64', (err) => {    if (err) {
      console.log('写文件操作失败');
    } else {
      console.log('写文件操作成功');
    }
  });
});
登录后复制

在image下有一个 1.png, 它会先复制,然后写入 xx.png中(该文件之前不存在的,会创建该图片文件)。

三:如何在文件中的指定位置处读入内容?

3.1)打开文件open方法或openSync方法

要实现在文件中的指定位置处读入内容,首先我们需要打开该文件,fs模块中的open方法或openSync方法打开文件。open方法使用方式如下所示:

fs.open(filename, flags, [mode], callback);
登录后复制

前三个参数和readFile的参数是一个意思的。最后一个参数是执行完成后的回调函数。该回调函数有两个参数,第一个是打开文件失败时的错误对象,第二个参数为一个整数值,代表打开文件时返回的文件描述符。

下面我们来打开我们刚刚创建的 message.txt文件,如下代码:

const fs = require('fs');

fs.open('./message.txt', 'r', (err, fd) => {
  console.log(fd);
});
登录后复制

执行结果如下所示:

3.2)从指定的位置读取文件

如上面打开文件之后,我们可以在其回调函数使用fs模块中的read方法或readSync方法从文件的指定位置处读取文件,也可以使用fs模块中的write方法或writeSync方法从文件中指定处写入数据。

fs.read(fd, buffer, offset, length, position, callback);
登录后复制

fd参数是 上面open打开文件返回的文件描述符。

buffer参数 是一个buffer对象,用于指定将文件数据读取到那个缓存区中。

offset:用于指定向缓冲区中写入数据的开始位置。

length:用于指定从文件中读取的字节数。

position: 用于指定读取文件时的开始位置。

callback:用于指定文件操作完毕时的回调函数。如下所示:

function(err, bytesRead, buffer) {}
登录后复制
  • err: 为操作失败时的错误对象。

  • bytesRead: 代表实际读取的字节数。

  • buffer:为被读取的缓冲区对象。

下面我们来看个demo代码如下:

const fs = require('fs');
// message.txt 内容为:我喜爱编程这是追加的数据
fs.open('./message.txt', 'r', (err, fd) => {
  const buf = new Buffer(255);
  // 一个汉字的utf编码为三个字节数据
  fs.read(fd, buf, 0, 9, 3, (err, bytesRead, buffer) => {
    console.log(buffer.slice(0, bytesRead).toString()); // 喜爱编  });
});
登录后复制

如上代码message.txt内容为:我喜爱编程这是追加的数据,position为3,从第三个字节开始读取文件,然后长度为9个字节,一个汉字3个字节,因此结果为 '喜爱编';

四:如何在文件中的指定位置处写入内容?

在文件被打开后,可以使用fs模块中的write方法或writeSync方法从一个缓存区中读取数据并从文件的指定位置处写入这些数据。使用方法如下所示:

fs.write(fd, buffer, offset, length, position, callback);
登录后复制

fd参数为描述符。

buffer参数为一个Buffer对象,用于指定从哪个缓存区中读取数据。

offset参数用于指定从缓存区中读取数据时的开始读取位置。

length参数用于指定从缓存区中读取的字节数。

position参数值用于指定写入文件时的开始位置。

callback参数用于指定文件写入操作执行完毕时的回调函数。该回调函数如下:

function(err, written, buffer) {}
登录后复制
  • err参数为写入失败时的错误对象。

  • written: 代表被写入的字节数。

  • buffer: 代表被读取的缓冲区对象。

下面是一个简单的demo,如下所示:

const fs = require('fs');

const buf = new Buffer('我喜爱编程');

fs.open('./message.txt', 'w', (err, fd) => {
  fs.write(fd, buf, 3, 9, 0, (err, written, buffer) => {    if (err) {
      console.log('写文件操作失败');
    } else {
      console.log('写文件操作成功');
    }
  });
});
登录后复制

在message.txt中显示为 喜爱编 这三个字。

五:如何创建与读取目录?

5.1) 创建目录mkdir和mkdirSync方法

在fs模块中,可以使用mkdir方法创建目录,该方法使用方式如下所示:

fs.mkdir(path, [mode], callback);
登录后复制
  • path参数用于指定需要被创建的目录完整路径及目录名。

  • mode参数用于指定该目录的权限,默认值为0777(表示任何人可读写该目录)。

  • callback是回调函数。

下面是一个简单的demo,如下所示:

const fs = require('fs');

fs.mkdir('./test', (err) => {  if (err) {
    console.log('创建目录操作失败');
  } else {
    console.log('创建目录操作成功');
  }
});
登录后复制

如下所示:

5.2)读取目录readdir和readdirSync方法

在fs模块中,使用readdir方法读取目录,该方法使用如下所示

fs.readdir(path, callback);
登录后复制

path参数用于指定需要被读取的目录的完整路径及目录名。

callback参数用于指定读取目录操作的回调函数。该回调函数如下所示:

function(err, file) {}
登录后复制
  • err 为读取目录操作失败的回调函数。

  • file参数值为一个数组,读取到的文件中的所有文件名。

如下demo所示:

const fs = require('fs');

fs.readdir('./', (err, files) => {  if (err) {
    console.log('读取目录操作失败');
  } else {
    console.log(files);
  }
});
登录后复制

如下图所示:

六:如何查看与修改文件或目录的信息?

6.1)查看文件或目录的信息

在fs模块中,可以使用stat方法或lstat方法查看一个文件或目录的信息。这两个方法唯一的区别是当查看符号链接文件的信息
时,必须使用lstat方法。使用方法如下所示:

fs.stat(path, callback);
fs.lstat(path, callback);
登录后复制

path参数用于被查看的文件或目录的完整路径及文件名或目录名。

callback是回调函数。如下回调函数

function(err, stats) {}
登录后复制
  • err 参数值为查看文件或目录信息操作失败时触发的错误对象。

  • stats参数值为一个 fs.Stats对象,该对象有如下一些方法,在这些方法中不包含任何参数。

isFile: 用于判断被查看的对象是否为一个文件,如果是则返回true,否则的话返回false。

isDirectory: 用于判断被查看的对象是否为一个目录,如果是的话返回true,否则的话返回false。

还有很多很多其他的方法,这里不一一介绍,用的比较少,有需要的话,可以自己百度一下看看。

下面是使用 stat的使用demo,查看应用程序根目录下的 message.txt文件并且在回调函数中的第二个参数值 fs.Stats对象在控制台中的输出有哪些?

const fs = require('fs');

fs.stat('./message.txt', (err, stats) => {
  console.log(stats);
});
登录后复制

如下图所示显示:

6.2)检查文件或目录是否存在exists和existsSync方法

在fs模块中,可以使用exists方法检查一个文件或目录是否存在,该方法使用方式如下所示:

fs.exists(path, callback);
登录后复制

path参数:用于指定需要被检查的文件或目录的完整路径。
callback: 是回调函数,该回调函数如下所示:

function(exists) {}
登录后复制
  • exists参数,当文件或目录存在时,该参数值为true,否则的话,该参数值为false。

下面是一个简单的demo,如下代码所示:

const fs = require('fs');

// 该目录是存在的
fs.exists('./message.txt', (exists) => {
  console.log(exists); // true
});

// 该目录是不存在的
fs.exists('./message2.txt', (exists) => {
  console.log(exists); // false
});
登录后复制

6.3) 获取文件或目录的绝对路径realpath和realpathSync方法

在fs模块中,可以使用 realpath方法获取一个文件或目录的绝对路径,该方法使用如下所示:

fs.realpath(path, [cache], callback);
登录后复制
  • cache 参数是可选的,path和callback是必须的。

  • path参数为需要查看的文件或目录的完整路径。

  • cache参数为一个对象,其中存放了一些预先指定的路径。具体的百度下,这个参数用的不多。

  • callback是回调函数,该回调函数有2个参数,err参数值为获取目录的绝对路径失败的错误对象。resolvedPath参数值为获取
    到的文件或目录的绝对路径。

下面是一个简单的demo,如下所示:

const fs = require('fs');

fs.realpath('./message.txt', (err, resolvedPath) => {  if (err) {    throw err;
  } else {
    console.log(resolvedPath);
  }
});
登录后复制

执行如下所示:

6.4) 使用ReadStream对象读取文件

在fs模块中,可以使用createReadStream方法创建一个将文件内容读取为流数据的ReadStream对象,该方法使用如下所示:

fs.createReadStream(path, [options]);
登录后复制

path 该参数用于指定需要被读取的文件的完整路径及文件名。

options为一个对象,它有如下属性:

  • flags: 用于指定对该文件采取什么操作,默认值为 'r', 它的用法和readFile方法中的flags属性一样的。

  • encoding: 指定使用什么编码来读取该文件,可指定的值有 'utf8', 'ascii', 'base64'. 默认值为null.

  • start: 指定文件的开始读取位置。

  • end: 指定文件的结束读取位置。

还有很多其他的参数,这里不一一讲解,可以自行百度下即可。

下面简单的使用一个demo来了解下使用:如下代码:

const fs = require('fs');/*
 一个汉字三个字节,message.txt的内容为:我喜爱编写代码
 因此从第三个位置开始,到第十二个位置结束,因此数据应该为 喜爱编写*/const options = {
  start: 3, 
  end: 12};
const file = fs.createReadStream('./message.txt', options);

file.on('open', (fd) => {
  console.log('开始读取文件');
});

file.on('data', (data) => {
  console.log('读取到的数据:' + data);
});

file.on('end', () => {
  console.log('文件已全部读取完毕');
});

file.on('close', () => {
  console.log('文件被关闭');
});

file.on('error', (err) => {
  console.log('读取文件失败');
});
登录后复制

如下图所示:

我们可以使用 ReadStream对象的pause方法暂停data事件的触发,同时也意味着停止文件的读取操作。而已经被读取到的操作系统缓存区中的数据也将被暂时保存在操作系统缓冲区中,在使用了pause方法暂停data事件的触发之后,也可以使用ReadStream对象的resume方法恢复data事件的触发,也就意味着可以继续读取文件的数据。

如下demo:

const fs = require('fs');

const readStream = fs.createReadStream('./message.txt');

readStream.pause();

readStream.on('data', (data) => {
  console.log('获取到的数据为:' +data);
});

setTimeout(() => {
  readStream.resume();
}, 1000);
登录后复制

读取过程中,断听了一秒后,继续把数据读出来了。

注意:写入文件的方法是 WriteStream, 使用方式和读方式类似,这里不多介绍。

【推荐学习:《nodejs 教程》】

以上是nodejs中哪个模块提供文件操作api的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1662
14
CakePHP 教程
1419
52
Laravel 教程
1313
25
PHP教程
1262
29
C# 教程
1235
24
如何使用 Golang 安全地读取和写入文件? 如何使用 Golang 安全地读取和写入文件? Jun 06, 2024 pm 05:14 PM

在Go中安全地读取和写入文件至关重要。指南包括:检查文件权限使用defer关闭文件验证文件路径使用上下文超时遵循这些准则可确保数据的安全性和应用程序的健壮性。

nodejs是后端框架吗 nodejs是后端框架吗 Apr 21, 2024 am 05:09 AM

Node.js 可作为后端框架使用,因为它提供高性能、可扩展性、跨平台支持、丰富的生态系统和易于开发等功能。

nodejs中的全局变量有哪些 nodejs中的全局变量有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全局变量:全局对象:global核心模块:process、console、require运行时环境变量:__dirname、__filename、__line、__column常量:undefined、null、NaN、Infinity、-Infinity

nodejs怎么连接mysql数据库 nodejs怎么连接mysql数据库 Apr 21, 2024 am 06:13 AM

要连接 MySQL 数据库,需要遵循以下步骤:安装 mysql2 驱动程序。使用 mysql2.createConnection() 创建连接对象,其中包含主机地址、端口、用户名、密码和数据库名称。使用 connection.query() 执行查询。最后使用 connection.end() 结束连接。

nodejs安装目录里的npm与npm.cmd文件有什么区别 nodejs安装目录里的npm与npm.cmd文件有什么区别 Apr 21, 2024 am 05:18 AM

Node.js 安装目录中有两个与 npm 相关的文件:npm 和 npm.cmd,区别如下:扩展名不同:npm 是可执行文件,npm.cmd 是命令窗口快捷方式。Windows 用户:npm.cmd 可以在命令提示符下使用,npm 只能从命令行运行。兼容性:npm.cmd 特定于 Windows 系统,npm 跨平台可用。使用建议:Windows 用户使用 npm.cmd,其他操作系统使用 npm。

nodejs是后端开发语言吗 nodejs是后端开发语言吗 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一种后端开发语言。它用于后端开发,包括处理服务器端业务逻辑、管理数据库连接和提供 API。

nodejs和java的差别大吗 nodejs和java的差别大吗 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差异在于设计和特性:事件驱动与线程驱动:Node.js 基于事件驱动,Java 基于线程驱动。单线程与多线程:Node.js 使用单线程事件循环,Java 使用多线程架构。运行时环境:Node.js 在 V8 JavaScript 引擎上运行,而 Java 在 JVM 上运行。语法:Node.js 使用 JavaScript 语法,而 Java 使用 Java 语法。用途:Node.js 适用于 I/O 密集型任务,而 Java 适用于大型企业应用程序。

nodejs可以写前端吗 nodejs可以写前端吗 Apr 21, 2024 am 05:00 AM

是的,Node.js可用于前端开发,主要优势包括高性能、丰富的生态系统和跨平台兼容性。需要考虑的注意事项有学习曲线、工具支持和社区规模较小。

See all articles