问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言如何读取文件属性

创作时间:
作者:
@小白创作中心

C语言如何读取文件属性

引用
1
来源
1.
https://docs.pingcode.com/baike/1225055

在C语言开发中,了解如何读取文件属性是非常重要的技能。本文将详细介绍如何使用stat和fstat函数获取文件的大小、权限、最后修改时间等信息,并提供详细的示例代码。

一、使用stat函数读取文件属性

stat函数是C语言标准库中的一个函数,主要用于获取文件的状态信息。它的原型如下:

#include <sys/types.h>
#include <sys/stat.h>  
#include <unistd.h>  
int stat(const char *path, struct stat *buf);  

stat函数接受两个参数:文件路径和一个指向stat结构体的指针。调用该函数后,文件的属性信息将存储在stat结构体中。

1.1、结构体stat的成员

stat结构体定义在sys/stat.h头文件中,包含多个成员用于存储文件属性信息。常用的成员包括:

  • st_mode:文件类型和权限
  • st_size:文件大小(字节数)
  • st_atime:最后访问时间
  • st_mtime:最后修改时间
  • st_ctime:最后状态改变时间

1.2、示例代码

以下是一个示例代码,演示如何使用stat函数读取文件属性:

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

void print_file_info(const char *filename) {  
    struct stat file_stat;  
    if (stat(filename, &file_stat) == -1) {  
        perror("stat");  
        return;  
    }  
    printf("File: %sn", filename);  
    printf("Size: %ld bytesn", file_stat.st_size);  
    printf("Permissions: %on", file_stat.st_mode & 0777);  
    printf("Last accessed: %ldn", file_stat.st_atime);  
    printf("Last modified: %ldn", file_stat.st_mtime);  
    printf("Last status change: %ldn", file_stat.st_ctime);  
}  

int main(int argc, char *argv[]) {  
    if (argc != 2) {  
        fprintf(stderr, "Usage: %s <file_path>n", argv[0]);  
        return 1;  
    }  
    print_file_info(argv[1]);  
    return 0;  
}  

在上面的代码中,我们定义了一个函数print_file_info,用于打印文件的基本信息。stat函数被用于获取文件的属性信息,并将这些信息打印到标准输出。

二、使用fstat函数读取文件属性

fstat函数与stat函数类似,但它接受一个文件描述符而不是文件路径。其原型如下:

#include <sys/types.h>
#include <sys/stat.h>  
#include <unistd.h>  
int fstat(int fd, struct stat *buf);  

2.1、示例代码

以下是一个示例代码,演示如何使用fstat函数读取文件属性:

#include <stdio.h>
#include <sys/types.h>  
#include <sys/stat.h>  
#include <unistd.h>  
#include <fcntl.h>  

void print_file_info(int fd) {  
    struct stat file_stat;  
    if (fstat(fd, &file_stat) == -1) {  
        perror("fstat");  
        return;  
    }  
    printf("Size: %ld bytesn", file_stat.st_size);  
    printf("Permissions: %on", file_stat.st_mode & 0777);  
    printf("Last accessed: %ldn", file_stat.st_atime);  
    printf("Last modified: %ldn", file_stat.st_mtime);  
    printf("Last status change: %ldn", file_stat.st_ctime);  
}  

int main(int argc, char *argv[]) {  
    if (argc != 2) {  
        fprintf(stderr, "Usage: %s <file_path>n", argv[0]);  
        return 1;  
    }  
    int fd = open(argv[1], O_RDONLY);  
    if (fd == -1) {  
        perror("open");  
        return 1;  
    }  
    print_file_info(fd);  
    close(fd);  
    return 0;  
}  

三、文件权限和类型解析

在stat结构体中,st_mode成员用于存储文件的类型和权限信息。可以使用以下宏和操作符来解析文件类型和权限:

3.1、文件类型宏

  • S_ISREG(m):是否为常规文件
  • S_ISDIR(m):是否为目录
  • S_ISLNK(m):是否为符号链接
  • S_ISCHR(m):是否为字符设备
  • S_ISBLK(m):是否为块设备
  • S_ISFIFO(m):是否为FIFO/管道
  • S_ISSOCK(m):是否为套接字

3.2、文件权限操作符

  • S_IRUSR:文件所有者的读权限
  • S_IWUSR:文件所有者的写权限
  • S_IXUSR:文件所有者的执行权限
  • S_IRGRP:文件所属组的读权限
  • S_IWGRP:文件所属组的写权限
  • S_IXGRP:文件所属组的执行权限
  • S_IROTH:其他用户的读权限
  • S_IWOTH:其他用户的写权限
  • S_IXOTH:其他用户的执行权限

3.3、示例代码

以下是一个示例代码,演示如何解析文件类型和权限:

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

void print_file_type_and_permissions(const char *filename) {  
    struct stat file_stat;  
    if (stat(filename, &file_stat) == -1) {  
        perror("stat");  
        return;  
    }  
    printf("File: %sn", filename);  
    printf("Type: ");  
    if (S_ISREG(file_stat.st_mode)) {  
        printf("regular filen");  
    } else if (S_ISDIR(file_stat.st_mode)) {  
        printf("directoryn");  
    } else if (S_ISLNK(file_stat.st_mode)) {  
        printf("symbolic linkn");  
    } else if (S_ISCHR(file_stat.st_mode)) {  
        printf("character devicen");  
    } else if (S_ISBLK(file_stat.st_mode)) {  
        printf("block devicen");  
    } else if (S_ISFIFO(file_stat.st_mode)) {  
        printf("FIFO/pipen");  
    } else if (S_ISSOCK(file_stat.st_mode)) {  
        printf("socketn");  
    } else {  
        printf("unknownn");  
    }  
    printf("Permissions: ");  
    printf((file_stat.st_mode & S_IRUSR) ? "r" : "-");  
    printf((file_stat.st_mode & S_IWUSR) ? "w" : "-");  
    printf((file_stat.st_mode & S_IXUSR) ? "x" : "-");  
    printf((file_stat.st_mode & S_IRGRP) ? "r" : "-");  
    printf((file_stat.st_mode & S_IWGRP) ? "w" : "-");  
    printf((file_stat.st_mode & S_IXGRP) ? "x" : "-");  
    printf((file_stat.st_mode & S_IROTH) ? "r" : "-");  
    printf((file_stat.st_mode & S_IWOTH) ? "w" : "-");  
    printf((file_stat.st_mode & S_IXOTH) ? "x" : "-");  
    printf("n");  
}  

int main(int argc, char *argv[]) {  
    if (argc != 2) {  
        fprintf(stderr, "Usage: %s <file_path>n", argv[0]);  
        return 1;  
    }  
    print_file_type_and_permissions(argv[1]);  
    return 0;  
}  

在这段代码中,我们定义了一个函数print_file_type_and_permissions,用于打印文件的类型和权限信息。通过使用stat函数获取文件属性并解析st_mode成员,我们能够确定文件的类型和权限。

四、总结

通过本文的介绍,您已经了解了如何在C语言中使用stat和fstat函数读取文件属性,并掌握了解析文件类型和权限的方法。在实际的项目开发中,这些知识可以帮助您更好地管理和跟踪文件属性,提升开发效率。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号