node环境文件操作函数封装
在Node.js环境下,经常需要对文件和文件夹进行操作,例如复制、删除等。为了更方便地进行这些操作,可以封装一些函数来简化代码。
复制文件夹函数
copyFolder函数用于复制一个文件夹到指定路径。
参数
copiedPath:要复制的文件夹的路径。resultPath:复制后的目标路径。
操作步骤
- 创建目标文件夹:使用
fs.mkdirSync函数在指定路径下创建目标文件夹。 - 获取源文件夹中的所有文件和文件夹:使用
fs.readdirSync函数读取源文件夹中的所有文件和文件夹。 - 遍历源文件夹中的文件和文件夹:
- 如果是文件,使用流的形式创建文件,并将源文件内容写入目标文件。
- 如果是文件夹,递归调用
copyFolder函数,继续复制文件夹中的内容到目标文件夹。
该函数利用了fs模块提供的createReadStream和createWriteStream函数,可以处理大文件的读写。另外,使用path模块的join函数来拼接路径。
const copyFolder = (copiedPath, resultPath) => {
function createDir(dirPath) {
fs.mkdirSync(dirPath);
}
if (fs.existsSync(copiedPath)) {
createDir(resultPath);
const files = fs.readdirSync(copiedPath, { withFileTypes: true });
for (let i = 0; i < files.length; i += 1) {
const cf = files[i];
const ccp = path.join(copiedPath, cf.name);
const crp = path.join(resultPath, cf.name);
if (cf.isFile()) {
// 创建文件,使用流的形式可以读写大文件
const readStream = fs.createReadStream(ccp);
const writeStream = fs.createWriteStream(crp);
readStream.pipe(writeStream);
} else {
try {
fs.accessSync(path.join(crp, ".."), fs.constants.W_OK);
copyFolder(ccp, crp, true);
} catch (error) {
console.log("folder write error:", error);
}
}
}
} else {
console.log("do not exist path: ", copiedPath);
}
};
删除文件夹函数
deleteFolder函数用于递归地删除指定路径下的所有文件和文件夹。
参数
path:要删除的文件夹的路径。
操作步骤
- 判断路径是否存在:使用
fs.existsSync函数判断指定路径是否存在。 - 如果路径存在,获取路径下的所有文件和文件夹:使用
fs.readdirSync函数读取路径下的所有文件和文件夹。 - 遍历文件和文件夹:
- 如果是文件夹,递归调用
deleteFolder函数,删除文件夹内的内容。 - 如果是文件,直接使用
fs.unlinkSync函数删除文件。
- 如果是文件夹,递归调用
- 最后,使用
fs.rmdirSync函数删除当前文件夹。
const deleteFolder = (path) => {
let files = [];
if (fs.existsSync(path)) {
files = fs.readdirSync(path);
files.forEach(function (file, _) {
let curPath = path + "/" + file;
if (fs.statSync(curPath).isDirectory()) {
// 递归删除子文件夹
deleteFolder(curPath);
} else {
// 删除文件
fs.unlinkSync(curPath);
}
});
fs.rmdirSync(path);
}
};
递归删除文件夹函数
rmdir函数用于递归删除指定路径下的所有文件和文件夹。
参数
filePath:要删除的文件夹或文件的路径。callback:删除完成后的回调函数。
操作步骤
- 首先判断
filePath的类型(文件还是文件夹):使用fs.stat函数获取文件或文件夹的信息。 - 如果是文件,直接使用
fs.unlink函数删除文件。 - 如果是文件夹,通过
fs.readdir函数获取文件夹中的所有内容,返回一个数组。 - 将数组中每个元素与
filePath拼接,得到子文件夹或子文件的路径。 - 使用递归方式调用
rmdir函数,递归删除子文件夹或子文件。 - 最后使用
fs.rmdir函数删除当前文件夹。
const rmdir = (filePath, callback) => {
fs.stat(filePath, function (err, stat) {
if (err) return console.log(err);
if (stat.isFile()) {
fs.unlink(filePath, callback);
} else {
fs.readdir(filePath, function (err, data) {
if (err) return console.log(err);
let dirs = data.map((dir) => path.join(filePath, dir));
let index = 0;
!(function next() {
if (index === dirs.length) {
fs.rmdir(filePath, callback);
} else {
rmdir(dirs[index++], next);
}
})();
});
}
});
};