关于Linux下的stat()函数



一、stat()的组成

头文件

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

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

结构体内部

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.简单的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;
}


2.运行结果如下

在这里插入图片描述

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: stat() 函数Linux操作系统中的一个系统调用函数,用于获取文件或者文件系统的状态信息,包括文件类型、权限、所有者、创建时间、最后修改时间等等。调用该函数需要传递文件或者目录的路径,函数将返回一个结构体,其中包含了所需的文件或目录的状态信息。该函数可以帮助开发者在程序中获取并处理文件或者目录的信息。 ### 回答2: linux stat函数是一个用于获取文件或者文件系统状态的函数。它使用一个文件路径来作为参数,并在成功调用后返回一个结构体,该结构体包含了文件的元数据。值得注意的是,metada是指文件的属性,如权限、拥有者、大小等等。 linux stat函数的返回结构体如下: ``` struct stat { dev_t st_dev; /* 设备编号 */ ino_t st_ino; /* 节点编号 */ mode_t st_mode; /* 文件类型和文件模式 */ nlink_t st_nlink; /* 硬链接数量 */ uid_t st_uid; /* 用户ID */ gid_t st_gid; /* 组ID */ dev_t st_rdev; /* 设备文件类型 */ off_t st_size; /* 文件字节数 */ blksize_t st_blksize; /* 块大小 */ blkcnt_t st_blocks; /* 分配的块数量 */ time_t st_atime; /* 上次访问时间 */ time_t st_mtime; /* 上次修改时间 */ time_t st_ctime; /* 上次状态变化时间 */ }; ``` 其中最常用的属性可能是文件类型和文件模式。文件类型包括普通文本文件、目录、设备文件等等。文件模式指定了文件的权限信息,如读、写、可执行等等。 在调用linux stat函数时需要注意的是,如果传入的文件路径存在符号链接,那么函数会返回符号链接指向的文件信息而非符号链接本身的信息。如果想获取符号链接本身的信息,需要使用lstat函数。此外,如果linux stat函数调用失败,函数会返回-1,并设置errno来指示错误的类型。可以通过使用perror函数来输出该错误信息。 总体而言,linux stat函数是一个非常重要的函数,它提供了许多关于文件的元数据,为文件管理和应用程序开发提供了基础。 ### 回答3: stat 函数是一个系统调用,用于获取文件或者文件系统的元数据信息。在 Linux 系统中,stat 函数被广泛应用在文件管理、防止文件重名和处理网络请求等各个领域。 stat 函数的语法如下: int stat(const char *path, struct stat *buf); 其中,path 表示要获取元数据的文件路径,buf 是一个结构体指针,用来存储获取到的元数据信息。 struct stat 结构体包含了文件的全部元数据信息,主要包括以下字段: • st_mode:文件类型和访问权限。 • st_ino:文件的 i 节点号(inode)。 • st_dev:文件所在设备的编号。 • st_size:文件的字节数。 • st_mtime:文件最后修改时间。 • st_ctime:文件状态最后修改时间。 • st_uid:文件的拥有者 ID。 • st_gid:文件的所属组 ID。 使用 stat 函数可以对文件进行判断和操作,例如: • 判断文件类型:可以根据 st_mode 属性判断文件类型,如判断是否为目录、普通文件、符号链接等。 • 修改文件权限:可以使用 chmod 函数来修改 st_mode 属性,从而改变文件的访问权限。 • 获取文件长度:可以使用 st_size 属性来获取文件的长度信息,用于读取文件等操作。 • 判断文件是否修改过:可以使用 st_mtime 属性来判断文件是否被修改过,从而避免重复处理文件。 值得注意的是,在使用 stat 函数时,需要保证传入的文件路径和指针有效。同时,由于系统调用较为底层,使用 stat 函数涉及到的编程操作比较繁琐,需要仔细检查返回值和错误码等信息,以避免出现程序错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值