1. 程式人生 > >檔案lseek操作產生空洞檔案的方法

檔案lseek操作產生空洞檔案的方法

在檔案操作過程中,lseek操作可以偏移到檔案的任意位置。

在UNIX檔案操作中,檔案位移量可以大於檔案的當前長度,在這種情況下,對該檔案的下一次寫將延長該檔案,並在檔案中構成一個空洞,這一點是允許的。位於檔案中但沒有寫過的位元組都被設為 0。 如果 offset 比檔案的當前長度更大,下一個寫操作就會把檔案“撐大(extend)”。這就是所謂的在檔案裡創造“空洞(hole)”。沒有被實際寫入檔案的所有位元組由重複的 0 表示。空洞是否佔用硬碟空間是由檔案系統(file system)決定的。 空洞檔案作用很大,例如迅雷下載檔案,在未下載完成時就已經佔據了全部檔案大小的空間,這時候就是空洞檔案。下載時如果沒有空洞檔案,多執行緒下載時檔案就都只能從一個地方寫入,這就不是多執行緒了。如果有了空洞檔案,可以從不同的地址寫入,就完成了多執行緒的優勢任務。

接下來我們來看一個例子:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
	int fd;
	off_t offset;
	fd = creat("tmp", 0777);   //建立一個許可權為可讀可寫可執行的檔案"tmp"
	if(-1 == fd)   //如果出錯返回-1
	{
		perror("creat");
		return -1;
	}
	offset = lseek(fd, 1024ll * 1024ll * 1024ll, SEEK_END);  //設定偏移的大小為1024ll*1024ll*1024ll,並偏移到檔案尾//部
	printf("offset = %d\n", offset);
	write(fd, "", 1);  //寫空,寫1個位元組到檔案描述符裡
	close(fd);   //關閉檔案描述符
	return 0;
}
執行結果:



檔案的大小為1GB: