Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

fs.readFileSync always returns empty string

I have a script that writes data from an API to some files. I have an object the contains the file descriptors for each file:

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+');
}

Then I have some code that uses fs.write to write lines of csv to the file in batches. This part is working fine. I have well formed csv files. Now I need to read the contents of the entire file as a string. This is how I'm trying to do it:

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

But for some reason I am always getting an empty string. I have confirmed that fs.readFileSync is in fact returning a Buffer by using console.log and dropping the toString() method.

I'm really stuck on this so any help will be greatly appreciated. Thanks in advance. Here's some additional info regarding my node version and OS:

$ 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
like image 561
Vicky Vargas Avatar asked Jun 26 '26 16:06

Vicky Vargas


2 Answers

For others who have the same problem.

For me, the only way to have a non-empty string was to use fs.readFile instead of fs.readFileSync.

I use a Mac and I was trying to read a file that node create itself. If I try to read another file it works.

fs.readFile(file, (err, data)=>{
    if(err){
        console.log(err)
        throw err
    }else{
        let file_content = data.toString('utf8')
        // your code here
    }
})
like image 104
bormat Avatar answered Jun 29 '26 04:06

bormat


Try to call readFileSync like this readFileSync(csvFds['file1'], 'utf-8'). It ought to return a string. Or you can omit the argument and then provide the encoding when calling toString method e.g. readFileSync(csvFds['file1']).toString('utf-8')

like image 45
mic4ael Avatar answered Jun 29 '26 06:06

mic4ael