• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 297,  comments - 15,  trackbacks - 0

            支持大文件的兩種方式:

            1、gcc 加 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE

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

            #define _LARGEFILE_SOURCE
            #define _LARGEFILE64_SOURCE
            #define _FILE_OFFSET_BITS 64

            建議兩種方式都加上。

            如何create大文件
            要大就非常大,1T吧。
            有兩種方法:
            一.dd
            dd if=/dev/zero of=1T.img bs=1G seek=1024 count=0
            bs=1G表示每一次讀寫1G數(shù)據(jù),count=0表示讀寫0次,seek=1024表示略過1024個Block不寫,前面block size是1G,所以共略過1T!
            這是創(chuàng)建大型sparse文件最簡單的方法。
            二.ftruncate64/ftruncate
            如果用系統(tǒng)函數(shù)就稍微有些麻煩,因為涉及到宏的問題。我會結(jié)合一個實際例子詳細說明,其中OPTION標志的就是測試項。
            文件sparse.c:
            //OPTION 1:是否定義與大文件相關(guān)的宏
            #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:是否調(diào)用64位系統(tǒng)函數(shù)
            //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;
            }
            測試環(huán)境:
            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
            測試結(jié)果(偽碼表示):
            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;
            結(jié)論】:在宏定義完全的情況下,是否調(diào)用ftruncate64,是決定支持4G以上文件的關(guān)鍵,O_LARGEFILE無作用
            2.宏定義不完全:缺少_FILE_OFFSET_BITS
            首先聲明一點,O_LARGEFILE需要定義_LARGEFILE64_SOURCE
            IF {O_LARGEFILE=TRUE && ftruncate64=TRUE}
            產(chǎn)生不正常超大文件;
            ELSEIF {O_LARGEFILE=FALSE && ftruncate64=TRUE}
            產(chǎn)生不正常超大文件;
            ELSEIF {O_LARGEFILE=FALSE && ftruncate64=FALSE}
            運行不報錯,但是不支持>2G;
            ELSEIF {O_LARGEFILE=TRUE && ftruncate64=FALSE}
            運行不報錯,但是不支持>4G;
            結(jié)論】:未定義_FILE_OFFSET_BITS的情況下,ftruncate64調(diào)用是非法的,會產(chǎn)生無法預料的后果,這里的測試就是產(chǎn)生一個超大文件(>1T),我也無法解釋其原因;O_LARGEFILE的作用就是在32位系統(tǒng)中支持大文件系統(tǒng),允許打開那些用31位(2G)都不能表示其長度的大文件;此外,off_t為unsigned int類型,也就是說最多只能達到4G,所以ftruncate最大支持4G文件。
            總結(jié)一下如果要支持超過2G的文件,至少需要定義_LARGEFILE64_SOURCE宏,并且設(shè)置O_LARGEFILE選項;如果要支持超過4G,需要定義所有上述的宏,并且調(diào)用ftruncate64;其余的搭配都是錯誤的!
            】:
            dd 的主要選項:
            指定數(shù)字的地方若以下列字符結(jié)尾乘以相應(yīng)的數(shù)字:
            b=512, c=1, k=1024, w=2, m=1024k, g=1024m
            大小寫不限。
            if=file
            輸入文件名,缺省為標準輸入。
            of=file
            輸出文件名,缺省為標準輸出。
            ibs=bytes
            一次讀入 bytes 個字節(jié)(即一個塊大小為 bytes 個字節(jié))。
            obs=bytes
            一次寫 bytes 個字節(jié)(即一個塊大小為 bytes 個字節(jié))。
            bs=bytes
            同時設(shè)置讀寫塊的大小為 bytes ,可代替 ibs 和 obs 。
            cbs=bytes
            一次轉(zhuǎn)換 bytes 個字節(jié),即轉(zhuǎn)換緩沖區(qū)大小。
            skip=blocks
            從輸入文件開頭跳過 blocks 個塊后再開始復制。
            seek=blocks
            從輸出文件開頭跳過 blocks 個塊后再開始復制。(通常只有當輸出文件是磁盤或磁帶時才有效)
            count=blocks
            僅拷貝 blocks 個塊,塊大小等于 ibs 指定的字節(jié)數(shù)。
            conv=conversion[,conversion...]
            用指定的參數(shù)轉(zhuǎn)換文件。
            轉(zhuǎn)換參數(shù):
            ascii 轉(zhuǎn)換 EBCDIC 為 ASCII。
            ebcdic 轉(zhuǎn)換 ASCII 為 EBCDIC。
            ibm 轉(zhuǎn)換 ASCII 為 alternate EBCDIC.
            block 把每一行轉(zhuǎn)換為長度為 cbs 的記錄,不足部分用空格填充。
            unblock
            使每一行的長度都為 cbs ,不足部分用空格填充。
            lcase 把大寫字符轉(zhuǎn)換為小寫字符。
            ucase 把小寫字符轉(zhuǎn)換為大寫字符。
            noerror
            不顯示錯誤
            notrunc
            不截短輸出文件。
            sync 把每個輸入塊填充到ibs個字節(jié),不足部分用空(NUL)字符補齊。



            from:
            http://hi.baidu.com/roxws/blog/item/785c4bcb61662ff853664f2d.html/cmtid/f990c324dee21627d50742e9

            posted on 2010-12-10 11:36 chatler 閱讀(876) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            91秦先生久久久久久久| 亚洲精品无码专区久久同性男| 色天使久久综合网天天| 亚洲国产美女精品久久久久∴| 无码人妻少妇久久中文字幕蜜桃| 久久综合九色综合精品| 香蕉久久夜色精品国产2020| 久久ww精品w免费人成| 久久精品国产欧美日韩99热| 狠狠色噜噜狠狠狠狠狠色综合久久 | 国产日产久久高清欧美一区| 精品久久久久久无码国产| 无码日韩人妻精品久久蜜桃| 女同久久| 青青热久久国产久精品 | 亚洲国产成人久久一区WWW| 99久久99久久| 久久综合给合久久狠狠狠97色| 久久久久久国产精品免费免费 | 国产Av激情久久无码天堂| 久久婷婷五月综合成人D啪| 久久久久久国产a免费观看不卡| 99久久婷婷免费国产综合精品| 国产精品亚洲综合久久| 一级做a爰片久久毛片免费陪| 久久久91人妻无码精品蜜桃HD| 久久精品成人国产午夜| 国内精品久久九九国产精品| 久久天天躁狠狠躁夜夜96流白浆 | 无码人妻久久久一区二区三区| 久久综合九色欧美综合狠狠| 久久无码AV中文出轨人妻| 久久精品成人| 伊人久久大香线蕉精品不卡| 久久毛片免费看一区二区三区| 欧美精品丝袜久久久中文字幕| 久久99精品久久久久久不卡| 久久久久国产一级毛片高清板| 久久精品国产一区二区三区| 日批日出水久久亚洲精品tv| 亚洲精品第一综合99久久 |