如何获取流或文件描述符的当前偏移量?

3
在Node.js中,有没有一种方法可以获取文件描述符或流的当前偏移量?目前,可以设置文件描述符的偏移量,但似乎没有办法获取它。
在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);
}

运行上述程序三次,test.txt 将变成:
First line
Subsequent line
Subsequent line

现有技术


1
在Node.js中没有与ftell()相对应的函数。通常的做法是,要么追加内容,要么使用fs.read()fs.write()方法指定position参数来进行读写操作。如果你只想按顺序写入一系列数据,那么可以使用流(stream)。当然,你也可以获取当前文件的长度,然后使用位置信息从文件末尾读取一定数量的字节,如果这正是你想做的。或者,你可以根据当前文件长度判断在以追加模式打开文件后是否位于文件的开头。 - jfriend00
2个回答

2
在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

@mxxk - 这个回答解决了你的问题吗? - jfriend00
是的@jfriend00,谢谢你。:) 一开始看起来似乎没有办法在Node.js中实现我所问的,但或许这会引起未来发展的关注,有一天这将成为可能。 - mxxk

0

fs.read函数有一个位置参数。

fs.read(fd, buffer, offset, length, position, callback)

这里的位置参数很重要。

除非我没有正确理解你的问题,否则这是否满足你的需求?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接