有没有办法open()
使文件缩小?当然,我们可以以附加模式打开它们,或者查找到末尾并写入以使它们增长。然而,据我所知,没有办法通过典型的unix风格的系统调用接口来缩小文件。
据我所知,这样做的唯一方法是通过创建一个新的较短文件并rename()
代替旧文件来伪造它。
我只是想确认,因为我看到一个答案暗示可以制作直接在文件上工作的文件编辑器,而不是经历制作新文件并在适当位置重命名的过程。
我一直认为 libc 和 unix 风格的系统调用接口中的文件 api 不允许缩小文件以简化文件系统的实现,并且可能避免可能导致碎片的使用模式。
答案1
DESCRIPTION
The truncate() and ftruncate() functions cause the regular file
named by path or referenced by fd to be truncated to a size of precisely
length bytes.
...
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).
它接着说,如果您使用 ftruncate,您必须打开文件进行写入,如果您使用 truncate,则文件必须是可写的。
答案2
这open(2)
系统调用接受O_TRUNC
可以减小文件大小的标志:
O_TRUNC
– 如果文件存在并且是普通文件,并且文件成功打开O_RDWR
或O_WRONLY
,则其长度将被截断为0,模式和所有者不变。它对 FIFO 特殊文件或终端设备文件没有影响。它对其他文件类型的影响是实现定义的。O_TRUNC
不使用O_RDWR
or的结果O_WRONLY
是未定义的。
当程序旨在完全覆盖文件内容时,经常使用它。一个例子是 shell 的文件重定向运算符,如 中所示command > file
。