readFile(fd) does not read the whole file (at least on Windows, possibly other platforms)
- Version: v7.1.0
- Platform: Windows 10 64-bit
- Subsystem: fs
I wrote a small test that passes on Mac and Linux but throws on Windows:
var fs = require('fs');
var buffer = Buffer.alloc(8192);
var path = 'test-sparse-read-file';
var fd = fs.openSync(path, 'w+');
console.log('created or truncated, sparse file size is now: ' + fs.fstatSync(fd).size);
console.log('writing 1 byte at offset ' + (8192 - 1));
fs.writeSync(fd, Buffer.alloc(1, 1), 0, 1, 8192 - 1);
console.log('sparse file size is now: ' + fs.fstatSync(fd).size + '\r\n');
console.log('reading 8192 bytes using readSync()...');
var bytesRead = fs.readSync(fd, buffer, 0, 8192, 0);
if (bytesRead !== 8192) {
throw new Error('readSync() read ' + bytesRead + ' bytes');
} else {
console.log('readSync() read ' + bytesRead + ' bytes');
}
console.log('\r\nreading entire file using readFileSync()...');
var result = fs.readFileSync(fd);
if (result.length !== buffer.length) {
throw new Error('readFileSync returned a buffer with length ' + result.length);
} else {
console.log('readFileSync returned a buffer with length ' + result.length);
}
fs.closeSync(fd);
fs.unlinkSync(path);
console.log('\r\nPASSED');
Linux:
created or truncated, sparse file size is now: 0
writing 1 byte at offset 8191
sparse file size is now: 8192
reading 8192 bytes using readSync()...
readSync() read 8192 bytes
reading entire file using readFileSync()...
readFileSync returned a buffer with length 8192
PASSED
Windows:
created or truncated, sparse file size is now: 0
writing 1 byte at offset 8191
sparse file size is now: 8192
reading 8192 bytes using readSync()...
readSync() read 8192 bytes
reading entire file using readFileSync()...
C:\Users\Joran\test-sparse.js:22
throw new Error('readFileSync returned a buffer with length ' + result.length);
^
Error: readFileSync returned a buffer with length 0
at Object.<anonymous> (C:\Users\Joran\test-sparse.js:22:9)
at Module._compile (module.js:573:32)
at Object.Module._extensions..js (module.js:582:10)
at Module.load (module.js:490:32)
at tryModuleLoad (module.js:449:12)
at Function.Module._load (module.js:441:3)
at Module.runMain (module.js:607:10)
at run (bootstrap_node.js:420:7)
at startup (bootstrap_node.js:139:9)
at bootstrap_node.js:535:3
The test shows that the problem does not appear to be with read() but only with readFileSync().
readFile() has the same issue.