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

标签 node.js offset file-descriptor

在 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.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/

相关文章:

node.js - AWS Lambda 无法在没有 VPC 的情况下调用另一个 AWS Lambda - NodeJs

angularjs - Node.js 进程在 aws 实例上被杀死

node.js - 使 Node Redis get() 同步

JavaScript EventSource SSE 未在浏览器中触发

javascript - 获取 div 在窗口滚动时的顶部偏移量

c - "peek"入eventfd内部计数器值不变

audio - 如何使用 ffmpeg 向音频文件添加偏移或延迟?

java - 如何知道java中文本文件中行首的偏移量?

c++ - write(2) 返回零意味着什么?我最终会取得进展(非零结果)吗?

java - Apache HttpAsyncClient 中的文件描述符泄漏