文件操作,关闭可读可写流
场景:分片上传,分片文件全部传输完毕后,将小文件进行合并:
/**
* @method 合并文件
* @param {array} file_path_arr 文件路径数组,注意文件路径要按照分片顺序,从小到大排列
* @param {string} target_path 目标文件地址
* @returns {null} 注意使用了shift方法,会将传入的数据逐步的清空
*/
exports.mergeChunks = function(file_path_arr, target_path) {
return new Promise(async (resolve, reject) => {
try{
let targetStream = fs.createWriteStream(target_path);
let readStream = function(paths_arr, targetStream) {
let file_path = paths_arr.shift();
let originStream = fs.createReadStream(file_path);
originStream.pipe(targetStream, {end: false});
originStream.on('end', async () => {
if(paths_arr.length > 0) {
readStream(paths_arr, targetStream);
} else {
resolve();
}
});
};
readStream(file_path_arr, targetStream);
}catch(err) {
if(err) reject(err);
}
})
}
此时,突然需要删除以上传的文件,会报无权限操作:operation not permitted
通过windows任务管理器中的资源监视器,查看搜索关联的句柄,确实自身的Node进程对相关文件有占用(红色框关键字搜索)

审视代码,发现需要关闭流,即可放开进程对文件的占用:
/**
* @method 合并文件
* @param {array} file_path_arr 文件路径数组,注意文件路径要按照分片顺序,从小到大排列
* @param {string} target_path 目标文件地址
* @returns {null} 注意使用了shift方法,会将传入的数据逐步的清空
*/
exports.mergeChunks = function(file_path_arr, target_path) {
return new Promise(async (resolve, reject) => {
try{
let targetStream = fs.createWriteStream(target_path);
let readStream = function(paths_arr, targetStream) {
let file_path = paths_arr.shift();
let originStream = fs.createReadStream(file_path);
originStream.pipe(targetStream, {end: false});
originStream.on('end', async () => {
if(paths_arr.length > 0) {
readStream(paths_arr, targetStream);
} else {
// 关闭流
targetStream.close();
originStream.close();
resolve();
}
});
};
readStream(file_path_arr, targetStream);
}catch(err) {
if(err) reject(err);
}
})
}
```

浙公网安备 33010602011771号