Chinaunix首页 | 论坛 | 博客
  • 博客访问: 538049
  • 博文数量: 142
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1452
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-12 16:28
文章分类

全部博文(142)

文章存档

2016年(10)

2015年(60)

2014年(72)

我的朋友

分类: C/C++

2014-11-20 18:48:27

#include
int stat(const char *pathname,struct stat *buf);--------------根据pathname返回与文件相关的信息
int fstat(int fields, struct stat *buf);-----------------------在文件描述符fields上打开文件的有关信息
int lstat(const char *pathname,struct stat *buf);-------------与state类似,但是当文件是一个符号链接时,lstat返回该符号链接的相关信息,而不是由该符号链接引用文件的信息。
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 */
           };
1. st_mode

点击(此处)折叠或打开

  1. #include <sys/stat.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <errno.h>
  7. #include <string.h>

  8. int main(int argc, char* argv[])
  9. {
  10.     int i;
  11.     struct stat buf;
  12.     char *ptr;


  13.     for(i = 1;i < argc; i++)
  14.     {
  15.         printf("%s: ",argv[i]);
  16.         if(sstat(argv[i],&buf) < 0) {
  17.             printf("lstat error:%s\n",strerror(errno));
  18.             continue;
  19.         }
  20.         if(S_ISREG(buf.st_mode)) {
  21.             ptr = "regular";
  22.         }else if(S_ISDIR(buf.st_mode)) {
  23.             ptr = "directory";
  24.         }else if(S_ISCHR(buf.st_mode)) {
  25.             ptr = "character special";
  26.         }else if(S_ISBLK(buf.st_mode)) {
  27.             ptr = "block special";
  28.         }else if(S_ISFIFO(buf.st_mode)){
  29.             ptr = "fifo";
  30.         }else if(S_ISLNK(buf.st_mode)) {
  31.             ptr = "symbolic link";
  32.         }else if(S_ISSOCK(buf.st_mode)){
  33.             ptr = "socket";
  34.         }else
  35.             ptr = "** unknow mode **";
  36.         printf("%s\n",ptr);
  37.     }

  38.     return 0;
  39. }

gwwu@hz-dev2.wgw.com:~/test/file>gcc -g lstate.c -o lstate -Wall                          
gwwu@hz-dev2.wgw.com:~/test/file>./lstate /etc/passwd /etc/ /dev/log /dev/tty /dev/ram0 /dev/stderr
/etc/passwd: regular
/etc/: directory
/dev/log: socket
/dev/tty: character special
/dev/ram0: block special
/dev/stderr: symbolic link-----使用lstat时候显示是symblic link

当使用stat时候,/dev/stderr: character special, 因为实际指向类型是character special

2.st_size
  以字节为单位的文件长度。此字段只对普通文件,目录文件和符号链接文件有意义。
普通文件,文件长度可以为0;
目录文件,文件长度通常为某个数(16/512)的倍数;
符号链接文件,文件长度是文件名中的实际字节数:
lrwxrwxrwx.   1 root root           8 Oct 20  2012 tclsh -> tclsh8.5
8表示8个字节,就是tclsh8.5的长度。

3.st_blksize/st_blocks
st_blksize是对文件I/O比较合适的块长度,当将st_blksize用于读操作时,读一个文件所需的时间量最少。
st_blocks是所分配的实际512字节块的数量


阅读(633) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~