对于node中的file system模块当中有很多的对文件的一些io操作;node file-system;可进入该链接中进行查看;
本人开发项目中由于环境限制,所以使用node版本较低,为5.12.X版本,所以本人下面可能封装的方法在新版中即有可用的方法,该博客也是本人对于一些方法的整理使用过程;且由于工作需要均是异步处理方式;
1:fs异步写文件
/**
* 异步写文件
* filePath:文件存放地址
* jsonstring 所以文件内容对象
*/
export const writeFile = (path, jsonstring, cb) => {
fs.access(path, err => {
if (err) {
fs.writeFile(path,jsonstring,(err)=>{
if(err) cb(new Error( `fs write ${path} is error ${err}`));
cb();
});
} else {
fs.open(path,'w',(err,fd)=>{
if(err) cb(new Error( `fs write ${path} is error ${err}`));
else{
fs.write(fd,jsonstring,(err)=>{
if(err) cb(new Error( `fs write ${path} is error ${err}`));
else{
fs.close(fd,(err)=>{
if (err) cb(new Error( `fs write ${path} is error; ${err}`));
cb();
});
}
});
}
});
}
});
};
/**
* 异步使用流的形式写文件,该方案比上述方法更为安全
* filePath:文件存放地址
* jsonstring 所以文件内容对象
* */
export const writeFileWithStream = (filePath, jsonstring, cb) => {
let streamWrite = fs.createWriteStream(filePath);
streamWrite.write(jsonstring);
streamWrite.end();
streamWrite.on('error',(err)=>{
cb(`写入${filePath}异常:${err}`);
});
streamWrite.on('finish',()=>{
cb();
});
};
2:fs复制文件;
/**
* 复制大文件,由于readFile与writeFile在面对一些大文件时会有异常,故使用流的形式进行读写操作
* source 源文件地址
* to 复制到另一个文件的地址
* */
copyLargeFile: (source, to) => {
// fs.createReadStream(src).pipe(fs.createWriteStream(target));
return new Promise( resolve => {
let read = fs.createReadStream(source);
read.on('error', err => {
throw err;
});
let write = fs.createWriteStream(to);
write.on('error', err => {
throw err;
});
write.on('finish', ()=> {
resolve();
});
read.pipe(write);
});
}
3:fs 复制文件夹
/**
* 复制文件夹
* @param from
* @param to
* @param callback
*/
copyFolder: (from, to, callback) => {
fs.access(to, (err) => {
if (err) {
if (err) {callback('no');}
mkdir(to, (err) => {
if (err) {callback('no');}
globalMethods.copyFolder(from, to, callback);
});
}
fs.readdir(from, (err, files) => {
if (err) {callback('no');}
files.forEach((file) => {
const targetPath = from + '/' + file;
let toPath = to + '/' + file;
fs.stat(targetPath, (err, stat) => {
if (err) {callback('no');}
if (stat.isDirectory()) {
globalMethods.copyFolder(targetPath, toPath, callback);
} else {
globalMethods.copyLargeFile(toPath, targetPath,).then(() => {
callback('yes');
}).catch(() => {
callback('no');
});
}
});
});
});
});
}
4:异步删除文件夹
/**
* 异步删除文件夹
* */
rmdirFileAsync: (dir) => {
return new Promise((resolve, reject) => {
fs.access(dir, err => {
if (err) {
resolve();
}
fs.stat(dir, function (err, status) {
if (err) {reject(`fs.stat error: ${err}`);}
if (status.isDirectory()) { //是文件夹
fs.readdir(dir, function (err, file) {
if (err) {reject(`fs.stat error: ${err}`);}
let res = file.map((item) => globalMethods.rmdirFileAsync(path.join(dir, item)));
Promise.all(res).then( () => { //当所有的子文件都删除后就删除当前文件夹
fs.rmdir(dir, (err) =>{
if (err) {reject(`fs.stat error: ${err}`);}
resolve();
});
});
});
} else {
fs.unlink(dir, (err) =>{
if (err) {reject(`fs.stat error: ${err}`);}
resolve();
});
}
});
});
});
}
另外在查阅相关内容时,在github上看到有对这些io操作疯转较好的一个插件,将链接放置于此,有需要可以进行查看;fs-extra