我尝试使用模块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)
之前做了一个日志,我看到用相同的文件调用了2次......但是文件夹中只有一个文件....带有那个名字
答案 0 :(得分:2)
以下是问题: -
您正在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);