Chinaunix首页 | 论坛 | 博客
  • 博客访问: 217272
  • 博文数量: 36
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 374
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-04 18:21
文章分类

全部博文(36)

文章存档

2011年(1)

2009年(5)

2008年(30)

我的朋友

分类: C/C++

2008-04-01 10:30:43

相关函数:fstat, lstat, chmod, chown, readlink, utime
表头文件:#include
               #include
定义函数:int  stat(const  char *file_name, struct  stat  *buf);
函数说明:stat()用来将参数file_name所指的文件状态, 复制到参数buf所指的结构中(struct  stat)。 下面是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 (if inodedevice)*/
     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 last access*/
     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             连到该文件的硬连接(hard link)数目, 刚建立的文件值为1
st_uid              文件所有者的用户识别码(user  ID)
st_gid              文件所有者的组识别码(group  ID)
st_rdev            若此文件为装置 文件,则为其 编号
st_size             文件大小,以字节计算
st_blksize         文件 的I/O缓冲区大小
st_blocks         占用文件区块的个数,每一区块大小为512个字节
st_atime          文件最近一次被存取或被执行的 ,一般只有在用mknod, utime, read, write 与 truncate时改变
st_mtime         文件最后一次被修改的 ,一般只有在用mknod, utime 和 write时才会改变
st_ctime          i-node最近一次被更改的 ,此参数会在文件所有者、组、 被更改时更新

st_mode定义的情况
S_IFMT          0170000                   文件类型的位遮罩
S_IFSOCK       0140000                   socket
S_IFLNK         0120000                   符号连接(symbolic  link)
S_IFREG         0100000                   一般文件
S_IFBLK         0060000                    区块装置(block  device)
S_IFDIR         0040000                  
S_IFCHR        0020000                    字符装置(character  device)
S_IFIFO         0010000                    先进先出(fifo)
S_ISUID        0004000                   文件的(set user-id on execution)  位
S_ISGID        0002000                   文件的(set group-id on  execution)位
S_ISVTX       0001000                   文件的sticky位
S_IRWXU      00700                         文件所有者的遮罩值(即所有 值)
S_IRUSR       00400                        文件所有者具 可读取
S_IWUSR      00200                         文件所有者具可写入
S_IXUSR        00100                      文件所有者具可执行
S_IRWXG      00070                         用户组遮罩值
S_IRGRP        00040                      用户组具可读取
S_IWGRP       00020                      用户组具可写入
S_IXGRP         00010                       用户组具可执行
S_IRWXO        00007                       其他用户的遮罩值(即所有 值)
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)                                   是否为先进先出(fifo)
S_ISSOCK(st_mode)                         是否为socket

若一 具有sticky位(S_ISVTX), 则表示在此 下的文件只能被该文件所有者、此 所有者或root来删除(delete)或改名(rename)
返回值:  执行成功返回0,  失败返回-1,  错误代码存于errno
错误代码:ENOENT                            参数file_name指定的文件不存在
               ENOTDIR                         路径中的 存在但却非真正的
               ELOOP                            欲打开的文件有过多符号连接问题,上限为16符号连接
                EFAULT                             参数buf为无效指针,指向无法存在的
               EACCESS                         存取文件时被拒绝
               ENOMEM                           不足
                ENAMETOOLONG               参数file_name的路径名称太长

范例:
/*显示 /etc/passwd文件大小*/
#include
#include
main()
{
      struct  stat  buf;
      stat("/etc/passwd", &buf);
      printf("/etc/passwd file size = %d\n", buf.st_size);
}
阅读(1945) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~