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