从 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);
上的讨论
我通过 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 offs.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);
上的讨论