分类: LINUX
2014-04-23 17:23:45
原文地址:Linux编程获取文件属性 作者:yandaren_1220
Linux的文件属性有六顶之多,可以用ls命令来查看,第一项是文件的访问权限,读写执行。第二项是文件个数,第三项是文件的拥有都,第四项表示文件大小,第五项是最后一次文件的修改时间,最后一项是文件名。在程序当中可以用系统调用函数stat来获取文件的各项属性\ #include #include #include #include #include int main(int argc,char *argv[]) { struct stat buf; if(argc!=2) printf("input the parameter error!\n"); if(stat(argv[1],&buf)==-1) printf("get the stat is faild!\n"); printf("st_dev:%d\n",buf.st_dev); printf("st_ino:%d\n",buf.st_ino); printf("st_mode:%d\n",buf.st_mode); printf("st_nlink:%d\n",buf.st_nlink); printf("st_uid:%d\n",buf.st_uid); printf("st_gid:%d\n",buf.st_gid); printf("st_rdev:%d\n",buf.st_rdev); printf("st_size:%d\n",buf.st_size); printf("st_blksize:%d\n",buf.st_blksize); printf("st_atime:%s\n",ctime(&buf.st_atime)); printf("st_mtime:%s\n",ctime(&buf.st_mtime)); printf("st_ctime:%s\n",ctime(&buf.st_ctime)); return 0; } 要获取文件的属性其实有三个系统函数可以选择,用man 2 stat可以看到这三个函数: int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(const char *path, struct stat *buf); 本程序用的是第一个函数。 首先程序包涵所需要的头文件。 main函数中定义了一个stat结构体的变量。在/usr/include/sys/stat.h里可以找到它的定义,用man 2 stat里也有说明。 struct stat { dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; dev_t st_rdev; off_t st_size; blksize_t st_blksize; blkcnt_t st_blocks; time_t st_atime; time_t st_mtime; time_t st_ctime; }; 各项的意思也很简单,st_dew文件设备的编号,st_ino 为节点编号,st_mode为文件类型和存取权限。st_link为文件的硬连接数目。st_uid用户ID,st_rdev如果是设备文件,则为其编号,st_size文件大小。st_blksize为I/O缓冲的大小。st_blicks占用文件块的大小,后三项为文件的最后一次被访问时间,最近修改时间,最近更新时间。 代码首先判断用户输入的参数是否正确,在数据argv中argv[0]和argv[1]接受命令参数的输入。 然后用stat函数获得文件属性并用其来填充buf结构体。 最后输出结构体里的各成员变量。 在用gcc编译时会有警告产生,原因是printf输出的第一个参数的格式不正确,可以忽略。看下面的一次执行 root@ubuntu:/home/coding/myjc/myc# ./stat coding.c st_dev:1792 st_ino:1161590 st_mode:100774 st_nlink:1 st_uid:0 st_gid:0 st_rdev:0 st_size:1652 st_blksize:4096 st_atime:Tue May 5 22:55:04 2009 st_mtime:Tue May 5 22:55:03 2009 st_ctime:Tue May 5 22:55:03 2009 时间精确到了秒,强! |