[英]Strange error while deleting a file using the module fs in node js
我正在尝试使用模块fs删除文件夹中的某些文件。 仅当文件的旧时间(修改时间)超过1分钟时,才需要删除该文件。 但是我收到一个奇怪的错误。
var fs = require("fs");
var files = fs.readdirSync("./folder");
for (var i in files) {
fs.stat("./folder/" + files[i], function (err, stats) {
var currentTimestamp = Math.round(new Date().getTime() / 1000);
var fileTimestamp = Math.round((new Date(stats.mtime).getTime() / 1000));
if ((currentTimestamp - fileTimestamp) > 60 * 1) {
//Elimino il file di cache
fs.unlinkSync("./folder/" + files[i], function (err) {
if (err) {
console.log(err);
} else {
console.log("File deleted");
}
});
}
});
}
不幸的是我得到这个错误
fs.js:765
return binding.unlink(pathModule._makeLong(path));
^
Error: ENOENT, no such file or directory
为什么会这样? 我该如何解决? 谢谢
编辑
我在fs.unlinkSync("./folder/" + files[i], function (err)
之前创建了一个日志,发现该fs.unlinkSync("./folder/" + files[i], function (err)
被同一文件调用了两次,但是文件夹中只有一个文件....那个名字
问题如下:-
您正在fs.stat
中for loop
的异步调用 。 而for
是一个sync
块。 有可能在for
循环结束后会调用它。 最后,它将调用最后一个值为i
所有回调。
由于i
值相同,因此它将多次搜索同一文件,最终将引发错误。
您的问题有两种解决方案。
1)使用fs.statSync
和fs.unlinkSync
以便进行同步调用。 在整个循环执行之前, i
的值不会增加,但这不是执行此操作的好方法。
2)使用Array.forEach
因为它是一个async
进程,因此它将在每个文件上调用该函数。 我更喜欢这种方法。
我已经修改了您的问题,并使其与Array.forEach
一起使用。
var fs = require("fs");
var files = fs.readdirSync("./Folder");
var deleteFile = function (fileName) {
fs.stat("./Folder/" + fileName, function (err, stats) {
var currentTimestamp = Math.round(new Date().getTime() / 1000);
var fileTimestamp = Math.round((new Date(stats.mtime).getTime() / 1000));
if ((currentTimestamp - fileTimestamp) > 60 * 1) {
//Elimino il file di cache
console.log('deleting ',fileName)
fs.unlink("./Folder/" + fileName, function (err) {
if (err) {
console.log(err);
} else {
console.log("File deleted");
}
});
}
});
}
files.forEach(deleteFile);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.