使用节点js中的模块fs删除文件时发生奇怪错误

时间:2014-07-11 19:20:44

标签: javascript node.js fs

我尝试使用模块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次......但是文件夹中只有一个文件....带有那个名字

1 个答案:

答案 0 :(得分:2)

以下是问题: -

您正在fs.stat进行for loop 异步通话forsync块。有可能在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);