Linux/C:复制文件并修剪掉最后一个填零的孔

问题描述 投票:0回答:1

我有一个软件(C/C++/Linux),由三个服务组成,使用

tmpfs
文件作为共享内存。为了方便起见,我们
ftruncate
将文件设置为 1GB,但实际上该文件仅包含不超过 500MB 的数据,因此超过 50% 的文件末尾都是一个大的零填充孔。

该软件提供了一个名为

download
的工具,允许用户获取自己的文件离线副本。在进行该复制时,我不希望用户看到它占用了 1GB,而是删除了“尾随孔”。我们不需要一直跟踪“实际大小”,我更喜欢仅在用户要求下载时才知道或“推断”大小,这是一个相当不常见的操作。我希望系统能帮我找出答案。

以下任何一种方法对我来说就足够了:

  • 遍历从元数据文件中提取的孔列表,找到孔的末尾及其大小。这样我就可以将实际大小计算为 1GB - 尾随孔的组合大小。
  • 一个系统调用告诉我最高写入字节和/或块的偏移量?
  • (最不推荐)已经为我执行此操作的终端命令(修剪后的副本)。这是最不可取的,因为我不喜欢使用
    system("blabla")
    调用,而我更喜欢调用 C 函数。

我怎样才能做到这一点?我更喜欢使用系统调用或 libc,如果没有合适的方法来做到这一点,那么可以使用命令行工具作为替代方案。不能使用第三方 C/C++ 库。

c linux copy trim sparse-file
1个回答
0
投票

您可以通过一系列带有

lseek
SEEK_HOLE
标志的
SEEK_DATA
来探索文件中的漏洞,这些标志将带您到下一个漏洞/非漏洞。

这些标志在 Linux 3.1+ 以及某些 BSD 上可用。

© www.soinside.com 2019 - 2024. All rights reserved.