【问题标题】:fs.readFileSync doesn't do anything in case the file doesn't exist如果文件不存在,fs.readFileSync 不会执行任何操作
【发布时间】:2016-07-28 21:21:29
【问题描述】:

我正在尝试使用此代码读取文件的内容:

 var content = fs.readFileSync(filename);

当存在具有此类文件名的文件时,它可以正常工作。但是,如果文件不存在,它不会做任何事情。它永远挂在那里。

一种解决方案可能是在我尝试读取文件之前检查文件是否存在,但我希望这将成为 fs 模块的一部分,以便它返回未定义或我可以方便地处理的任何错误。

这几乎是我的全部代码,你能看到任何问题吗?我不能。

for (var i=0; i<configFiles.length;i++){
    waterfallMain(configFiles[i]);
   }

//var importDefinition = config.importDefinition;
function waterfallMain(configFile){
    async.waterfall([
            function(callback){
                sftpHandler.downloadFile(credentials.host, credentials.username, credentials.password, credentials.path+configFile.importFileName, callback);
                console.log("Downloading done. Changing file encoding and reading data.");
                readFileSync_encoding(configFile.importFileName, "ISO-8859-1", callback);
            },
            function(fileData, callback) {
                mainProcess(fileData, callback);
            },
            function(data, callback) {
                postImportDefinition(data,  callback);
            },

            function(data, uri, callback) {
                postData(data, uri, callback);
            },

            function(syncUri, callback) {
                getSyncResponseInIntervals(syncUri, callback);
            }],

        // the bonus final callback function
        function(err, status) {
            if (err) {
                console.log(err);
            }
            console.log(status);
            return;
        });
}



function readFileSync_encoding(filename, encoding, callback) {
      var content = fs.readFileSync(filename);
      callback(null, iconvlite.decode(content, encoding));
      return;
}

编辑:

问题实际上出在我一直在使用 c9.io 的 IDE 中

当我在本地运行它时,我收到了错误。 有趣的发现。

【问题讨论】:

  • 当我在一个不存在的文件上运行该命令时,它会引发异常:Error: ENOENT: no such file or directory, open 'not-here.txt'。你确定你没有捕获并默默地忽略异常吗?
  • 确实可以解释。我在瀑布中调用了该方法,即使我将控制台日志放在我应该捕获错误的位置,或者我放置了一个断点,它也不会被执行。我没有其他处理。不过会做更好的检查。

标签: node.js fs


【解决方案1】:

您可以先尝试检查它的存在:

var fs = require('fs');
var content = '';

if(fs.accessSync(filename, fs.R_OK)) {
 content = fs.readFileSync(filename);
}

console.log(content);

更新:提供有关异步方法的帮助:

function waterfallMain(configFile){
    async.waterfall([
            function(callback){
              fs.readFile(configFile, callback);
            },
            function(fileData, callback) {
               //fileData will now contain the contents of the "configFile", if it exists.
               mainProcess(fileData, callback);
            }
    ], function(err, status) {
        if (err) {
            console.log(err);
        }
        console.log(status);
    });

有关更多详细信息,请参阅fs.accessSync 文档。

【讨论】:

  • 感谢您的建议。现在它挂在这部分:fs.accessAsync(filename, fs.R_OK)
  • 为什么还要使用*sync 方法?在返回值之前,您的代码将阻塞。由于您已经在使用async,因此您可以只返回fs.readFile 的值,例如fs.readFile(callback)
  • 不确定我是否理解。我是节点新手,所以我可能做错了什么。但我认为我必须将其作为 sync 方法来执行,因为我需要等到获得所有值之后才能进一步。
  • 查看更新后的答案,了解这如何适合您的项目。
  • async 不同步,顾名思义。它更多地是以更容易理解的方式构建代码。您应该避免使用*sync 方法,因为它们不会在负载下执行,因为整个过程会停止。也许this link 会回答你的一些问题。
【解决方案2】:

编写一个返回字符串或 null 的函数

 const Fs = require('fs');

 const readFile = (filename, encoding) => {

     try {
         return Fs.readFileSync(filename).toString(encoding);
     }
     catch (e) {
         return null;
     }
 };

 const contents = readFile(./somefile', 'utf8');
 // contents will be null if it doesn't exist or a string of utf8 if it does 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-26
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2021-05-15
    相关资源
    最近更新 更多