【问题标题】:Strange error while deleting a file using the module fs in node js使用节点 js 中的模块 fs 删除文件时出现奇怪的错误
【发布时间】:2017-04-09 19:28:18
【问题描述】:

我正在尝试使用模块 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 次......但文件夹中只有一个文件......具有该名称

【问题讨论】:

  • 如果包含堆栈跟踪会更好
  • 您何时使用unlinkSync 时如何提供callback?如果你想要回调,它应该是unlink

标签: javascript node.js fs


【解决方案1】:

以下是问题:-

你正在 fs.stat 中进行 异步调用 for loop。而for 是一个sync 块。在您的for 循环结束后,它可能会被调用。最后,它会调用最后一个值为i的所有回调。

由于i 的值相同,它会多次搜索同一个文件并最终抛出错误。

您的问题有两种解决方案。

1) 使用fs.statSyncfs.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);

【讨论】:

  • 非常感谢!现在我明白了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2018-09-22
相关资源
最近更新 更多