Nodejs 求解,无法删除 上传文件遗留的临时文件

Nodejs 求解,无法删除 上传文件遗留的临时文件

指定node app目录tmp为临时文件夹,上传图片之后里面会有大量临时文件 下面是我清除临时文件的代码:

	//console.log(files);
	files.forEach(function(file){
		console.log(file);
		fs.unlink(file, function(){
			console.log('=============');
			console.log(file);
		});
	});
});```

文件都打印出来了,unlink里也打印出来了,执行完之后tmp 里头的文件一个没少,没有报错,

上面是用遍历批量删除文件的(顺便问一句,node有可以直接清空文件夹的方法么),
可是我换成下面这种,只删除一个文件,竟然就成功了,
```fs.unlink('./tmp/350d03ee9e75e042081385cb7fa9429e', function(){
	console.log(fs.readdirSync('./tmp'));
});```
小弟不知所谓,求大虾解释~


另外,说句与问题无关 的,貌似上面代码不像JS,竟然可以不用闭包就可以使第一次和第二次打印file次序一致,牛掰

3 回复

Node.js 求解:无法删除上传文件遗留的临时文件

问题描述:

在使用 Node.js 处理文件上传时,发现上传完成后临时文件并未被正确删除。尝试通过遍历临时文件夹并删除文件,但没有成功。

代码示例:

以下是你的代码,用于遍历并删除临时文件夹中的文件:

const fs = require('fs');
const path = require('path');

fs.readdir('./tmp', function(err, files) {
    if (err) {
        console.error("无法读取文件夹:", err);
        return;
    }

    files.forEach(function(file) {
        const filePath = path.join(__dirname, 'tmp', file);
        console.log(filePath);

        fs.unlink(filePath, function(err) {
            if (err) {
                console.error("无法删除文件:", err);
                return;
            }
            console.log('=============');
            console.log(filePath);
        });
    });
});

问题分析:

  1. 路径问题:在 fs.unlink 中直接使用文件名可能导致路径不正确。
  2. 异步操作fs.readdir 是异步的,而 fs.unlink 也是异步的。如果在删除所有文件之前就结束了程序,可能会导致文件未被删除。
  3. 错误处理:你需要确保在删除文件时捕获并处理可能的错误。

解决方案:

为了确保所有文件都被正确删除,可以使用递归函数或使用第三方库如 rimraf 来简化操作。

使用 rimraf 库:

首先安装 rimraf

npm install rimraf --save

然后修改代码:

const rimraf = require('rimraf');

rimraf('./tmp/*', function(err) {
    if (err) {
        console.error("无法删除文件:", err);
        return;
    }
    console.log('所有临时文件已删除');
});
使用递归函数:

如果你不想使用第三方库,可以使用递归函数来确保所有文件都被删除:

const fs = require('fs');
const path = require('path');

function deleteFiles(directory, callback) {
    fs.readdir(directory, function(err, files) {
        if (err) {
            callback(err);
            return;
        }

        let remaining = files.length;

        if (remaining === 0) {
            callback();
            return;
        }

        files.forEach(function(file) {
            const filePath = path.join(directory, file);
            fs.unlink(filePath, function(err) {
                if (err) {
                    callback(err);
                    return;
                }
                remaining--;
                if (remaining === 0) {
                    callback();
                }
            });
        });
    });
}

deleteFiles('./tmp', function(err) {
    if (err) {
        console.error("删除文件时发生错误:", err);
    } else {
        console.log('所有临时文件已删除');
    }
});

总结:

  • 确保使用正确的路径。
  • 使用递归函数或第三方库来处理异步删除操作。
  • 捕获并处理可能的错误。

希望这些解决方案能帮助你解决文件删除的问题。


擦,找到问题了,原来file打印出的只是文件名,不包含路径!

根据你的描述,你遇到了在 Node.js 中删除临时文件失败的问题。从你的代码来看,问题可能出在 fs.unlink 方法的路径处理上。

当你使用 fs.readdir 读取目录中的文件时,得到的是相对路径。而在调用 fs.unlink 删除文件时,如果传递的是相对路径,可能会导致找不到文件的问题。

解决方案

你可以尝试使用绝对路径来删除文件。这样可以确保路径正确无误。以下是一个修改后的代码示例:

const fs = require('fs');
const path = require('path');

fs.readdir(path.join(__dirname, 'tmp'), (err, files) => {
    if (err) {
        console.error("Error reading directory:", err);
        return;
    }

    files.forEach(file => {
        const filePath = path.join(__dirname, 'tmp', file);
        fs.unlink(filePath, err => {
            if (err) {
                console.error(`Error deleting file ${filePath}:`, err);
            } else {
                console.log(`File deleted: ${filePath}`);
            }
        });
    });
});

解释

  1. 引入模块:使用 path 模块来处理路径。
  2. 读取目录:使用 path.join(__dirname, 'tmp') 来获取 tmp 目录的绝对路径。
  3. 遍历文件:在遍历文件列表时,将每个文件的相对路径转换为绝对路径。
  4. 删除文件:使用绝对路径调用 fs.unlink 删除文件,并在回调中处理错误或成功的消息。

注意事项

  • 确保你有足够的权限删除这些文件。
  • 如果 tmp 目录中有子目录,你需要递归地删除它们。上述代码仅适用于单层目录。
  • 如果 fs.unlink 报错,请检查是否有其他进程正在使用这些文件,或者是否路径有误。

这样修改后,你应该能够成功删除 tmp 目录下的临时文件。

回到顶部