在 Node.js 中,有什么方法可以获取文件描述符或流的当前偏移量吗?目前,可以set the offset of a file descriptor ,但是好像没有办法获取。
在 C 中,获取文件流的偏移量是通过 ftell
完成的。 ,以及通过 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);
}
运行上面的程序3次,test.txt
变为:
First line
Subsequent line
Subsequent line
现有技术
- 针对旧版本 Node 提交的 GitHub 问题。讨论中提到了
bytesWritten
和bytesEmissed
,它们都不等同于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 .
最佳答案
node.js 中没有与 ftell()
或 fseek()
等效的函数,我不太确定为什么。相反,您通常在使用 fs.read()
或 fs.write()
读取或写入时指定要读取或写入的位置。如果您只想顺序写入一堆数据或者想要缓冲写入,那么您通常会使用为您缓冲和排序的流。
相反,如果您想知道数据将附加到哪里,您可以获取当前文件长度,然后使用当前文件长度来了解打开文件进行附加后是否位于文件的开头。
这是执行与 C 代码类似的操作的 Node.js 代码。
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 - 如何获取流或文件描述符的当前偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60237517/