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
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 ;
}