Linux大檔案使用

來源:互聯網
上載者:User

 

支援大檔案的兩種方式:

1、gcc 加 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE

2、注意一定要定義在include之前

#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64

建議兩種方式都加上。

可以在GDB調試時列印p sizeof(off_t)來確定設定是否成功

如果值為8 成功

如果值為4 定義沒有成功

如何create大檔案要大就非常大,1T吧。有兩種方法: 一.dd
dd if=/dev/zero of=1T.img bs=1G seek=1024 count=0
bs=1G表示每一次讀寫1G資料,count=0表示讀寫0次,seek=1024表示略過1024個Block不寫,前面block size是1G,所以共略過1T!
這是建立大型sparse檔案最簡單的方法。 二.ftruncate64/ftruncate
如果用系統函數就稍微有些麻煩,因為涉及到宏的問題。我會結合一個實際例子詳細說明,其中OPTION標誌的就是測試項。
檔案sparse.c://OPTION 1:是否定義與大檔案相關的宏
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>#define FILENAME "bigfile"
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int main(int argc, char **argv)
{
int fd, ret;
off_t offset;int total = 0;
if ( argc >= 2 )
{
total = atol(argv[1]);
printf("total=%d/n", total);
}//OPTION 2:是否有O_LARGEFILE選項
//fd = open(FILENAME, O_RDWR|O_CREAT|O_LARGEFILE, 0644);
fd = open(FILENAME, O_RDWR|O_CREAT, 0644);
if (fd < 0) {
perror(FILENAME);
return -1;
}
offset = (off_t)total *1024ll*1024ll*1024ll;
printf("offset=%ld/n", offset);//OPTION 3:是否調用64位系統函數
//if (ftruncate64(fd, offset) < 0)
if (ftruncate(fd, offset) < 0)
{
printf("[%d]-ftruncate64 error: %s/n", errno, strerror(errno));
close(fd);
return 0;
}close(fd);
printf("OK/n");return 0;
} 測試環境:
linux:/disk/test/big # gcc --version
gcc (GCC) 3.3.5 20050117 (prerelease) (SUSE Linux)
linux:/disk/test/big # uname -a
Linux linux 2.6.11.4-20a-default #1 Wed Mar 23 21:52:37 UTC 2005 i686 i686 i386 GNU/Linux 測試結果(偽碼錶示):
1.宏定義完全的情況下:
IF {O_LARGEFILE=TRUE && ftruncate64=TRUE}
OK;
ELSEIF {O_LARGEFILE=FALSE && ftruncate64=TRUE}
OK;
ELSEIF {O_LARGEFILE=FALSE && ftruncate64=FALSE}
運行不報錯,但是不支援>4G;
ELSEIF {O_LARGEFILE=TRUE && ftruncate64=FALSE}
運行不報錯,但是不支援>4G;
結論】:在宏定義完全的情況下,是否調用ftruncate64,是決定支援4G以上檔案的關鍵,O_LARGEFILE無作用。 2.宏定義不完全:缺少_FILE_OFFSET_BITS
首先聲明一點,O_LARGEFILE需要定義_LARGEFILE64_SOURCE。
IF {O_LARGEFILE=TRUE && ftruncate64=TRUE}
產生不正常超大檔案;
ELSEIF {O_LARGEFILE=FALSE && ftruncate64=TRUE}
產生不正常超大檔案;
ELSEIF {O_LARGEFILE=FALSE && ftruncate64=FALSE}
運行不報錯,但是不支援>2G;
ELSEIF {O_LARGEFILE=TRUE && ftruncate64=FALSE}
運行不報錯,但是不支援>4G;
結論】:未定義_FILE_OFFSET_BITS的情況下,ftruncate64調用是非法的,會產生無法預料的後果,這裡的測試就是產生一個超大檔案(>1T),我也無法解釋其原因;O_LARGEFILE的作用就是在32位系統中支援大檔案系統,允許開啟那些用31位(2G)都不能表示其長度的大檔案;此外,off_t為unsigned int類型,也就是說最多隻能達到4G,所以ftruncate最大支援4G檔案。 總結一下:如果要支援超過2G的檔案,至少需要定義_LARGEFILE64_SOURCE宏,並且設定O_LARGEFILE選項;如果要支援超過4G,需要定義所有上述的宏,並且調用ftruncate64;其餘的搭配都是錯誤的!【 】:
dd 的主要選項:
指定數位地方若以下列字元結尾乘以相應的數字:
b=512, c=1, k=1024, w=2, m=1024k, g=1024m
大小寫不限。if=file
輸入檔案名稱,預設為標準輸入。of=file
輸出檔案名,預設為標準輸出。ibs=bytes
一次讀入 bytes 個位元組(即一個塊大小為 bytes 個位元組)。obs=bytes
一次寫 bytes 個位元組(即一個塊大小為 bytes 個位元組)。bs=bytes
同時設定讀寫塊的大小為 bytes ,可代替 ibs 和 obs 。cbs=bytes
一次轉換 bytes 個位元組,即轉換緩衝區大小。skip=blocks
從輸入檔案開頭跳過 blocks 個塊後再開始複製。seek=blocks
從輸出檔案開頭跳過 blocks 個塊後再開始複製。(通常只有當輸出檔案是磁碟或磁帶時才有效)count=blocks
僅拷貝 blocks 個塊,塊大小等於 ibs 指定的位元組數。conv=conversion[,conversion...]
用指定的參數轉換檔。轉換參數:ascii 轉換 EBCDIC 為 ASCII。ebcdic 轉換 ASCII 為 EBCDIC。ibm 轉換 ASCII 為 alternate EBCDIC.block 把每一行轉換為長度為 cbs 的記錄,不足部分用空格填充。unblock
使每一行的長度都為 cbs ,不足部分用空格填充。lcase 把大寫字元轉換為小寫字元。ucase 把小寫字元轉換為大寫字元。noerror
不顯示錯誤notrunc
不截短輸出檔案。sync 把每個輸入塊填充到ibs個位元組,不足部分用空(NUL)字元補齊。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.