空洞文件概念:
举个栗子:假如有个1k(1024字节)大小的文件,使用lseek函数使文件写入位置从2000字节处开始写数据,那么1024-2000之间就没有数据,形成空洞,这就是空洞文件。
空洞文件特点:
空洞文件空洞部分不会占用物理空间,除非写入数据。
空洞文件的文件实际大小包含了空洞部分。
读取空洞部分的数据,会读到什么数据呢?
这是一个关于空洞文件的例程:包含空洞文件创建、读取空洞部分数据、读取写入部分数据。
//open函数头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//close()函数头文件
#include <unistd.h>
//perro()函数
#include <stdio.h>
//erro错误编号头文件
#include <errno.h>
//exit()函数头文件
#include <stdlib.h>
#include <string.h>
int main(void)
{
int fd;
int ret;
char buffer[1024];
int i;
//打开文件
fd = open("./empty_file", O_RDWR);
if(fd == -1)
{
perror("open erro");
exit(-1);
}
//将文件读写位置移动到文件第2000个字节处
ret = lseek(fd, 2000, SEEK_SET);
if(ret == -1)
{
perror("lseek erro");
goto err;
}
//初始化buffer
memset(buffer, 'A', sizeof(buffer));
//循环写入数据
for(i = 0; i < 4; i++)
{
ret = write(fd, buffer,sizeof(buffer));
if(ret == -1)
{
perror("write erro");
goto err;
}
}
//读取空洞部分文件数据
memset(buffer, 0, sizeof(buffer));
ret = read(fd, buffer,20);
if(ret == -1)
{
perror("read erro");
goto err;
}
printf("empty:%s\n",buffer);
//清空数据
memset(buffer, 0, sizeof(buffer));
//读取文件写入字节处数据
ret = lseek(fd, 4096, SEEK_SET);
ret = read(fd, buffer,20);
if(ret == -1)
{
perror("read erro");
goto err;
}
printf("empty:%s\n",buffer);
err:
close(fd);
exit(ret);
}