stat函数

来源:互联网 发布:网站域名升级访问 编辑:程序博客网 时间:2024/05/21 11:33
stat函数


表头文件:    #include <sys/stat.h> 
  
函数定义:    int stat(const char *file_name, struct stat *buf); 


函数说明:    通过文件名filename获取文件信息,并保存在buf所指的结构体stat中 


返回值:     执行成功则返回0,失败返回-1,错误代码存于errno(需要include <errno.h>)
 
errno错误代码: 
    ENOENT         参数file_name指定的文件不存在 
    ENOTDIR        路径中的目录存在但却非真正的目录 
    ELOOP          欲打开的文件有过多符号连接问题,上限为16符号连接 
    EFAULT         参数buf为无效指针,指向无法存在的内存空间 
    EACCESS        存取文件时被拒绝 
    ENOMEM         核心内存不足 
    ENAMETOOLONG   参数file_name的路径名称太长
 
stat结构体定义:
struct stat
 { 
    dev_t         st_dev;       //文件的设备编号 
  
    ino_t         st_ino;         //节点 


    mode_t        st_mode;   //文件的类型和存取的权限 


    nlink_t       st_nlink;      //连到该文件的硬连接数目,刚建立的文件值为1 


    uid_t         st_uid;        //用户ID 


    gid_t         st_gid;        //组ID 


    dev_t         st_rdev;     //(设备类型)若此文件为设备文件,则为其设备编号 


    off_t         st_size;       //文件字节数(文件大小) 


    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小) 


    unsigned long st_blocks;   //块数 


    time_t        st_atime;      //最后一次访问时间 


    time_t        st_mtime;     //最后一次修改时间 


    time_t        st_ctime;     //最后一次改变时间(指属性) 
};
 文件的类型和存取权限


    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来删除或改名。


-----------------------------------------------------
struct statfs {
    long    f_type;          //文件系统类型
    long    f_bsize;         //块大小
    long    f_blocks;        //块多少
    long    f_bfree;         //空闲的块
    long    f_bavail;        //可用块
    long    f_files;         //总文件节点
    long    f_ffree;         //空闲文件节点
    fsid_t f_fsid;           //文件系统id
    long    f_namelen;       //文件名的最大长度
    long    f_spare[6];      //spare for later
};
示例代码:
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>


int main()
{
    struct stat buf;
    int res = stat("test.txt", &buf);
    if(res != 0)
    {
        printf("stat file fail!\n");


        printf("%d\n", errno);
    }
    else
   {
      printf("file st_dev: %d\n",buf.st_dev);
printf("file st_dev: %d\n",S_ISLNK(buf.st_dev));
          printf("file st_ino: %d\n",buf.st_ino);
          printf("file st_mode: %d\n",buf.st_mode);
          printf("file st_nliink: %d\n",buf.st_nlink);
          printf("file st_uid: %d\n",buf.st_uid);
          printf("file st_gid: %d\n",buf.st_gid);
          printf("file st_rdev: %d\n",buf.st_rdev);
          printf("file st_size: %d\n",buf.st_size);
          printf("file st_atime: %d\n",buf.st_atime);
          printf("file st_mtime: %d\n",buf.st_mtime);
          printf("file st_ctime: %d\n",buf.st_ctime);

   }
    return 0;
}
0 0
原创粉丝点击