文件操作,关闭可读可写流

场景:分片上传,分片文件全部传输完毕后,将小文件进行合并:

/**
 * @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);
        }
    })
}
```  
posted @ 2019-11-12 17:39  Mr_Kahn  阅读(337)  评论(0)    收藏  举报