它们都可以根据我的测试更改文件大小。为什么他们都可以将文件更改为更大或更短?fallocate和ftruncate有什么区别?
发布于 2018-03-19 19:30:13
ftruncate是一个简单的、用途单一的函数。Per the POSIX documentation,它只是将文件设置为请求的长度:
如果
fildes引用常规文件,则ftruncate()函数将导致文件的大小被截断为length。..。
ftruncate()也是一个标准的POSIX函数,并且是可移植的。注意,POSIX没有指定OS如何设置文件长度,比如设置为任意长度的文件是否为a sparse file。
fallocate() is a Linux-specific function做了更多的事情,而且是以非常具体的方式:
分配磁盘空间
fallocate()的默认操作(即模式为零)在offset和len指定的范围内分配磁盘空间。如果offset+len大于文件大小,则会更改文件大小(由stat(2)报告)。在offset和len指定的范围内,调用前未包含数据的任何子区域将被初始化为零。此默认行为与posix_fallocate(3)库函数的行为非常相似,旨在作为以最佳方式实现该函数的方法。
..。
释放文件空间
在模式下指定FALLOC_FL_PUNCH_HOLE标志(从Linux2.6.38开始可用)将释放字节范围中的空间(即,创建一个空洞),从offset开始,一直到len字节。在指定范围内,将部分文件系统块归零,并从文件中删除整个文件系统块。调用成功后,此范围的后续读取将返回零。
..。
折叠文件空间
在模式下指定FALLOC_FL_COLLAPSE_RANGE标志(从Linux3.15开始可用)将从文件中删除一个字节范围,而不会留下空洞。要折叠的字节范围从offset开始,一直到len字节。操作完成时,从位置偏移量开始的文件的内容将被附加到位置偏移量,并且文件将小len个字节。
..。
零位调整文件空间
在模式中指定FALLOC_FL_ZERO_RANGE标志(从Linux3.15开始可用)将从offset开始到len字节的字节范围内的空间置零。在指定的范围内,将为跨越文件中孔的区域预先分配块。调用成功后,此范围的后续读取将返回零。
..。
增加文件空间
在模式下指定FALLOC_FL_INSERT_RANGE标志(从Linux4.1开始可用)会增加文件空间,方法是在文件大小内插入一个洞,而不会覆盖任何现有数据。该漏洞将从offset开始,并在len字节处继续。在文件内插入孔时,从offset开始的文件内容将向上移动(即,到更高的文件偏移量) len字节。在文件中插入一个洞会使文件大小增加len字节。
...
发布于 2018-03-19 21:36:54
fallocate用于将数据块预分配给文件
以下命令将分配一个大小为1 1GB的文件。
fallocate -l 1G test_file1.imgftruncate -将文件设置为指定的长度
ftruncate(fileno(fout),size);发布于 2018-03-20 13:57:27
据我所知:
1. 1.fallocate无法将文件更改为更短。它会向文件添加实际空间。
2.ftruncate将len添加到"describe“中,就像声明一样。
https://stackoverflow.com/questions/49360932
复制相似问题