方法一
stat,lstat,fstat
1 函数都是获取文件(普通文件,目录,管道,socket,字符,块)的属性。函数原型
#include <sys/stat.h>
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文件.
方法二
fseek( fp, 0, SEEK_END ); // 将文件指针移到文件尾
fileSize = 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\n "
, 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 ;
}
|