2016-07-28 56 views
0

我想讀這個代碼的文件內容:fs.readFileSync並不做任何事情的情況下,該文件不存在

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

編輯:

這個問題實際上是在IDE中我一直在使用c9.io

當我跑在本地,我接收到錯誤。 有趣的發現。

+2

當我在一個不存在的文件上運行該命令時,它會拋出一個異常:'錯誤:ENOENT:沒有這樣的文件或目錄,打開'not-here.txt'。你確定你沒有捕捉和默默地忽略異常嗎? – MrWillihog

+0

確實會解釋它。我在瀑布中調用了該方法,即使我將控制檯日誌放在應該捕獲錯誤的地方,或者我放了一個斷點,它也不會被執行。我沒有其他處理。雖然會做更好的檢查。 –

回答

-1

編寫返回一個字符串或空值的函數

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 
0

你可以嘗試先檢查它的存在:

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

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

console.log(content); 

UPDATE:提供圍繞異步方法幫助:

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文檔以獲取更多詳細信息。

+0

謝謝你的建議。現在它掛在這個部分:'fs.accessAsync(filename,fs.R_OK)' –

+0

爲什麼你總是使用'* sync'方法?你的代碼將被阻塞,直到返回值。因爲你已經使用'async',你可以返回'fs.readFile'的值,例如'fs.readFile(callback)' – freshnode

+0

不知道我理解。我對節點很陌生,所以我可能會做錯事。但我認爲我必須將其作爲「同步」方法來完成,因爲我需要等到獲取所有值後再繼續。 –

相關問題