C- struct stat 获取文件状态信息的结构体

基本概念

struct stat 是 C 语言中用于获取文件状态信息的结构体。它在 <sys/stat.h> 头文件中定义,主要通过 stat(), fstat(), 和 lstat() 等函数来填充其字段。以下是 struct stat 的详细信息:

  1. 定义:

    c 复制代码
    struct stat {
        dev_t      st_dev;      /* 包含文件的设备的 ID */
        ino_t      st_ino;      /* Inode 编号 */
        mode_t     st_mode;     /* 文件类型和模式 */
        nlink_t    st_nlink;    /* 硬链接数 */
        uid_t      st_uid;      /* 文件所有者的用户 ID */
        gid_t      st_gid;      /* 文件所有者的组 ID */
        dev_t      st_rdev;     /* 设备 ID(如果是特殊文件) */
        off_t      st_size;     /* 总大小,以字节为单位 */
        blksize_t  st_blksize;  /* 文件系统 I/O 的块大小 */
        blkcnt_t   st_blocks;   /* 分配给文件的 512B 块的数量 */
    
        struct timespec  st_atim;  /* 最后访问时间 */
        struct timespec  st_mtim;  /* 最后修改时间 */
        struct timespec  st_ctim;  /* 最后状态更改时间 */
    
        #define st_atime  st_atim.tv_sec  /* 向后兼容性 */
        #define st_mtime  st_mtim.tv_sec
        #define st_ctime  st_ctim.tv_sec
    };

    这个结构体包含了文件的基本信息,例如大小、所有者、权限、最后访问和修改时间等。

  2. 函数:

    • int stat(const char *restrict pathname, struct stat *restrict statbuf); 通过文件的路径名获取文件状态信息,填充 struct stat 结构体。
    • int fstat(int fd, struct stat *statbuf); 通过文件描述符获取文件状态信息,填充 struct stat 结构体。
    • int lstat(const char *restrict pathname, struct stat *restrict statbuf); 类似 stat(),但如果路径名是一个符号链接,lstat() 返回链接本身的信息,而不是链接指向的文件的信息。
  3. 使用 :

    通过调用 stat(), fstat(), 或 lstat() 函数并传递 struct stat 结构体的地址作为参数,可以获取文件的状态信息。这些函数会填充 struct stat 结构体的字段,以便我们可以检索所需的文件信息。例如,可以使用 struct stat 结构体的 st_size 字段来获取文件的大小,或使用 st_mode 字段来获取文件的权限和类型。

struct stat 是一个非常重要和常用的结构体,它允许我们在 C 程序中处理文件和文件系统相关的任务。在编写涉及文件操作的 C 程序时,通常会使用到 struct stat 结构体以及相关的系统调用。

示例

下面,我们来演示如何使用 struct stat 结构体和 stat() 函数来检索特定文件的一些基本信息。假设我们想要获取一个名为 "example.txt" 的文件的大小、所有者 ID 和最后修改时间。

c 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(void)
{
    struct stat statbuf;

    // 获取 "example.txt" 文件的状态信息
    if (stat("example.txt", &statbuf) == -1) {
        perror("stat");
        return 1;
    }

    // 打印文件的大小
    printf("File size: %lld bytes\n", (long long) statbuf.st_size);

    // 打印文件所有者的用户 ID
    printf("Owner UID: %d\n", statbuf.st_uid);

    // 打印文件的最后修改时间
    printf("Last modification time: %ld\n", (long) statbuf.st_mtime);

    return 0;
}

在上述代码中,首先包含了必要的头文件,然后在 main() 函数中声明了一个 struct stat 类型的变量 statbuf。接着,调用 stat() 函数,传递文件名 "example.txt" 和 statbuf 的地址作为参数。如果 stat() 函数成功执行,它将填充 statbuf 结构体的字段,我们就可以通过 statbuf 结构体来访问文件的状态信息,例如文件大小 (st_size)、文件所有者的用户 ID (st_uid) 和文件的最后修改时间 (st_mtime)。

在实际编程中,通过 struct stat 结构体和相关的系统调用,我们可以方便地获取和处理文件及文件系统相关的信息,从而实现更为复杂的文件操作和管理任务。

相关推荐
口袋物联11 小时前
设计模式之工厂模式在 C 语言中的应用(含 Linux 内核实例)
linux·c语言·设计模式·简单工厂模式
Want59513 小时前
C/C++跳动的爱心①
c语言·开发语言·c++
lingggggaaaa13 小时前
免杀对抗——C2远控篇&C&C++&DLL注入&过内存核晶&镂空新增&白加黑链&签名程序劫持
c语言·c++·学习·安全·网络安全·免杀对抗
gfdhy13 小时前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希
我不会插花弄玉14 小时前
vs2022调试基础篇【由浅入深-C语言】
c语言
福尔摩斯张15 小时前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)
linux·运维·服务器·c语言·开发语言·c++·算法
fashion 道格15 小时前
数据结构实战:深入理解队列的链式结构与实现
c语言·数据结构
铁手飞鹰16 小时前
二叉树(C语言,手撕)
c语言·数据结构·算法·二叉树·深度优先·广度优先
[J] 一坚18 小时前
深入浅出理解冒泡、插入排序和归并、快速排序递归调用过程
c语言·数据结构·算法·排序算法
散峰而望19 小时前
C++数组(一)(算法竞赛)
c语言·开发语言·c++·算法·github