Linuxでのファイルサイズの取得方法の概要


Linuxファイルサイズ要約の取得
最近1つの問題に悩んで、Linuxの下でどのようにファイルの大きさを取得して、調べてみて、方法はまとめて以下の通りです:
1.fseekとftellを利用する
2.fstatとfilenoの利用
詳しく説明してみましょう.
1.fseekとftellでファイルのサイズを取得する
1.1 fseek、ftell紹介
int fseek(FILE *stream, long offset, int whence);
機能:ファイルポインタを指定した場所に移動します.
パラメータ:streamはfopenで開くファイルHANDLEを表します(参照)
offsetはファイルポインタのオフセット位置(パラメータ)を表します
whenceは、オフセット(パラメータ)を表します.whenceには、次の3つのオプションがあります.
                                                                          SEEK_SET:ファイルの先頭からoffset個byteをオフセットする;
                                                                          SEEK_CUR:ファイルの現在位置からoffset個byteをオフセットする.
                                                                          SEEK_END:ファイルの末尾からoffset個byteをオフセットする;
戻り値:成功は0、失敗は-1です.
long ftell(FILE *stream);
機能:ファイルの開始から現在の位置へのファイルポインタのオフセット量を取得します.
パラメータ:streamはfopenで開くファイルHANDLEを表します(参照)
戻り値:オフセット量が正常に返されます.失敗は-1です.
1.2ファイルサイズの取得方法
主な考え方は、まずfseekを利用してファイルポインタをファイルの末尾に向け、ftellを利用してファイルの現在の位置を取得することです.
1.3試験手順
#include <stdio.h>   // FILE...

// get the file size.
long getfilesize(FILE *pFile)
{
        // check FILE*.
        if( pFile == NULL)
        {
                return -1;
        }

        // get current file pointer offset.
        long cur_pos = ftell(pFile);
        if(cur_pos == -1)
        {
                return -1;
        }

        // fseek to the position of file end.
        if(fseek(pFile, 0L, SEEK_END) == -1)
        {
                return -1;
        }

        // get file size.
        long size = ftell(pFile);

        // fseek back to previous pos.
        if(fseek(pFile, cur_pos, SEEK_SET) == -1)
        {
                return -1;
        }

        // deal returns.
        return size;
}
int main()
{
        // open a file.
        FILE *pFile = fopen("./Test.txt", "a");
        if(pFile == NULL)
        {
                printf("error.
"); return 0; } // get the file size. printf("the file size: %ld
", getfilesize(pFile)); // close the file. fclose(pFile); return 0; }

2.fstatとfilenoの利用
2.1 filenoとfstatの紹介
int fileno(FILE *stream);
機能:streamを整数記述子に変換します.
パラメータ:streamはfopenで開くファイルHANDLEを表します(参照)
戻り値:streamの整数記述子を正常に返しました.エラーは-1を返します.
int fstat(int filedes, struct stat *buf);
機能:ファイル記述子filedesでファイル情報を取得する
パラメータ:filedesはファイル記述子(パラメータ)を表します.
bufはファイル情報構造のポインタ(参照)を表します.struct statの具体的な情報は表示できます(http://www.cnitblog.com/guopingleee/archive/2008/11/13/51411.aspx)
戻り値:正常に0を返しました.エラーは-1を返します.
2.2ファイルサイズの取得方法
まずfilenoを利用して「FILE*」型のHANDLEをファイルの整数記述子に変換し、ファイルの情報(ファイルサイズを含む)を取得します.
2.3試験手順
#include <sys/stat.h>// stat
#include <stdio.h>   // FILE...

// get the file size.
off_t getfilesize(FILE *pFile)
{
        // check FILE*.
        if( pFile == NULL)
        {
                return -1;
        }

        // get file size.
        int fd=fileno((FILE *)pFile);
        if(fd == -1)
        {
                return -1;
        }
        struct stat fileStat;
        if( -1 == fstat(fd, &fileStat))
        {
                return -1;
        }

        // deal returns.
        return fileStat.st_size;
}
int main()
{
        // open a file.
        FILE *pFile = fopen("./Test.txt", "a");
        if(pFile == NULL)
        {
                printf("error.
"); return 0; } // get the file size. printf("the file size: %ld
", getfilesize(pFile)); // close the file. fclose(pFile); return 0; }

後記:
ファイルサイズを取得する方法はまだたくさんありますが、本文は主にfopenで得たファイルハンドルから、方法をまとめます.