Node.js fs模块权限授予问题:文件夹删除与文件复制权限报错
Node.js 删除文件夹与复制文件权限问题解决
问题根源分析
rmdirSync无法删除非空文件夹:原代码使用rmdirSync删除playlist文件夹,但该方法仅支持删除空文件夹,若文件夹内有内容会直接抛出权限/操作不允许错误。- 提前对不存在的路径执行
chmodSync:代码开头就尝试修改playlist文件夹权限,若该文件夹原本不存在,此步骤会直接报错。 - 复制文件时目标路径错误:
copyFileSync仅传入文件夹路径,未指定目标文件名,导致所有文件都试图覆盖为同一个文件,引发权限或文件占用问题。 - 权限设置不足:文件夹需要执行权限(
S_IXUSR)才能进入操作,仅设置读/写权限无法正常进行后续文件操作。
修正后的代码
const fs = require('fs'); const path = require('path'); function sortTracks(dir) { const playlistDir = path.join(dir, "playlist"); // 递归删除已有文件夹(含内容),不存在则跳过 if (fs.existsSync(playlistDir)) { fs.rmSync(playlistDir, { recursive: true, force: true }); } // 创建文件夹并设置合理权限 fs.mkdirSync(playlistDir, { mode: 0o755 }); // 遍历文件并复制到目标文件夹 getAllFiles(dir, []).forEach(track => { const fileName = path.basename(track); const targetPath = path.join(playlistDir, fileName); // 确保原文件有可读权限 fs.chmodSync(track, 0o644); // 复制文件到目标路径(保留原文件名) fs.copyFileSync(track, targetPath); // 可选:设置目标文件权限 fs.chmodSync(targetPath, 0o644); }); }
关键修改说明
- 用
fs.rmSync替代rmdirSync,通过recursive: true实现递归删除非空文件夹,force: true避免文件夹不存在时抛出错误。 - 先判断文件夹存在状态再执行删除,避免对不存在的路径执行权限修改操作。
- 复制文件时通过
path.basename获取原文件名,构造完整目标路径,防止文件相互覆盖。 - 使用八进制数值(
0o开头)设置权限更直观:文件夹设为0o755(所有者读写执行,其他用户读执行),文件设为0o644(所有者读写,其他用户读)。
内容的提问来源于stack exchange,提问作者shestakov-dev
相关产品推荐
相关产品推荐

