fs.readFileSync始终返回空字符串

时间:2016-08-09 20:12:26

标签: javascript node.js file io

我有一个脚本可以将API中的数据写入某些文件。我有一个对象包含每个文件的文件描述符:

var csvFds = {
    'file1' : null,
    'file2' : null,
    'file3' : null,
    'file4' : null
};

for (var file in csvFds) {

    var dirPath = __dirname + '/files/' + file;

    try {
        fs.statSync(dirPath);
    }
    catch (e) {
        mkdirp.sync(dirPath, {mode: 0755});
    }

    csvFds[file] = fs.openSync(dirPath + '/' + moment().format("YYYY-MM-DDTHH:mm:ss[Z]") + '.csv', 'a+');
}

然后我有一些代码使用fs.write批量写入csv行。这部分工作正常。我有很好的csv文件。现在我需要将整个文件的内容作为字符串读取。这就是我尝试这样做的方式:

fs.readFileSync(csvFds['file1']).toString();

但由于某种原因,我总是得到一个空字符串。我已经确认fs.readFileSync实际上是通过使用console.log并删除toString()方法返回一个Buffer。

我真的坚持这一点,所以任何帮助将不胜感激。提前致谢。以下是有关我的节点版本和操作系统的一些其他信息:

$ node -v
v6.2.3-pre

$ uname -a
Darwin i-2.local 14.5.0 Darwin Kernel Version 14.5.0: Thu Jun 16 19:58:21 PDT 2016; root:xnu-2782.50.4~1/RELEASE_X86_64 x86_64

2 个答案:

答案 0 :(得分:0)

尝试像readFileSync这样致电readFileSync(csvFds['file1'], 'utf-8')。它应该返回一个字符串。或者您可以省略参数,然后在调用toString方法时提供编码,例如readFileSync(csvFds['file1']).toString('utf-8')

答案 1 :(得分:0)

针对其他有相同问题的人。

对我来说,拥有非空字符串的唯一方法是使用fs.readFile而不是fs.readFileSync。

我使用Mac,试图读取节点创建的文件。如果我尝试读取其他文件,则可以使用。

fs.readFile(file, (err, data)=>{
    if(err){
        console.log(err)
        throw err
    }else{
        let file_content = data.toString('utf8')
        // your code here
    }
})