他们都可以根据我的测试更改文件大小。 为什么他们都可以将文件更改为更大更短? fallocate和ftruncate之间有什么区别?
答案 0 :(得分:5)
ftruncate
是一个简单的单一用途函数。 Per the POSIX documentation,它只是将文件设置为请求的长度:
如果
fildes
引用常规文件,ftruncate()
函数将导致文件大小被截断为length
。 ...
ftruncate()
也是标准的POSIX功能,可移植。请注意,POSIX未指定操作系统设置文件长度的 ,例如设置为任意长度的文件是否为a sparse file。
fallocate()
is a Linux-specific function以更具体的方式提供更多功能:
分配磁盘空间
fallocate()的默认操作(即模式为零)分配
offset
和len
指定范围内的磁盘空间。该 如果stat(2)
,则文件大小(由offset+len
报告)将会更改 大于文件大小。指定范围内的任何子区域 通过offset和len,在调用之前不包含数据 初始化为零。此默认行为非常类似于posix_fallocate(3)
库函数的行为,并且是预期的 作为一种最佳实现该功能的方法。...
取消分配文件空间
指定
FALLOC_FL_PUNCH_HOLE
标志(自Linux以来可用) 2.6.38)在模式中释放字节中的空间(即,创建一个洞) 范围从offset
开始,持续len
个字节。内 指定范围,部分文件系统块归零,整体 文件系统块将从文件中删除。成功后 调用,此范围的后续读取将返回零。...
折叠文件空间
指定
FALLOC_FL_COLLAPSE_RANGE
标志(自Linux以来可用) 3.15)in模式从文件中删除一个字节范围,而不离开 洞。要折叠的字节范围从offset
开始并继续 用于len
个字节。在完成操作,内容 从位置offset+len
开始的文件将附加在。{ 位置偏移量,文件将小len
个字节。...
归零文件空间
指定
FALLOC_FL_ZERO_RANGE
标志(自Linux 3.15起可用) in mode在从offset
开始的字节范围中将空格归零 继续len
个字节。在指定的范围内,块是 预分配用于跨越文件中的孔的区域。后 如果成功通话,则此范围的后续读取将返回 零。...
增加文件空间
指定
FALLOC_FL_INSERT_RANGE
标志(自Linux以来可用) 4.1)在模式下通过在内部插入一个洞来增加文件空间 文件大小而不覆盖任何现有数据。洞会开始 在offset
并继续len
个字节。在内部插入孔时 文件,从offset
开始的文件内容将被移位 向上(即,到更高的文件偏移量)len
个字节。插入一个 文件中的孔将文件大小增加len
个字节。...
答案 1 :(得分:0)
fallocate 用于将块预分配到文件
以下命令将分配大小为1GB的文件。
fallocate -l 1G test_file1.img
ftruncate - 将文件设置为指定的长度
ftruncate(fileno(fout),size);
答案 2 :(得分:0)
我现在知道:
1.fallocate无法将文件更改为更短。它为文件添加实际空间。
2.ftruncate将len添加到"描述",就像声明一样。
答案 3 :(得分:0)
使用ftruncate,您可以告诉linux您希望此文件的大小。 如果文件越来越短(包括释放磁盘空间)或增加零,它将截断额外的空间;如果使文件更长,它将分配磁盘空间。
fallocate是一个通用函数,用于将范围更改为属于文件的字节。
根据您使用fallocate的方式,您可以使用ftruncate和fallocate完成您可以做的一切。只是稍微复杂一点,因为您必须知道需要分配/取消分配的范围(初始偏移量+长度)。
使用fallocate,您可以在不逻辑增长文件的情况下预分配磁盘空间(例如,在ls级别使用1GB的零字节文件)。
我刚刚编写了一个C程序,使用fallocate和ftruncate通过直接I / O对文件执行高性能gzipzip处理。我使用fallocate一次为文件预分配64MB。最后,我使用ftruncate修剪分配的多余空间。
与XFS完美配合,我确认ftruncate实际上使用xfs_bmap -vp释放了一些文件上的磁盘空间。