【问题标题】:How to effectively truncate the head of the file?如何有效地截断文件的头部?
【发布时间】:2019-07-04 15:26:34
【问题描述】:

每个人都知道truncate(file, size) 函数,它通过截断文件的尾部将文件大小更改为给定大小。但是怎么做,只是截断不是文件的尾部和头部呢?

【问题讨论】:

  • 当文件是日志文件并且写入它的程序保持文件描述符打开时,移动文件后不会再出现日志。见unix.stackexchange.com/a/122942/57293
  • 打开文件,然后sendfile(fd, fd, &offset, size),我在ubuntu 16上测试,可以,但是老内核不支持

标签: linux windows unix operating-system


【解决方案1】:

通常,您必须重写整个文件。最简单的方法是跳过前几个字节,将其他所有内容复制到临时文件中,并在完成后将临时文件重命名在旧文件之上。更复杂的方法是在原地重写它,类似于memmove 的工作方式,使用 read/seek/write/seek 或 pread/pwrite,然后在完成后截断最后一位。

如果您使用的是最新版本的 Linux (>= 3.15),并且您有一个受支持的文件系统(当前为 ext4 或 xfs),并且您希望删除的数量恰好是文件系统块大小的倍数,那么您可以使用带有FALLOC_FL_COLLAPSE_RANGE 标志的非便携式fallocate(2)。请注意,便携式posix_fallocate 不支持此功能。

【讨论】:

    【解决方案2】:

    唯一的方法是读取整个文件并从需要的位置覆盖它。

    【讨论】:

      【解决方案3】:

      您可以只使用tail --lines=<linecount> 始终将日志文件限制在最后的linecount 行。如果您不尝试截断到特定/固定的文件大小,则此方法有效。

      【讨论】:

        猜你喜欢
        • 2015-11-29
        • 1970-01-01
        • 1970-01-01
        • 2021-01-10
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 2017-03-01
        相关资源
        最近更新 更多