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 中,我们可以使用 mkdir
或 mkdirSync
来创建文件夹
语法:
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 中,我们可以使用 stat
或 statSync
来查看资源的详细信息
语法:
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()方法的返回值是一个包含路径信息的对象