nodejs的文件系统fs模块,可以实现对文件、目录等的操作,stream模块实现对文件数据的断续读写操作
一、文件操作
fs.readFile(file[,options],callback) 异步读取数据,参数err,data
fs.readFileSync(file[,options]) 同步读取数据,返回读取的数据
fs.writeFile(file, data[,options],callback) 异步写数据,参数err
fs.writeFileSync(file,data[,options]) 同步写数据,返回undefined
fs.stat(path,callback) 返回一个stats对象到回调函数参数中, 通过该stats对象获取文件信息,参数err,stats
fs.statSync(path) 同步,返回一个stats对象
------------------------------------------------------------------
stats对象获取信息方法:
stats.isFile() 是否为文件
stats.isDirectory() 是否为目录(文件夹)
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isSymbolicLink() (only valid with fs.lstat())
stats.isFIFO()
stats.isSocket()
-------------------------------------------------------------
在index.js同级目录下创建一个file.txt, 里面填写数据作为测试用,比如Hello World
1、fs.readFile
"use srict"; const fs = require(‘fs‘); fs.readFile(‘./file.txt‘, ‘utf-8‘, function (err, data) { if (err) { console.log(err); return; } console.log(data); });
2、fs.readFileSync
"use srict"; const fs = require(‘fs‘); const data = fs.readFileSync(‘./file.txt‘, ‘utf-8‘); console.log(data);
3、fs.writeFile
读取file.txt文件数据,然后写到data.txt文件中,如果data.txt不存在,会自动创建然后写入,如果存在会先删除data.txt中数据,然后写入覆盖。
"use srict"; const fs = require(‘fs‘); fs.readFile(‘./file.txt‘, ‘utf-8‘, function (err, data) { if (err) { console.log(err); return; } fs.writeFile(‘./data.txt‘, data + ‘ from file.txt‘, ‘utf-8‘, function (err) { if (err) { console.log(err); return; } console.log(‘write success‘); }) });
4、fs.stat
"use srict"; const fs = require(‘fs‘); fs.stat(‘./file.txt‘, (err, stats) => { if (err) { console.log(err); return; }else { if (stats.isFile()) { fs.readFile(fileName, ‘utf-8‘, (err, data) => { if (err) { console.log(err); return; } fs.writeFile(‘./swFile.txt‘, data + ‘from file.txt by stat‘, ‘utf-8‘, (err) => { if (err) { console.log(err); return; } console.log(‘write success stat‘); }) }); } else { console.log(‘The file is dirtory‘); } } });
二、文件夹操作
fs.mkdir(path[,mode],callback) 创建文件夹,参数mode指的是文件夹权限,参数err
fs.mkdirSync(path[,mode]) 同步创建文件夹,返回undefined
fs.readdir(path[,options],callback) 读取文件夹,返回一个数组到回调参数,包含该文件夹所有子内容的名字string,不包括子孙内容,参数err, dir
fs.readdirSync(path[,options]) 同步读取文件夹,返回读取的文件夹数组数据
"use srict"; const fs = require(‘fs‘); fs.readdir(‘./fsDemo‘, function (err, dir) { if (err) { console.log(err); return; } console.log(dir); // [‘demo01‘, ‘demo02‘] });
四、流操作(stream模块)
fs.createReadStream(path[,options]) 创建一个读流操作对象,返回一个readable对象
-------------------------------------------------------
readable对象支持的事件:
data:当有数据读取的时候,返回读取的数据到回调函数参数中
readable:当有数据可读取的时候触发,但不会读取数据,仅仅做判断用
end:当数据全部读取完毕的时候触发
readable对象支持的方法:
rs.pause() 暂停读取数据
rs.resume() 打开读取流,恢复读取数据
rs.read() 读取当前剩余数据并返回,没有则返回null
options 是一个对象或者字符串,各个默认值为
{
flags: ‘r‘,
encoding: null,
fd: null,
mode: 0o666,
autoClose: true
}
---------------------------------------------------
fs.createWriteStream(path[,options]) 写流操作,返回一个writable对象
---------------------------------------------------
writable支持的事件:
finish:当end方法被调用,且所有数据都写入完毕时触发
pipe:当对象通过pipe写入数据时
writable对象支持的方法:
ws.write(chunk[,encoding][,callback]) 写数据,chunk是要写入的数据(string|buffer) ,callback:写入后回调函数
ws.end() 关闭写入流
----------------------------------------------------
pipe方法:
rs.pipe(ws) 从左向右看,创建一个管道,将rs读取的数据通过管道流入到ws写入
-----------------------------------------------------------------------------------------------------------
fs.createReadStream
"use srict"; const fs = require(‘fs‘); const rs = fs.createReadStream(‘./file.txt‘, ‘utf-8‘); // 当读取数据时触发,将读取的数据打印 rs.on(‘data‘, function (data) { console.log(data); }); // 当有数据可读是,将剩余数据全部打印出来 rs.on(‘readable‘, function() { console.log(rs.read()) }); // 当读取结束时,打印read finished rs.on(‘end‘, function () { console.log(‘read finished‘); });
fs.createWriteStream
"use strict"; const fs = require(‘fs‘); const rs = fs.createReadStream(‘./file.txt‘, ‘utf-8‘); const ws = fs.createWriteStream(‘./data.txt‘, { flags: ‘w‘, // a 追加,w 删除后再写,默认为w }); // 当读取数据时触发,将读取的数据写入 rs.on(‘data‘, function (data) { ws.write(data); }); // 当读取数据结束时,关闭写入流,打印write end rs.on(‘end‘, function (data) { ws.end(); console.log(‘write end‘); }); // 其实可以通过pipe方法,一句代码实现上边的功能,如下 // rs.pipe(ws);
-------------------------------------------------------------------------------------end