文件系统时nodejs中至关重要的一个模块,它使得JavaScript具备了操作文件的能力。对于所有文件或目录的操作fs都提供了同步和异步两种操作方式。另外nodejs也提供了文件流的处理。想要熟练掌握nodejs中文件的处理需要先了解以下几个概念:字符,字符集,字符编码,文件流,buffer。
nodejs中提供文件服务的是fs模块,他能够实现文件、目录的增删改查,以及文件的信息获取。
let fs = require("fs");
const newDir = __dirname + '/fsdir';
if(fs.existsSync(newDir)){
console.log('dir is exists,delete dir!')
fs.rmdirSync(newDir);
const currentFiles = fs.readdirSync(__dirname);
console.log('query current dir file list:')
currentFiles && currentFiles.forEach(file=>{
console.log(file)
})
return
}
// 新建目录,新建前需要判断是否存在,如果存在还新建则会报错
fs.mkdirSync(newDir)
let fs = require("fs")
const userFile = newDir + '/user.json';
console.log(userFile)
if (fs.existsSync(userFile)) {
console.log('user.json file is exists!')
const f = `${newDir}/${Date.now()}.json`
const fcp = `${newDir}/${Date.now()}cp.json`
const cpf = fs.copyFileSync(userFile, fcp);
const rnf = fs.renameSync(userFile, f);
const fileBuff = fs.readFileSync(f);
} else {
fs.writeFileSync(userFile, '{"name":"json"}');
}
对于文件的直接操作通常用在日常的脚本处理中,在生产服务器上考虑到性能等原因使用文件流来处理文件是更好的选择。
根据fs的功能我们实现一个简单的文件复制的脚本
const fs = require('fs');
const argvs = process.argv;
const src = __dirname + '/' + argvs[2];
const dest = __dirname + '/' + argvs[3];
if (!fs.existsSync(src)) {
console.log('file is not exists!')
return
}
const stat = fs.lstatSync(src);
const handlerRemoveDir = (dir) => {
let files = fs.readdirSync(dir)
****
}
if (stat.isDirectory()) {
if (fs.existsSync(dest)) {
console.log("目标目录已存在,请重新输入!")
handlerRemoveDir(dest)
return
}
fs.mkdirSync(dest);
const files = fs.readdirSync(src);
console.log(files)
****
console.log('目录复制成功!')
}
if (stat.isFile()) {
if (fs.existsSync(dest)) {
console.log("目标文件已存在,请重新输入!")
return
}
fs.copyFileSync(src, dest);
console.log('文件复制成功!')
}
nodejs对于前端来说难点不是他各个的模块的API,这些API和前端使用的JavaScript语法高度类似,基本看下文档就能使用。真正的难点是这些API背后的一些知识原理,就如本章描述的fs模块,他背后蕴含了计算机对于文件的许多知识内容。