如果文件不存在,fs.readFileSync不会做任何事情

时间:2016-07-28 11:23:07

标签: node.js fs

我正在尝试使用以下代码阅读文件内容:

 var content = fs.readFileSync(filename);

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

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

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

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;
}

修改

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

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

2 个答案:

答案 0 :(得分:0)

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

#!/bin/bash
if [ "$1" == "" ]; then
  echo "USAGE: $0 [filename]"
  exit;
fi
# rm xx* *.conf'; # uncomment to re-un
csplit "$1" '/^\s*server\s*{*$/' {*}
for i in xx*; do
  new=$(grep -oPm1 '(?<=server_name).+(?=;)' $i|sed -e 's/\(\w\) /\1_/g'|xargs);
  if [[ -e $new.conf ]] ; then
    cat "$i">>$new.conf
    rm "$i"
  else
    mv "$i" $new.conf
  fi
done

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

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

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

console.log(content);

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

答案 1 :(得分:-1)

编写一个返回字符串或null

的函数
self