【问题标题】:Using the Linux ABI (POSIX), what's the most efficient way to insert bytes at the beginning of a file? [duplicate]使用 Linux ABI (POSIX),在文件开头插入字节的最有效方法是什么? [复制]
【发布时间】:2012-10-20 21:58:24
【问题描述】:

可能重复:
C write in the middle of a binary file without overwriting any existing content

我正在编写一个偶尔需要在二进制文件开头插入 1-64k 数据的程序。 POSIX API / Linux ABI 没有insert(fd,buf,len) 函数调用。最有效的方法是什么?

【问题讨论】:

    标签: c linux posix


    【解决方案1】:

    您的选择是:

    1. 创建一个新文件,写入新数据并将旧数据复制到新文件,然后用新文件替换旧文件(内容)。
    2. 从文件末尾读取一个块,将该块写入其新位置,反复进行,向后遍历文件。

    (2) 的优点是它不会破坏符号链接或指向原始文件的多个链接。缺点(正如Keith Thompson 所指出的)是,如果它被中断,您就会丢失原始文件。

    (1) 的缺点是,如果您需要保留链接数量并通过符号链接工作,则必须将新文件复制回旧文件,因此需要进行更多复制。优点是复制比较简单,原文件直到结束才被破坏。

    选项 (2) 的代码还有另一个问题 — Write in the middle of a binary file without overwriting any existing content。在(二进制)文件的开头插入只是在文件中间插入的特定(甚至不是特殊)情况。

    【讨论】:

    • 谢谢。你是正确的stackoverflow.com/questions/10467711/… 是一个正确的解决方案。我不知道,也没有通过搜索找到它。
    • @vy32:我认为解决方案(根据我的简短阅读)无论如何都会复制文件的全部内容。如果您插入到中间,它会避免复制插入点之前的内容。如果您在开头插入,那不是优势。
    • 第二种解决方案的缺点是,如果在完成复制之前被中断,可能会使文件损坏。
    • 我仍然不确定这是否给了我最有效的答案。也许使用 mmap 将文件映射到内存中然后对新位置进行一次写入会更有效?
    • 试一试...看看您可以创建什么作为替代方案。 mmap() 可能有一些技巧可供您使用(其中一个问题是如何使mmap() 比文件中的当前空间更多)。最终,这将类似于代码所做的,但它可能能够更有效地完成它,如果仅仅是因为更少的系统调用。如果要插入的数量是页面大小的倍数,系统可能会加快速度,但可能意识不够。
    猜你喜欢
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多