我们正常做文件操作时要删除一个文件夹,必须先将文件夹清空,所以要遍历这个文件夹。 我要删除的目录结构为:
我的代码如下:
async function deleteF(filePath) {
let stat = await fs.promises.stat(filePath)
if (stat.isFile()) {
await fs.unlink(filePath)
} else {
let files = await fs.promises.readdir(filePath)
files = files.map(file => deleteF(path.join(filePath, file)))
await Promise.all(files)
await fs.promises.rmdir(filePath)
}
}
却报出了以下错误:
node:internal/process/promises:279
triggerUncaughtException(err, true /* fromPromise */);
^
[Error: ENOTEMPTY: directory not empty, rmdir 'C:\Users\Administrator\Desktop\毕业设计\JSCloudDisk\cloudDiskBack\disk\personalDisk\667650048\学习资料\空\1\2\3'] {
errno: -4051,
code: 'ENOTEMPTY',
syscall: 'rmdir',
path: 'C:\\Users\\Administrator\\Desktop\\毕业设计\\JSCloudDisk\\cloudDiskBack\\disk\\personalDisk\\667650048\\学习资料\\空\\1\\2\\3'
}
[nodemon] app crashed - waiting for file changes before starting...
我本以为是由于异步操作,在未删除子目录的情况下就开始删除父目录,导致报错
于是我又做了一个纯同步的:
async function deleteAsync(filePath){
let stat = fs.statSync(filePath)
if(!fs.existsSync(filePath)){
return
}
if(stat.isFile()){
fs.unlinkSync(filePath)
}else{
let files = fs.readdirSync(filePath)
for(let i in files){
deleteAsync(path.join(filePath,files[i]))
}
//将删除操作置入宏任务队列排队
setTimeout(()=>{
fs.rmdirSync(filePath)
})
}
}
但是仍然报错
node:internal/fs/utils:347
throw err;
^
Error: ENOTEMPTY: directory not empty, rmdir 'C:\Users\Administrator\Desktop\毕业设计\JSCloudDisk\cloudDiskBack\disk\personalDisk\667650048\学习资料\空'
at Object.rmdirSync (node:fs:1217:10)
at Timeout._onTimeout (C:\Users\Administrator\Desktop\毕业设计\JSCloudDisk\cloudDiskBack\src\modules\fsModule.js:50:16)
at listOnTimeout (node:internal/timers:559:17)
at processTimers (node:internal/timers:502:7) {
errno: -4051,
syscall: 'rmdir',
code: 'ENOTEMPTY',
path: 'C:\\Users\\Administrator\\Desktop\\毕业设计\\JSCloudDisk\\cloudDiskBack\\disk\\personalDisk\\667650048\\学习资料\\空'
}
[nodemon] app crashed - waiting for file changes before starting...
有大佬能解决这个问题吗?