在Linux下建立大檔案

liuronghust發表於2012-02-08


在Linux c程式中建立一個2G的檔案,迴圈寫1KB的資料,共2*1024*1024次,最後一次寫失敗,

n=write(fd,buf,1024),n總是等於1023<1024,檔案大小顯示為2147483647B;

然後我又測試了往一個1G的檔案中再追加1G的資料,迴圈寫1KB的資料,共1024*1024次,也是最後一次寫失敗,問題同上。

write error ,write size is 1023(到2GB的最後一次寫檔案時,寫不了1024個位元組,只能寫1023個位元組)

後來百度了下,可能是Linux檔案系統對檔案大小的限制,尤其是看到了“Linux下2G檔案限制解決方案”的東西后,我也不管三七二十一,就

下載netkit-ftp-0.18-pre1.tar.gz,解壓縮後,修改ftp/ftp.c,ftp/main.c    加入

    #define _LARGEFILE_SOURCE //for LFS support

    #define _FILE_OFFSET_BITS 64 //for LFS support

    然後./configure && make 下,用ftp/ftp檔案覆蓋系統自帶的ftp客戶端,結果發現根本和我遇到的問題無關。

再檢查我的檔案系統是ext3,檔案大小上限可達16G,按理可以成功建立2G的檔案的。後來終於看到網上某個人發了“在LINUX平臺下我有一個大於4G的檔案, 怎麼讀這些檔案的內容, ”的帖子,點進去看,才明白Linux下有如何處理大檔案的方式。

linux支援大檔案的兩種方式:

1、gcc 加 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE

2、

#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64

建議兩種方式都加上。

gcc creat_file.c -o creat_file然後./creat_file data1得到:

---------- 1 root root 2147483647 2012-02-09 16:17 data1(錯誤的)

在編譯時加上gcc -D_FILE_OFFSET_BITS=64-D_LARG_FILE creat_file.c -o creat_file然後./creat_file data1得到::

---------- 1 root root 2147483648 2012-02-09 16:19 data1 (正確的)

同理,往1G的檔案中新增1G的資料也正確執行:

---------- 1 root root 1073741824 2012-02-09 16:57 data2(1G的檔案,追加前)

 gcc -D_FILE_OFFSET_BITS=64 -D_LARG_FILE rdwrfile.c -o rdwrfile然後./rdwrfile data2(執行追加的程式後)得到:

---------- 1 root root 2147483648 2012-02-09 16:59 data2(2G的檔案,追加後)

在我的程式中只加了第一種方式,就可正確執行,得到正確的結果。只用第二種方式,不能解決問題。兩種方式都加上,可以得到正確結果。


相關文章