Node.js文件系统
Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API。 Node 导入文件系统模块(fs)语法如下所示:
var fs = require("fs")
异步和同步
- 文件系统分为异步的(fs.readFile() )和同步的( fs.readFileSync())
- 异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
- 异步方法性能更高,速度更快,而且没有阻塞。
实例:
创建input.txt文件,内容如下:
我永远喜欢阿狸:i love ahri forever
文件读取实例
创建file.js,内容如下:
const fs = require('fs');
// 异步读取
fs.readFile('./input.txt',(err,data) => {
if(err) {
return console.error(err);
}
console.log('异步读取:'+data.toString())
})
// 同步读取
const data = fs.readFileSync('./input.txt');
console.log('同步读取:'+data.toString());
console.log('程序执行完毕');
输出结果:
> node file.js
同步读取:我永远喜欢阿狸:i love ahri forever
文件读取实例
程序执行完毕
异步读取:我永远喜欢阿狸:i love ahri forever
文件读取实例
打开文件
语法
以下为在异步模式下打开文件的语法格式:
fs.open(path, flags[, mode], callback)
参数:
- path - 文件的路径。
- flags - 文件打开的行为。具体值详见下文。
- mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。
- callback - 回调函数,带有两个参数如:callback(err, fd)。
flags的参数可以是以下值:
实例:
const fs = require('fs');
console.log('开始打开文件');
fs.open('./input.txt','r+',function(err,fd) {
if(err) {
return console.error(err);
}
console.log('文件打开成功!');
})
输出结果:
> node file.js
开始打开文件
文件打开成功!
获取文件信息
语法
以下为通过异步模式获取文件信息的语法格式:
fs.stat(path, callback)
参数
参数使用说明如下:
- path - 文件路径。
- callback - 回调函数,带有两个参数如:(err, stats), stats 是 fs.Stats 对象。
fs.stat(path)执行后,会将stats类的实例返回给其回调函数。可以通过stats类中的提供方法判断文件的相关属性。例如判断是否为文件:
const fs = require('fs');
fs.stat('./input.txt',function(err,stats) {
console.log(stats.isFile()); // true
})
实例:
const fs = require('fs');
console.log('开始读取文件信息');
fs.stat('./input.txt',function(err,stats) {
if(err) {
return console.log(err);
}
console.log(stats);
console.log('获取文件信息成功');
// 检测文件类型
console.log('是否为文件(ifFile)?'+stats.isFile());
console.log('是否是目录(isDirectory)?'+stats.isDirectory());
})
输出结果如下:
> node file.js
开始读取文件信息
Stats {
dev: 3506382322,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: undefined,
ino: 12103423998595128,
size: 63,
blocks: undefined,
atimeMs: 1563452419368.5586,
mtimeMs: 1563372554341.1382,
ctimeMs: 1563372554341.1382,
birthtimeMs: 1563372529892.5398,
atime: 2019-07-18T12:20:19.369Z,
mtime: 2019-07-17T14:09:14.341Z,
ctime: 2019-07-17T14:09:14.341Z,
birthtime: 2019-07-17T14:08:49.893Z }
获取文件信息成功
是否为文件(ifFile)?true
是否是目录(isDirectory)?false
写入文件
语法
以下为异步模式下写入文件的语法格式:
fs.writeFile(file, data[, options], callback)
writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。
参数
参数使用说明如下:
- file - 文件名或文件描述符。
- data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。
- options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 ‘w’
- callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
实例
const fs = require('fs');
console.log('准备写入文件');
fs.writeFile('./input.txt','我永远喜欢阿狸',function(err) {
if(err) {
return console.error(err);
}
console.log('写入成功');
console.log('----------------');
console.log('读取写入的数据');
fs.readFile('./input.txt',function(err,data) {
if(err) {
return console.error(err);
}
console.log('读取到的文件内容为:'+data.toString());
})
})
输出结果为:
> node file.js
准备写入文件
写入成功
----------------
读取写入的数据
读取到的文件内容为:我永远喜欢阿狸
读取文件
语法
以下为异步模式下读取文件的语法格式:
fs.read(fd, buffer, offset, length, position, callback)
该方法使用了文件描述符来读取文件。
参数
参数使用说明如下:
- fd - 通过 fs.open() 方法返回的文件描述符。
- buffer - 数据写入的缓冲区。
- offset - 缓冲区写入的写入偏移量。
- length - 要从文件中读取的字节数。
- position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
- callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。
实例
创建input.txt,内容为:
我永远喜欢阿狸
创建file.js文件,内容为:
const fs = require('fs');
let buf = new Buffer.alloc(1024);
console.log('准备打开已存在的文件');
fs.open('./input.txt','r+',function(err,fd) {
if(err) {
return console.error(err);
}
console.log('文件打开成功,准备读取文件');
fs.read(fd,buf,0,buf.length,0,function(err,bytes) {
if(err) {
console.log(err);
}
console.log(bytes+' 字节被读取');
// 仅输出读取的字节
if(bytes > 0) {
console.log(buf.slice(0,bytes).toString());
}
})
})
输出结果为:
> node file.js
准备打开已存在的文件
文件打开成功,准备读取文件
21 字节被读取
我永远喜欢阿狸
关闭文件
语法
以下为异步模式下关闭文件的语法格式:
fs.close(fd, callback)
该方法使用了文件描述符来读取文件。
参数
参数使用说明如下:
- fd - 通过 fs.open() 方法返回的文件描述符。
- callback - 回调函数,没有参数。
实例
input.txt 文件内容为:
我永远喜欢阿狸
创建file.js,文件内容为:
const fs = require('fs');
let buf = new Buffer.alloc(1024);
fs.open('./input.txt','r+',function(err,fd) {
if(err) {
return console.error(err);
}
console.log('文件打开成功');
console.log('准备读取文件');
fs.read(fd,buf,0,buf.length,0,function(err,bytes) {
if(err) {
console.log(err);
}
console.log('文件读取成功');
// 仅输出读取的文件
if(bytes > 0) {
console.log('读取的文件为:'+buf.slice(0,bytes).toString());
}
fs.close(fd,function(err) {
if(err) {
console.log(err);
}
console.log('文件关闭成功');
})
})
})
输出结果为:
> node file.js
文件打开成功
准备读取文件
文件读取成功
读取的文件为:我永远喜欢阿狸
文件关闭成功
截取文件
语法
以下为异步模式下截取文件的语法格式:
fs.ftruncate(fd, len, callback)
该方法使用了文件描述符来读取文件。
参数
参数使用说明如下:
- fd - 通过 fs.open() 方法返回的文件描述符。
- len - 文件内容截取的长度。
- callback - 回调函数,没有参数。
实例
input.txt 文件内容为:
我永远喜欢阿狸
创建file.js文件,内容为:
const fs = require('fs');
let buf = new Buffer.alloc(1024);
console.log('开始打开文件');
fs.open('./input.txt','r+',function(err,fd) {
if(err) {
return console.error(err);
}
console.log('文件打开成功');
console.log('开始截取文件,截取文件10字节以内的内容,超出部分会被剔除');
// 截取文件
fs.ftruncate(fd,10,function(err) {
if(err) {
console.log(err);
}
console.log('文件截取成功');
console.log('开始读取文件');
fs.read(fd,buf,0,buf.length,0,function(err,bytes) {
if(err) {
console.log(err);
}
console.log('文件读取成功');
if(bytes > 1) {
console.log('读取的文件内容为:'+buf.slice(0,bytes).toString());
}
console.log('关闭文件');
fs.close(fd,function(err) {
if(err) {
console.log(err);
}
console.log('关闭文件成功');
})
})
})
})
输出内容为:
> node file.js
开始打开文件
文件打开成功
开始截取文件,截取文件10字节以内的内容,超出部分会被剔除
文件截取成功
开始读取文件
文件读取成功
读取的文件内容为:我永远�
关闭文件
关闭文件成功
删除文件
语法
以下为删除文件的语法格式:
fs.unlink(path, callback)
参数
参数使用说明如下:
- path - 文件路径。
- callback - 回调函数,没有参数。
实例
input.txt 文件内容为:
我永远喜欢阿狸
创建file.js,文件内容为:
const fs = require('fs');
console.log('准备删除文件');
fs.unlink('./input.txt',function(err) {
if(err) {
console.log(err);
}
console.log('删除文件成功');
})
输出结果为:input.txt文件被删除掉
准备删除文件
删除文件成功
创建目录
语法
以下为创建目录的语法格式:
fs.mkdir(path[, options], callback)
参数
参数使用说明如下:
- path - 文件路径。
- options 参数可以是:
- recursive - 是否以递归的方式创建目录,默认为 false。
- mode - 设置目录权限,默认为 0777。
- callback - 回调函数,没有参数。
实例
const fs = require('fs');
// tmp目录必须存在
console.log('创建目录 /tmp/ahri/');
fs.mkdir(__dirname+'/tmp/ahri/',function(err) {
if(err) {
console.log(err);
}
console.log('目录创建成功');
})
输出结果:
> node file.js
创建目录 /tmp/ahri/
目录创建成功
读取目录
语法
以下为读取目录的语法格式:
fs.readdir(path, callback)
参数
参数使用说明如下:
- path - 文件路径。
- callback - 回调函数,回调函数带有两个参数err, files,err 为错误信息,files 为 目录下的文件数组列表。
实例
创建file.js文件,内容如下:
const fs = require('fs');
console.log('查看/tmp 目录');
fs.readdir(__dirname+'/tmp',function(err,files) {
if(err) {
return console.error(err);
}
files.forEach(file => console.log(file));
})
输出结果为:
> node file.js
查看/tmp 目录
ahri
kurumi
删除目录
语法
以下为删除目录的语法格式:
fs.rmdir(path, callback)
参数
参数使用说明如下:
- path - 文件路径。
- callback - 回调函数,没有参数。
实例
创建file.js文件,内容如下:
const fs = require('fs');
console.log('准备删除目录 /tmp/ahri');
fs.rmdir(__dirname+'/tmp/ahri',function(err) {
if(err) {
return console.error(err);
}
console.log('目录删除成功');
console.log('读取目录');
fs.readdir(__dirname+'/tmp',function(err,files) {
if(err) {
return console.error(err);
}
console.log('读取目录成功');
files.forEach(file => console.log(file));
})
})
输出结果如下:
> node file.js
准备删除目录 /tmp/ahri
目录删除成功
读取目录
读取目录成功