Node.js当中的文件操作(二)

文件的复制

我们可以利用流式读取与流式写入相配合进行文件的复制

let fs = require('fs');

// 文件的流式读取
let rs = createReadStream('./data.txt');
// 文件的流式写入
let ws = createWriteStream('./newData.txt');

// 给文件的流式读取添加 data 事件
rs.on('data',message => {
  // 每读取一小块就写入一下块
  ws.write(message);
})

// 监听流式读取的结束
rs.on('end',() => {
  console.log('读取完成');
})

文件的移动与重命名

在 Node.js 中,我们可以使用 rename renameSync 来移动或重命名 文件或文件夹

语法:

fs.rename(oldPath, newPath, callback)

fs.renameSync(oldPath, newPath)

参数说明:

  • oldPath 文件当前的路径
  • newPath 文件新的路径
  • callback 操作后的回调

无论移动文件也好还是文件的重命名也好,其实本质上都是文件的路径转移(从当前路径转移到目标路径)

异步操作

fs.rename('./data.txt','./message.txt',(err) => {
  if (err) {
    console.log("移动失败");
    return;
  }
  console.log('移动完成');
})

同步操作

fs.renameSync('./data.txt','../master/user/newData.txt');

文件删除

在 Node.js 中,我们可以使用 unlink unlinkSync 来删除文

语法:

fs.unlink(path, callback)

fs.unlinkSync(path)

参数说明:

  • path 文件路径
  • callback 操作后的回调
const fs = require('fs');

// 异步的文件删除
fs.unlink('./data.txt',(err) => {
  if (err) {
    console.log("删除失败");
    return;
  }
  console.log('删除完成');
})

//同步的文件删除
fs.unlinkSync('./data.txt')

其实更推荐还是用异步的fs.rm()或者同步的fs.rmSync() 去进行文件的删除

异步

const fs = require('fs');
fs.rm('./data.txt',(err) => {
  if (err) {
    console.log("删除失败");
    return;
  }
   console.log('删除完成');
})

同步

const fs = require('fs');
fs.rm('./data.txt');

文件夹操作

方法说明
mkdir() / mkdirSync()创建文件夹
readdir() / readdirSync()读取文件夹
rmdir() / rmdirSync()删除文件夹
mkdir 创建文件夹

在 Node.js 中,我们可以使用 mkdirmkdirSync 来创建文件夹

语法:

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

fs.mkdirSync(path[, options])

参数说明:

  • path 文件夹路径
  • options 选项配置( 可选 )
  • callback 操作后的回调
//异步创建文件夹
fs.mkdir('./public',(err) => {
  if(err) throw err;
  console.log('创建成功');
})

//递归异步创建
fs.mkdir('./public/a/b/c',{recursive:ture}, (err) => {
  if(err) throw err;
  console.log('递归创建成功');
})

//递归同步创建文件夹
fs.mkdirSync('./x/y/z', {recursive: true});
readdir读取文件夹

在 Node.js 中,我们可以使用 readdir readdirSync 来读取文件夹

语法:

fs.readdir(path[, options], callback)

fs.readdirSync(path[, options])

参数说明:

  • path 文件夹路径
  • options 选项配置( 可选 )
  • callback 操作后的回调
//异步读取
fs.readdir('./',(err) => {
  if(err) throw err;
  console.log(data);
})

//同步读取
let data = fs.readdirSync('./论语');
console.log(data);

读取所得到的 data 是一个数组,数组中的每一个元素都是一个包含扩展类型的文件名

例如

在这里插入图片描述

rmdir删除文件

在 Node.js 中,我们可以使用 rmdir rmdirSync 来删除文件夹

语法:

fs.rmdir(path[, options], callback)

fs.rmdirSync(path[, options])

参数说明:

  • path 文件夹路径
  • options 选项配置( 可选 )
  • callback 操作后的回调
//异步删除文件夹
fs.rmdir('./page',err => {
  if(err) throw err;
  console.log('删除成功');
})
//异步递归删除文件夹  (不建议)
fs.rm('./a',{recursive:true}, err => {
  if(err) {
    console.log(err);
}
  console.log('递归删除')
})
//同步递归删除文件夹 (不建议)
fs.rmdirSync('./x', {recursive: true})

递归删除时最好使用以下代码:

fs.rm('./a',{recursive: true},err => {
   if(err) {
    console.log(err);
}
  console.log('递归删除')
})
查看文件资源的状态(属性信息)

在 Node.js 中,我们可以使用 statstatSync 来查看资源的详细信息

语法:

fs.stat(path[, options], callback)

fs.statSync(path[, options])

参数说明:

  • path 文件夹路径
  • options 选项配置( 可选 )
  • callback 操作后的回调

返回值:是一个包含文件资源状态信息的对象

//异步获取状态
fs.stat('./video.mp4',(err,data) => {
  if(err){
    console.log('操作失败');
    return;
  }
  console.log(data);
}) 

//同步获取状态
let data = fs.statSync('./data.txt');

在这里插入图片描述

结果值对象结构:

  • size 文件体积
  • birthtime 创建时间
  • mtime 最后修改时间
  • isFile 检测是否为文件
  • isDirectory 检测是否为文件夹
  • 等等。。。。。。

__dirname

__dirname是Node.js 中所内置的变量,它保存着当前文件所在目录的绝对路径,可以使用 __dirname 与文件名拼接成绝对路径。

let data = fs.readFileSync(__dirname+'/data.txt');

特别注意:

​ 当使用__dirname进行绝对路径的拼接时,就不可以在路径中出现./ 以及同等意义的路径

例如以下代码是错误的:

// 这是一个错误的代码示例
let data = fs.readFileSync(__dirname+'./data.txt');
// 这也是一个错误的代码示例
let data = fs.readFileSync(__dirname+'../data.txt');

path模块

path 模块提供了 操作路径 的功能,我们将介绍如下几个较为常用的几个 API:

API说明
path.resove()拼接规范的绝对路径 (常用)
path.sep()获取操作系统的路径分隔符(\/)
path.parse()解析路径并返回对象
path.basename()获取路径的基础名称
path.dirname()获取路径的目录名
path.extname()获得路径的扩展名

path.resove

const fs = require('fs');
const path = require('path');

// 写法一:
console.log(path.resove(__dirname,'data.txt'));
// 写法二:
console.log(path.resove(__dirname.'./data.txt'));

以下代码为错误写法:

console.log(path.resove(__dirname,'/index.html'));

在这里的/data.txt中的 /是根路径,在进行路径拼接时会直接跳到盘符的根路径

在这里插入图片描述

显然,这并非index.html文件的真实绝对路径。

path.parse

let str = 'D:\\nodeJS\\pathCode\\代码\\path.js';
console.log(path.parse(str));

在这里插入图片描述

path.parse()方法的返回值是一个包含路径信息的对象