linux truncate函数分析
一、基础知识
1.依赖头文件
#include<unistd.h>
#include<sys/types.h>
2.函数定义:
int truncate(const char *path,off_t length);
int ftruncate(int fd,off_t length);
truncate()和ftruncate()函数导致一个名称为path或者被文件描述符fd引用的常规文件被截断成一个大小精为length字节的文件。如果先前的文件大于这个大小,额外的数据丢失。如果先前的文件小于当前定义的大小,那么,这个文件将会被扩展,扩展的部分将补以null,也就是‘\0’。 如果大小发生变化,那么这个st_ctime(访问时间)和st_mtime()修改时间将会被更新。使用ftruncate(),这个文件必须被打开用以写操作。使用truncate函数的文件必须能够被写。
二、示例
1、截短测试
编写truncate.c文件如下
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
int main(void)
{
if(truncate("demo.txt",20)!=-1)
{
printf("truncated!!!!\n");
}
return 0;
}
在命令行中输入:
echo "test demo.txt truncation,it's just test,so let's look is" > demo.txt
然后编译程序truncate.c并运行
使用命令stat demo.txt查看文件状态如下:
2、截长测试
更改上诉代码为:truncate("demo.txt",100000)
使用stat demo.txt查看文件状态如下:
虽然截长到 100000个字节,文件的长度是 100000字节,但是文件占用的 block 块只有 8 个。这多余部分就是一个空洞,并不占用实际的物理磁盘。