1 空洞文件
1.1 什么是空洞文件
在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的,位于文件中但没有写过的字节都被设为0.
1.2 空洞文件有什么用
迅雷下载文件时,在未下载完成时,就已经占据了全部文件大小的空间,这时候就是空洞文件,下载的时候如果没有空洞文件,多线程下载时文件就都只能从一个地方写入,这就不是多线程了,如果有了空洞文件,可以从不同的地址写入,就完成了多线程的优势任务。
1.3 如何创建一个空洞文件
- 以只写的方式打开该文件
- 移动文件指针(假设下载一个1G的文件,需要移动1G的空间)
- 在移动之后的末尾写一个字节
- 关闭文件
注意:标准IO和文件IO都可以实现空洞文件。
1.3.1 文件IO创建一个空洞文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
// 功能:实现创建一个空洞文件
// (1)以读写方式打开一个文件
int fd = open(argv[1],O_RDWR | O_CREAT | O_TRUNC,0664);
if(fd < 0)
{
perror("fail to open");
return -1;
}
// (2)假设,所需占据的空间为1G,需要利用lseek实现定位
lseek(fd, 1024*1024*1024, SEEK_SET);
// (3)给定位的1G空间的末尾处写入一个字符
write(fd, "\0", 1);
// (4)关闭文件
close(fd);
return 0;
}
1.3.2 标准IO创建一个空洞文件
#include <stdio.h>
int main(int argc, const char *argv[])
{
// 功能:实现创建一个空洞文件
// (1)以读写的方式打开文件
FILE *fd = fopen(argv[1],"w+");
if(NULL == fd)
{
perror("fail to fopen");
return -1;
}
// (2)假设,所需占据的空间为1G,需要利用fseek实现定位
fseek(fd,1024*1024*1024,SEEK_SET);
// (3)给定位的1G空间的末尾处写入一个字符
fputc('\0',fd);
// (4)关闭文件
fclose(fd);
return 0;
}