如何获取流或文件描述符的当前偏移量?
How to get current offset of stream or file descriptor?
在Node.js中,是否有任何方法可以获取文件描述符或流的当前偏移量?目前可以set the offset of a file descriptor,但是好像没有办法得到
在 C 中,获取文件流的偏移量是通过 ftell
, and a file descriptor via lseek(fd, 0, SEEK_CUR)
完成的。
例子
如果 Node.js 程序在以附加模式打开文件后需要检查文件中是否有先前数据,在这种情况下调用 ftell
会有所帮助。这可以在 C 中完成,如下所示:
#include <stdio.h>
int main() {
FILE* f = fopen("test.txt", "a");
fprintf(f, ftell(f) ? "Subsequent line\n" : "First line\n");
fclose(f);
}
运行以上程序三次,test.txt
变为:
First line
Subsequent line
Subsequent line
现有技术
- GitHub 针对旧版本节点提交的问题。讨论中提到了
bytesWritten
和bytesEmitted
,两者都不等同于ftell
(在上面的C例子中,第一次打开文件时写入的字节总是0)。 https://github.com/nodejs/node-v0.x-archive/issues/1527.
fs-ext
NPM 包。公开低级别 lseek
以供 Node.js 使用。 https://www.npmjs.com/package/fs-ext.
fs.read有位置参数。
fs.read(fd, buffer, offset, length, position, callback)
位置参数在这里很重要。
除非我不能正确理解你的问题,否则这是否能满足你的需要?
node.js 中没有 ftell()
或 fseek()
的等效项,我不太确定为什么。相反,您通常使用 fs.read()
或 fs.write()
指定您想要读取或写入的位置。如果你只想按顺序写入一堆数据或者你想要缓冲写入,那么你通常会使用一个为你缓冲和排序的流。
相反,如果您想知道数据将追加到哪里,您可以获取当前文件长度,然后使用该当前文件长度来了解您是否在打开文件进行追加后位于文件开头。
这里是 node.js 代码,其功能类似于您的 C 代码。
const fs = require('fs');
async function myFunc() {
let handle = await fs.promises.open("test.txt");
try {
const {size} = await handle.stat();
await handle.appendFile(size ? "Subsequent line\n" : "First line\n");
} finally {
await handle.close();
}
}
而且,如果你像这样调用它三次:
async function test() {
await myFunc();
await myFunc();
await myFunc();
}
test();
您将在文件中获得所需的三行:
First line
Subsequent line
Subsequent line
在Node.js中,是否有任何方法可以获取文件描述符或流的当前偏移量?目前可以set the offset of a file descriptor,但是好像没有办法得到
在 C 中,获取文件流的偏移量是通过 ftell
, and a file descriptor via lseek(fd, 0, SEEK_CUR)
完成的。
例子
如果 Node.js 程序在以附加模式打开文件后需要检查文件中是否有先前数据,在这种情况下调用 ftell
会有所帮助。这可以在 C 中完成,如下所示:
#include <stdio.h>
int main() {
FILE* f = fopen("test.txt", "a");
fprintf(f, ftell(f) ? "Subsequent line\n" : "First line\n");
fclose(f);
}
运行以上程序三次,test.txt
变为:
First line
Subsequent line
Subsequent line
现有技术
- GitHub 针对旧版本节点提交的问题。讨论中提到了
bytesWritten
和bytesEmitted
,两者都不等同于ftell
(在上面的C例子中,第一次打开文件时写入的字节总是0)。 https://github.com/nodejs/node-v0.x-archive/issues/1527. fs-ext
NPM 包。公开低级别lseek
以供 Node.js 使用。 https://www.npmjs.com/package/fs-ext.
fs.read有位置参数。
fs.read(fd, buffer, offset, length, position, callback)
位置参数在这里很重要。
除非我不能正确理解你的问题,否则这是否能满足你的需要?
node.js 中没有 ftell()
或 fseek()
的等效项,我不太确定为什么。相反,您通常使用 fs.read()
或 fs.write()
指定您想要读取或写入的位置。如果你只想按顺序写入一堆数据或者你想要缓冲写入,那么你通常会使用一个为你缓冲和排序的流。
相反,如果您想知道数据将追加到哪里,您可以获取当前文件长度,然后使用该当前文件长度来了解您是否在打开文件进行追加后位于文件开头。
这里是 node.js 代码,其功能类似于您的 C 代码。
const fs = require('fs');
async function myFunc() {
let handle = await fs.promises.open("test.txt");
try {
const {size} = await handle.stat();
await handle.appendFile(size ? "Subsequent line\n" : "First line\n");
} finally {
await handle.close();
}
}
而且,如果你像这样调用它三次:
async function test() {
await myFunc();
await myFunc();
await myFunc();
}
test();
您将在文件中获得所需的三行:
First line
Subsequent line
Subsequent line