繁体   English   中英

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

[英]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.statfor 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM