cファイルサイズの取得

2749 ワード

方法1
stat,lstat,fstat 1関数は、ファイル(通常ファイル、ディレクトリ、パイプ、socket、文字、ブロック)を取得するプロパティです.
関数プロトタイプ
#include
int stat(const char *restrict pathname, struct stat *restrict buf);
ファイル名を指定し、ファイルの対応するプロパティを取得します.
int fstat(int filedes, struct stat *buf);
ファイル記述子を使用して、ファイルに対応するプロパティを取得します.
int lstat(const char *restrict pathname, struct stat *restrict buf);
ファイル記述子を接続し、ファイルプロパティを取得します.
2ファイルに対応する属性
struct stat {
        mode_t     st_mode;//ファイル対応のパターン、ファイル、ディレクトリなど
        ino_t      st_ino;//inodeノード番号
        dev_t      st_dev;//設備番号
        dev_t      st_rdev;//特殊設備番号
        nlink_t    st_nlink;//ファイルの接続数
        uid_t      st_uid;//ファイル所有者
        gid_t      st_gid;//ファイル所有者対応グループ
        off_t      st_size;//通常ファイル、対応するファイルバイト数
        time_t     st_atime;//ファイルが最後にアクセスされた時刻
        time_t     st_mtime;//ファイルの内容が最後に変更された時刻
        time_t     st_ctime;//ファイル状態変更時間
        blksize_t st_blksize;//ファイル内容対応ブロックサイズ
        blkcnt_t   st_blocks;//偉建内容対応ブロック数
      };
上記の関数で、構造体を返し、ファイルの情報を保存できます.
3.次のマクロを用いる判断する.
S_ISLNK(st_mode):接続かどうか.
S_ISREGは通常のファイルであるかどうか.
S_ISDIRがディレクトリであるかどうか
S_ISCHRは文字デバイスであるかどうか.
S_ISBLKがブロックデバイスであるかどうか
S_ISFIFOがFIFOファイルであるかどうか.
S_ISSOCKはSOCKETファイルであるかどうか. 
方法2
fseek( fp, 0, SEEK_END );//ファイルポインタをファイル末尾file Size=ftell(fp);//ファイルヘッダに対する現在のファイルポインタのオフセットの取得
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 FILE     *fp   =   NULL; long     fSet   =   0,   fEnd   =   0; long     filelen   =   0; char *   fname   =    "d:/test.txt "
  if     (   (v_fpLog   =    fopen (   filename   ,    "r+ " ))   ==   NULL   )   { printf (    "The   file   '%s '   was   not   opened
 "
,   filename   ); return ; } else     { fseek (   v_fpLog,   0,   SEEK_SET   ); v_fSet   =    ftell (   v_fpLog   );
  fseek (   v_fpLog,   0,   SEEK_END   ); v_fEnd   =    ftell (   v_fpLog   );
                     /*   file   lenght   */                    flen   =   fEnd   -   fSet   ; }