Skip to content

Node入门系列-fs、path 模块的使用(1)

一、fs文件系统模块

fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。

fs.readFile() 方法,用来读取指定文件中的内容

fs.writeFile() 方法,用来向指定的文件中写入内容

1. 使用 readFile() 方法读取文件

语法格式 fs.readFile(path[, options], callback)

// 导入 fs 模块,来操作文件
const fs = require('fs')
// 调用 fs.readFile(文件路径, 读取文件采用的编码格式, 回调函数) 方法来读取文件
// 如果读取成功,err 值为错误对象,dataStr 值为 undefined
// 如果读取成功:err 值为 null,dataStr 值为文件的值
fs.readFile('./files/11.txt', 'utf8', (err, dataStr) => {
console.log('读取失败的结果:' + err); // null
console.log('--------------------');
console.log('读取成功的结果:' + dataStr); // 文件的值
})

参数解读:

参数1:必选参数,字符串,表示文件的路径

参数2:可选参数,表示以什么编码格式来读取文件

参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果。

1.1 判断文件是否读取成功

可以判断 err 对象是否为 null,从而知晓文件读取的结果

const fs = require('fs')
fs.readFile('./files/1.txt', 'utf8', (err, dataStr) => {
if (err) {
console.log(err);
return console.log('文件读取失败!', err.message);
}
console.log('文件读取成功!', dataStr);
})

2. 使用 writeFile() 方法写入文件

语法格式 fs.writeFile(file, data[, options], callback)

const fs = require('fs')
// 调用 fs.writeFile(文件路径, 写入的内容, 回调函数) 方法来写入文件
// 写入成功:err 值为 null
// 写入失败:err 值为错误对象
fs.writeFile('./files/3.txt', 'ok123', (err) => {
// 判断文件是否写入成功
if (err) {
console.log('文件写入失败!', err.message);
}
console.log('文件写入成功!'+ err);
})

参数解读:

参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径

参数2:必选参数,表示要写入的内容

参数3:可选参数,表示以什么格式写入文件内容,默认值是 utf8

参数4:必选参数,文件写入完成后的回调函数

2.1 演示路径的问题

const fs = require('fs')
// 出现路径拼接错误的问题,是因为提供了 ./ 或 ../ 开头的相对路径
// 解决方案:直接提供完整的路径(绝对路径)
// fs.readFile('./files/1.txt', 'utf8', (err, data) => {
// if (err) return console.log('文件读取失败!' + err.message)
// console.log('文件读取成功! \n' + data);
// })
// 缺点:这种方案移植性非常差,不利于维护
// fs.readFile('E:\\Visual Studio Code\\web\\3.Node.js\\day1\\code\\files\\1.txt', 'utf8', (err, data) => {
// if (err) return console.log('文件读取失败!' + err.message)
// console.log('文件读取成功! \n' + data);
// })
// 完美解决方案:使用 __dirname 表示当前文件所处的目录
fs.readFile(__dirname + '/files/1.txt', 'utf8', (err, data) => {
if (err) return console.log('文件读取失败!' + err.message)
console.log('文件读取成功! \n' + data);
})

2.2 路径动态拼接的问题

在使用 fs 模块操作文件时,如果提供的操作路径是以./../开头的相对路径时,很容易出现路径动态拼接错误的问题。

原因:代码在运行的时候,会以执行 node 命令时所处的目录,动态拼接出被操作文件的完整路径。

解决方案:在使用 fs 模块操作文件时,直接提供完整的路径,不要提供 ./../ 开头的相对路径,从而防止路径动态拼接的问题。

// 不要使用 ./ 或 ../ 这样的相对路径
fs.readFile('./files/1.txt', 'utf8', (err, data) => {
if (err) return console.log('文件读取失败!' + err.message)
console.log('文件读取成功! \n' + data);
})
// __dirname 表示当前文件所处的目录
fs.readFile(__dirname + '/files/1.txt', 'utf8', (err, data) => {
if (err) return console.log('文件读取失败!' + err.message)
console.log('文件读取成功! \n' + data);
})

二、path 路径模块

path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理 需求

path.join() 方法,用来将多个路径片段拼接成一个完整的路径字符串

path.basename() 方法,用来从路径字符串中,将文件名解析出来

3. 使用 path.join() 拼接路径

语法格式 path.join[...paths]

const fs = require('fs')
// 先导入 path 模块
const path = require('path')
/**
* path.join(): 用来拼接路径
* 凡是路径的拼接,都应该使用 path.join()
*/
// 注意:../ 会抵消前面的一层路径
const pathStr = path.join('/a', '/b/c', '../', './d', 'e')
console.log(pathStr); // \a\b\d\e
// 加号拼接,文件路径不能加 点 . !!
// fs.readFile(__dirname + '/files/1.txt')
// 使用 path.join() 方法拼接,加不加点都可以
fs.readFile(path.join(__dirname, './files/1.txt'), 'utf-8', (err, data) => {
if(err) return console.log(err.message);
console.log(data);
})

参数解读:..paths <string> 路径片段的序列,返回值: <string>

4. 使用 path.basename() 获取路径中的文件名

语法格式 path.basename(path[, ext])

const path = require('path')
/**
* path.basename() :获取给定路径中的文件名
*/
// 定义文件的存放路径
const fpath = '/a/b/c/index.html'
// 1. 获取文件名
// const fullName = path.basename(fpath)
// console.log(fullName); // index.html
// 2. 获取文件名(不包含文件扩展名)
const nameWithoutExt = path.basename(fpath, '.html')
console.log(nameWithoutExt); // index

参数解读:

  1. path<string> 必选参数,表示一个路径的字符串
  2. ext <string> 可选参数,表示文件扩展名
  3. 返回: <string> 表示路径中的最后一部分

5. 使用 path.extname() 方法获取路径中的扩展名部分

语法格式 path.extname(path)

const path = require('path')
/**
* path.extname() :获取给定路径中文件的扩展名
*/
const fpath = '/z/x/c/index.html'
const fext = path.extname(fpath)
console.log(fext); // .html

参数解读:

  • path <string> 必选参数,表示一个路径的字符串
  • 返回: <string> 返回得到的扩展名字符串

每文一句:路漫漫其修道远,吾将上下而求索。