从 Node.js 中的文件末尾读取确定大小的字符串

Reading a determined size of a string from end of file in Node.js

我通过 fs.appendFileSync() 向文件附加了一个字符串,然后我想从该文件中获取它。我尝试使用 fs.readSync 。但它 returns Error: Unknown encoding: 6 。如何从 Node.js 中的文件中获取附加字符串?我知道字符串的大小。 我的附加代码:

fs.appendFileSync('A.dmg','behdad');

并读取附加的字符串:

var fd = fs.openSync('A.dmg','w+');
var buffer = '';
var res = fs.readSync(fd,buffer,0,6,fs.statSync('A.dmg').size);
console.log(buffer);
console.log(res);

已编辑:

var fs = require('fs');
var fd = fs.openSync('A.dmg','r+');
var size = fs.statSync('A.dmg').size;
var buffer = Buffer.alloc(size);
var res = fs.readSync(fd, buffer, 0, size, 0);
console.log(buffer.toString());
console.log(res);

首先,了解r+w+模式的区别:

r+: Open a text file for update (that is, for both reading and writing).
w+: Open a text file for update (reading and writing), first truncating the file to zero length if it exists or creating the file if it does not exist.

既然你想打开文件进行阅读并可能稍后更新它,你应该以 r+ 模式打开文件。

其次,您代码中传递给 fs.readSync() 的最后一个参数对我来说没有意义。最后一个参数是 position。如果真的要读取这6个字符,那为什么要把文件指针的位置指定为6呢?您想从头读取文件,对吗?

现在,回到要点:代码中传递给 readSync() 的第二个参数是数据类型:String,它是不可变的。所以,现在对 fs.readSync() 的调用又回到了旧语法...

fs.readSync(fd, length, position, encoding): Synchronous version of fs.read. Returns an array [data, bytesRead].

...它认为 6 是您要指定的编码,显然不是这种情况。

因此,如果您使用的是新版本的节点,您的代码应该类似于:

var fs = require('fs');
fs.appendFileSync('A.dmg','behdad');
var fd = fs.openSync('A.dmg','r+');
var size = fs.statSync('A.dmg').size;
var buffer = Buffer.alloc(size);
var res = fs.readSync(fd, buffer, 0, size, 0);
console.log(buffer.toString());
console.log(res);

如果您使用的是旧版本的节点:

var fs = require('fs');
fs.appendFileSync('A.dmg','behdad');
var fd = fs.openSync('A.dmg','r+');
var size = fs.statSync('A.dmg').size;
var res = fs.readSync(fd, size, 0, 'utf8');
console.log(res);

阅读 https://github.com/nodejs/node/issues/2820

上的讨论