赞
踩
头文件
#include <sys/stat.h>
#include <unistd.h>
定义函数: int stat(const char *file_name, struct stat *buf);
函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
返回值: 执行成功则返回0,失败返回-1,错误代码存于errno
错误代码errno:
ENOENT 参数file_name指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目录
ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT 参数buf为无效指针,指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数file_name的路径名称太长
结构体内部
struct stat { dev_t st_dev; /* ID of device containing file */文件使用的设备号 ino_t st_ino; /* inode number */ 索引节点号 mode_t st_mode; /* protection */ 文件对应的模式,文件,目录等 nlink_t st_nlink; /* number of hard links */ 文件的硬连接数 uid_t st_uid; /* user ID of owner */ 所有者用户识别号 gid_t st_gid; /* group ID of owner */ 组识别号 dev_t st_rdev; /* device ID (if special file) */ 设备文件的设备号 off_t st_size; /* total size, in bytes */ 以字节为单位的文件容量 blksize_t st_blksize; /* blocksize for file system I/O */ 包含该文件的磁盘块的大小 blkcnt_t st_blocks; /* number of 512B blocks allocated */ 该文件所占的磁盘块 time_t st_atime; /* time of last access */ 最后一次访问该文件的时间 time_t st_mtime; /* time of last modification */ /最后一次修改该文件的时间 time_t st_ctime; /* time of last status change */ 最后一次改变该文件状态的时间 };
代码如下():
#include <stddef.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> // stat 函数所在的文件 #include <dirent.h> #include <string.h> //去除ctime所带来的换行符 const char *ctime_s(time_t t) { static char buf[32]; char *p = NULL; strcpy(buf, (char*)ctime(&t)); p = strchr(buf, '\n'); *p = '\0'; return buf; } int main(void) { DIR *dp; struct dirent *ep; struct stat st; char dirp[50]; char AbsolutePath[120]; printf("Please input a dir name:\n"); scanf("%s",dirp); //读入目录名 dp=opendir(dirp); //打开所给目录 printf("filename:\ttype:\tPermission\taccesstime\tlastmodtime\tsize\n"); if(dp!=NULL) //如果打开目录成功,则进行操作。 { while(ep = readdir(dp)) //读每一个目录项的循环 { if(ep->d_name[0]!='.') //判断文件名称的第一个字符是否'.',如果是,表明是隐含文件,我们 { //用 stat 函数打开文件的信息,第一个参数是文件的路径,第二个参数存放文件的信 sprintf(AbsolutePath,"%s%s",dirp,ep->d_name); //stat函数的路径必须是绝对路径所以加上之前的路径 if(stat(AbsolutePath,&st)!=-1) //读成功 { printf("%s\t",ep->d_name); if((st.st_mode&S_IFMT)==S_IFDIR) //判断文件的类型 printf("Directory\t"); //目录 else if((st.st_mode&S_IFMT)==S_IFBLK) //块文件 printf("Block special file\t"); else if((st.st_mode&S_IFMT)==S_IFCHR) //特殊字符文件 printf("character special file\t"); else if((st.st_mode&S_IFMT)==S_IFREG) //普通文件 printf("Ordinary file\t"); else if((st.st_mode&S_IFMT)==S_IFIFO) //管道文件 printf("pipefile file\t"); printf("%o\t",st.st_mode&0x1ff); //文件的权限 printf("%15s\t",ctime_s(st.st_atime)); //文件创建时间 printf("%15s\t",ctime_s(st.st_mtime)); //文件上次修改时间 printf("%ld\n",st.st_size); //文件的大小 } } } closedir(dp); //关闭目录 } else puts("Couldn't open the directory.\n"); //打开不成功时,输出不能打开路径 return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。