node.js核心模块 fs模块

30 篇文章 0 订阅

node.js核心模块 fs模块

简介

fs模块(fs是 FileSystem的简写)是Node.js用来进行文件操作的模块,它属于核心模块。你引入之后就可以直接使用了。

官方手册:http://nodejs.cn/api/fs.html

核心模块的使用步骤:

  1. 引入模块
   // 引入模块
   const fs = require('fs');
   // 可以使用var、let,但是建议使用const,因为我们不希望它被改变。
   // 名字不必大写成FS,一般也就叫fs这个名字。
  1. 调用api实现自己的要求
fs.apiName()

fs模块中操作文件(或者文件夹)的方法,大多都提供了两种选择:

  • 同步版本的
  • 异步版本的

fs模块中的常用方法

API作用备注
fs.access(path, callback)判断路径是否存在
fs.appendFile(file, data, callback)向文件中追加内容
fs.copyFile(src, callback)复制文件
fs.mkdir(path, callback)创建目录
fs.readDir(path, callback)读取目录列表
fs.rename(oldPath, newPath, callback)重命名文件/目录
fs.rmdir(path, callback)删除目录只能删除空目录
fs.stat(path, callback)获取文件/目录信息
fs.unlink(path, callback)删除文件
fs.watch(filename[, options][, listener])监视文件/目录
fs.watchFile(filename[, options], listener)监视文件
fs.existsSync(absolutePath)判断路径是否存在

fs-readFile-异步格式

格式

fs.readFile('文件路径'[,选项], function (err, data) {
  if (err) throw err;
  console.log(data);
});

说明:

- 参数1:文件路径。 相对路径和绝对路径均可。
- 参数2: 配置项,可选参数,可不写。主要用来配置字符集。一般可设置为'utf8',如果不设置该参数,文件内容会Buffer形式返回。
- 参数3: 读取完成后触发的回调函数。这个回调函数在读完文件后自动被nodejs自动调用,并传入 err 和 data
  - 如读取成功,回调函数中的两个参数分别是:
    - err: null
    - data: 文件内容,如果不设置参数2,则返回二进制数据。可以使用 toString() 方法将二进制数据
      转为正常字符串
  - 如读取失败,回调函数中的两个参数分别是:
    - err: 错误对象
    - data: undefined

示例1:读文本内容

const fs = require("fs")
fs.readFile('文件路径',(err, data) => {
  if (err) throw err;
  console.log(data);
});

上面的data将会是一个Buffer对象类似于数组,它的元素为16进制的两位数,它表示读出来的内容在计算机中的二进制格式。它有一个toString()方法,可以用来把内容以UTF-8的格式转成字符串。

示例2:读文本内容-指定编码格

const fs = require("fs")
fs.readFile('文件路径', "utf8", (err, data) => {
  if (err) throw err;
  console.log(data);
});

示例3:读入图片文件

确保你的目录下有图片

const fs = require("fs")
fs.readFile('./img/1.jpg',  (err, data) => {
  if (err) throw err;
  console.log(data);
});

**并不是它所有的文件都应该转成字符串的

示例4:体会异步的效果

异步的

const fs = require("fs")
console.log(1)
fs.readFile('文件路径', "utf8", (err, data) => {
  if (err) throw err;
  console.log(data);
});
console.log(2)

并不是它所有的文件都应该转成字符串的

fs-readFile-观察并处理错误

nodejs中的错误界面相比浏览器中的错误来说,并不友好。

如果读文件有错误

fs.readFile('./02.txt12112',function(err, data) {
  // 如果读文件出错了(可能的原因:路径不对,文件不存在....)
  // err的值就不是null

  // if(出错)  {
  //   处理错误
  // } else {
  //   正常
  // }
  if(err){
    // throw: 抛出
    // throw 这个命令用来告诉node.js,这里有一个错误
    //       停止后续代码的执行
    console.log(err)
    return
    // throw err;

    // 尽早返回
  }
  console.log('读出的内容是', data)
})

在node.js中遇到的错误之后,应该观察错误说明

在这里插入图片描述

fs-readFile-同步格式

格式

const fs = require("fs")
let rs = fs.readFileSync('文件路径',"utf8");
console.log(rs)
  • api的名字后面有Sync(async是异步的,sync表示同步的)
  • 不是通过回调函数来获取值,而是像一个普通的函数调用一样,直接获取返回值

捕获同步格式中的错误对象

如果读成功,则会获取读出来的数据,如果失败了,则会中断后续所有的代码执行。

console.log(1)
let res = fs.readFileSync('errorPath.js')
console.log(res)
console.log(2)

解决方案:用try. catch 结构

try {
  const fs = require("fs")
	let rs = fs.readFileSync('文件路径',"utf8");
	console.log(rs)
} catch(err) {
  console.log(err)
}

fs-writeFile-文件覆盖写入

覆盖写入 writeFile

功能:向指定文件中写入字符串, 如果没有该文件则尝试创建该文件。它是覆盖写入:会把文件中的内容全部删除,再填入新的内容。

格式:

fs.writeFile(pathName, content, option, (err)=>{});
// 参数1: 要写入的文件路径 --- 相对路径和绝对路径均可,推荐使用绝对路径
// 参数2: 要写入文件的内容
// 参数3: 配置项,设置写入的字符集,默认utf-8
// 参数4: 写入完成后触发的回调函数,有一个参数 --- err (错误对象)

示例1: 写入.txt文件

const fs = require('fs')
fs.writeFile('./a.txt', 'hello world! \n 换一行', err => {
  if (err) {
    console.info(err)
    throw err
  }
})

示例2: 写入json

稍微把问题提升一下,问: 如何把数据写入文件中?

const fs = require('fs')

const data = [{name: '小王', age: 20}]
fs.writeFile('./a.txt', data, err => {
  if (err) {
    console.info(err)
    throw err
  }
})

上面的写法会出错: data不是一个字符串或者是Buffer

const fs = require('fs')

const data = [{name: '小王', age: 20}]
fs.writeFile('./a.txt', JSON.stringify(data), err => {
  if (err) {
    console.info(err)
    throw err
  }
})

fs-appendFile-文件追加写入

功能

向指定文件中写入字符串(追加写入), 如果没有该文件则尝试创建该文件。

格式

fs.appendFile(pathName, content, option, callback);
// 参数1: 要写入的文件路径 --- 相对路径和绝对路径均可,推荐使用绝对路径
// 参数2: 要写入文件的字符串
// 参数3: 配置项,设置写入的字符集,默认utf-8
// 参数4: 写入完成后触发的回调函数,有一个参数 --- err (错误对象)

示例

const fs = require('fs')

fs.appendFile('./a.txt', '\n 为天地立命', err => {
  if (err) {
    console.info(err)
    throw err
  }
})

\n : 表示换行

路径问题-相对路径的隐患

在读取文件时,使用相对路径是容易出问题的。

素材准备

假设有如下两个文件,它们所处的目录及文件名如下所示:

|-day02
|------02code-nodejs
|--------------------03.fs.js
|--------------------03.fs.txt

03.fs.js代码的作用是读出03.fs.txt中的内容,并显示出来,它的代码是这样的:

// 03.fs.js
const fs = require('fs');
fs.readfilesync("./03.fs.txt",'utf8'); 
//注意这里对03.fs.txt的访问使用的是相对"fs.js" 本身的路径

由于03.fs.js和要读取的目标03.fs.txt是在同级目录下,所以可以写相对路径。

运行代码

想要运行03.fs.js这个文件有多种方式,根据当前处在的位置不同:

  • A. 如果终端中的路径定位在day02/02code-nodejs目录下,则通过node 03.fs.js
  • B. 如果终端中的路径定位在day02目录下,则通过:node 02code-nodejs/03.fs.js 能成功执行.js文件,但是却找不到文件路径了。

原因分析

在fs中读取文件时,由于使用的是相对路径,所以在读这个文件的时,nodejs会去:

运行命令的小黑窗的路径 + 代码中的相对路径 找它。

所以上述代码中:

  • A方案在运行时,找到的文件是day02/02code-nodejs/03.fs.txt,它可以找到文件
  • B方案在运行时,找到的文件是day02/03.fs.txt,它就找到不文件了

解决方法: 就是在操作文件时,使用绝对路径来定位文件。

路径问题-使用绝对路径

目标:掌握 __dirname__filename的用法,并能在操作文件路径时,正确使用

回顾绝对与相对路径

a标签的 href ,img标签的src属性在设置值时都可以写相对或者绝对地址。

例如:

<a href="./index.html">主页</a>
<a href="https://www.baidu.com/index.html">主页</a>

在nodejs

  • 绝对路径: 从磁盘根目录开始到指定文件的路径。
  • 相对路径:是以某个文件的位置为起点,相对于这个位置来找另一个文件。

__dirname __filename 获取绝对路径

nodejs中提供了两个全局变量来获取获取绝对路径:

  • __dirname:获取当前被执行的文件的文件夹所处的绝对路径
  • __filename:获取当前被执行的文件的绝对路径

全局变量的含义是

  • 变量:它们的值是变化的。在不同的文件中值就不同。
  • 全局:在任意地方都可以直接使用。

测试使用,在任意代码的任意位置

console.log(__dirname)
console.log(__filename)

在文件操作时,使用绝对路径

只需要在读入文件时,在路径前面拼接上:

// 拼接html5.jpg的绝对路径
// 1) 找到当前文件夹的绝对路径
console.log(__dirname)
// 2) 加上 html5.jpg
const fs = require('fs')
const filePath = __dirname + '\\html5.jpg'
// 走一步,看一步
console.log(filePath)

fs.readFile(filePath,function(err, data) {
  if(err) {
    console.log(err)
    return
  }
  console.log(data)
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值