簡體   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