获取⽂件⼤⼩这⾥有两种⽅法:⽅法⼀、范例:
1. unsigned long get_file_size(const char *path) 2. {
3. unsigned long filesize = -1; 4. FILE *fp;
5. fp = fopen(path, \"r\"); 6. if(fp == NULL) 7. return filesize;
8. fseek(fp, 0L, SEEK_END); 9. filesize = ftell(fp); 10. fclose(fp); 11. return filesize; 12. } 13. 14.
此种以打开⽂件的⽅法取得⽂件的⼤⼩,不适合⼤⽂件,并且可能会出现访问冲突(⽐如正在下载的⽂件),效率也⽐较低
⽅法⼆、 范例:
1. #include 3. unsigned long get_file_size(const char *path) 4. { 5. unsigned long filesize = -1; 6. struct stat statbuff; 7. if(stat(path, &statbuff) < 0){ 8. return filesize; 9. }else{ 10. filesize = statbuff.st_size; 11. } 12. return filesize; 13. } 此种使⽤读取⽂件属性的⽅法得到⽂件的⼤⼩,效率较⾼,也较稳定 下⾯将stat的详细信息粘贴出来: stat(取得⽂件状态) 相关函数 fstat,lstat,chmod,chown,readlink,utime 表头⽂件 #include 定义函数 int stat(const char * file_name,struct stat *buf); 函数说明 stat()⽤来将参数file_name所指的⽂件状态,复制到参数buf所指的结构中。 下⾯是struct stat内各参数的说明 struct stat { dev_t st_dev; /*device*/ ino_t st_ino; /*inode*/ 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 type */ off_t st_size; /*total size, in bytes*/ unsigned long st_blksize; /*blocksize for filesystem I/O */ unsigned long st_blocks; /*number of blocks allocated*/ time_t st_atime; /* time of lastaccess*/ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last change */ }; st_dev ⽂件的设备编号 st_ino ⽂件的i-node st_mode ⽂件的类型和存取的权限 st_nlink 连到该⽂件的硬连接数⽬,刚建⽴的⽂件值为1。 st_uid ⽂件所有者的⽤户识别码 st_gid ⽂件所有者的组识别码 st_rdev 若此⽂件为装置设备⽂件,则为其设备编号 st_size ⽂件⼤⼩,以字节计算 st_blksize ⽂件系统的I/O 缓冲区⼤⼩。 st_blcoks 占⽤⽂件区块的个数,每⼀区块⼤⼩为512 个字节。 st_atime ⽂件最近⼀次被存取或被执⾏的时间,⼀般只有在⽤mknod、utime、read、write与tructate时改变。 st_mtime ⽂件最后⼀次被修改的时间,⼀般只有在⽤mknod、utime和write时才会改变 st_ctime i-node最近⼀次被更改的时间,此参数会在⽂件所有者、组、权限被更改时更新先前所描述的st_mode 则定义了下列数种情况 S_IFMT 0170000 ⽂件类型的位遮罩 S_IFSOCK 0140000 scoket S_IFLNK 0120000 符号连接 S_IFREG 0100000 ⼀般⽂件 S_IFBLK 0060000 区块装置 S_IFDIR 0040000 ⽬录 S_IFCHR 0020000 字符装置 S_IFIFO 0010000 先进先出 S_ISUID 04000 ⽂件的(set user-id on execution)位 S_ISGID 02000 ⽂件的(set group-id on execution)位 S_ISVTX 01000 ⽂件的sticky位 S_IRUSR(S_IREAD) 00400 ⽂件所有者具可读取权限 S_IWUSR(S_IWRITE)00200 ⽂件所有者具可写⼊权限 S_IXUSR(S_IEXEC) 00100 ⽂件所有者具可执⾏权限 S_IRGRP 00040 ⽤户组具可读取权限 S_IWGRP 00020 ⽤户组具可写⼊权限 S_IXGRP 00010 ⽤户组具可执⾏权限 S_IROTH 00004 其他⽤户具可读取权限 S_IWOTH 00002 其他⽤户具可写⼊权限 S_IXOTH 00001 其他⽤户具可执⾏权限 上述的⽂件类型在POSIX 中定义了检查这些类型的宏定义 S_ISLNK (st_mode) 判断是否为符号连接 S_ISREG (st_mode) 是否为⼀般⽂件 S_ISDIR (st_mode)是否为⽬录 S_ISCHR (st_mode)是否为字符装置⽂件 S_ISBLK (s3e) 是否为先进先出 S_ISSOCK (st_mode) 是否为socket 若⼀⽬录具有sticky 位(S_ISVTX),则表⽰在此⽬录下的⽂件只能被该⽂件所有者、此⽬录所有者或root来删除或改名。 返回值 执⾏成功则返回0,失败返回-1,错误代码存于errno 错误代码 ENOENT 参数file_name指定的⽂件不存在 ENOTDIR 路径中的⽬录存在但却⾮真正的⽬录 ELOOP 欲打开的⽂件有过多符号连接问题,上限为16符号连接 EFAULT 参数buf为⽆效指针,指向⽆法存在的内存空间 EACCESS 存取⽂件时被拒绝 ENOMEM 核⼼内存不⾜ ENAMETOOLONG 参数file_name的路径名称太长 范例 #include struct stat buf; stat (“/etc/passwd”,&buf); printf(“/etc/passwd file size = %d /n”,buf.st_size); } 因篇幅问题不能全部显示,请点此查看更多更全内容