文件系统(File System)
fs模块(系统内置模块 主要用来操作文件)
1. 写入
- 提供同步异步两种选择(同步的方法 都是在异步方法后面加上 Sync)
- 同步导致阻塞
- 异步操作完成通过回调返回结果
1.1 同步写入操作
let fs = require("fs");
//同步打开文件
let fd = fs.openSync('text_1', 'w');
console.log(fd)
//写入内容
fs.writeFileSync(fd, 'hello ink!');
//退出
fs.closeSync(fd);
1.2 异步写入操作
let fs = require("fs");
fs.open("text_2.txt", "w", (err, fd) => {
if( !err ) {
fs.writeFile(fd, 'ink nice to meet u!!', (err) => {
if( !err ) {
console.log('success');
fs.close(fd, (err) => {
if ( !err ) {
console.log('file closed');
} else {
throw err;
}
})
} else {
throw err;
}
});
} else {
throw err;
}
})
1.3 文件流写入操作
let fs = require("fs");
let ws = fs.createWriteStream('text_3.txt');
//打开通道
ws.once('open', () => {
console.log('通道已打开!')
})
ws.write("what's your name?\n");
ws.write("what's your name?\n");
ws.write("what's your name?\n");
ws.write("what's your name?\n");
ws.end();
//监听通道关闭
ws.once('close', () => {
console.log('通道已关闭!')
})
2. 文件读取操作
2.1文件读取
let fs = require('fs');
// 异步读取
/*
fs.readFile('./readme.txt', function (err, data) {
// 判断 如果有错 抛出错误
if (err) {
throw err;
}
// 如果没有错 打印读取到的文件数据
console.log('读取结果:', data.toString());
})
*/
// console.log('看一下阻塞不?')
// 同步读取 (直接返回读取的结果 保存在变量data里面)
var data = fs.readFileSync('./readme.txt');
console.log('读取结果:', data.toString());
console.log('看一下阻塞不?')
2.2 读取图片并写入到另一个文件中(单个文件操作)
let fs = require("fs");
fs.readFile("../images/deskPic1.jpg", (err, data) => {
if ( !err ) {
console.log(data);
//写入图片文件
fs.writeFile('receiveimage_1.jpg', data, (err, data) => {
if ( !err ) {
console.log('transfer success!');
} else {
throw err;
}
})
} else {
throw err;
}
})
2.3 使用文件读入流处理
let fs = require("fs");
let readStream = fs.createReadStream("../images/deskPic2.jpg");
let writeStream = fs.createWriteStream("receiveimage_2.jpg");
//监听文件流打开关闭
readStream.once('open', () => {
console.log('readstream opened');
})
readStream.once('clos', () => {
console.log('readstream closed');
})
writeStream.once('open', () => {
console.log('writeStream opened');
})
writeStream.once('clos', () => {
console.log('writeStream closed');
})
//读入流操作
readStream.on('data', (data) => {
console.log(data);
//文件过大时分段读取
//写入
writeStream.write(data);
})
简便方法
let fs = require("fs");
let readStream = fs.createReadStream("../images/deskPic2.jpg");
let writeStream = fs.createWriteStream("receiveimage_2.jpg");
//创建管道
readStream.pipe(writeStream);
3.删除文件
// 引入fs模块
let fs = require('fs');
// 删除文件
fs.unlink('./writeme.txt', function (err) {
// 判断 如果有错 抛出错误 否则 打印删除成功
if (err) {
throw err;
}
console.log('删除成功!')
})
4.读取文件目录
// 引入fs模块
let fs = require('fs');
// 读取文件目录(文件夹)中的所有文件
fs.readdir('../', function (err, files) {
// 如果有错 抛出错误
if (err) {
throw err;
}
// 否则 打印读取的结果 (读取当前目录的结果 会被放入一个数组里面)
console.log(files);
})
5. 创建文件夹&删除空文件夹
// 引入fs模块
var fs = require('fs');
/*
// 创建文件夹
fs.mkdir('../img', function (err) {
// 如果有错 抛出错误
if (err) {
throw err;
}
// 否则 打印创建文件夹成功
console.log('创建文件夹成功')
})
*/
// 删除空的文件夹
fs.rmdir('../img', function (err) {
if (err) {
throw err;
} else {
console.log('删除空文件夹成功')
}
})
6. 递归删除非空文件夹
// 引入fs模块
var fs = require('fs');
// 封装成一个 可以删除非空目录的函数(传入要删除的目录即可)
function delDir (dir) {
// 获取传入的目录下所有的文件 结果是一个数组
var filesArr = fs.readdirSync(dir);
// 循环遍历这个数组 ['bb', 'cc', 'text.txt']
for (var i in filesArr) {
// 拼接读取文件信息的路径
var path = dir + '/' +filesArr[i] // ./aa/bb ./aa/cc ./aa/text.txt
// 读取文件的信息
var stat = fs.statSync(path);
// 判断 如果是文件 直接删除
if (stat.isFile()) {
fs.unlinkSync(path) // 直接删除
} else if (stat.isDirectory()) {
// 递归调用自己
delDir(path)
}
}
// 删除空目录(文件夹)
fs.rmdirSync(dir)
}
delDir('../img');
// 导出
// module.exports = delDir;