这就是我在完美世界中会做的事情:
fs.open('somepath', 'r+', function(err, fd) {
fs.write(fd, 'somedata', function(err, written, string) {
fs.rewind(fd, 0) //this doesn't exist
})
})
这是我当前的实现:
return async.waterfall([
function(next) {
//opening a file descriptor to write some data
return fs.open('somepath', 'w+', next)
},
function(fd, next) {
//writing the data
return fs.write(fd, 'somedata', function(err, written, string) {
return next(null, fd)
})
},
function(fd, next) {
//closing the file descriptor
return fs.close(fd, next)
},
function(next) {
//open again to reset cursor position
return fs.open('somepath', 'r', next)
}
], function(err, fd) {
//fd cursor is now at beginning of the file
})
我尝试在不关闭 fd
的情况下重置位置:
fs.read(fd, new Buffer(0), 0, 0, 0, fn)
但这会抛出 错误:偏移量超出范围
。
有没有一种方法可以在不执行这种可怕的hack的情况下重置光标?
/e: The offset is out of bounds 错误来自this exception .通过将缓冲区大小设置为 1 可以轻松修复,但它不会倒回光标。可能是因为我们要求函数不读取任何内容。
请您参考如下方法:
今天的答案是不在核心里,纯javascript加不进去。
有一个扩展 node-fs-ext添加了一个 seek
函数来移动 fd 光标。这是在 C++ 中完成的 here .