当前位置:   article > 正文

关于Linux下的stat()函数_linux stat函数

linux stat函数



一、stat()的组成

头文件

#include <sys/stat.h>
#include <unistd.h>

定义函数:    int stat(const char *file_name, struct stat *buf);
  • 1
函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
  • 1
返回值:     执行成功则返回0,失败返回-1,错误代码存于errno
  • 1
错误代码errno:
    ENOENT         参数file_name指定的文件不存在
    ENOTDIR        路径中的目录存在但却非真正的目录
    ELOOP          欲打开的文件有过多符号连接问题,上限为16符号连接
    EFAULT         参数buf为无效指针,指向无法存在的内存空间
    EACCESS        存取文件时被拒绝
    ENOMEM         核心内存不足
    ENAMETOOLONG   参数file_name的路径名称太长
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

结构体内部

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

二、具体使用

1.简单的ls程序

代码如下():

#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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

2.运行结果如下

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/523112
推荐阅读
相关标签
  

闽ICP备14008679号