Linux获取文件信息的利器stat,fstat,lstat,fstatat

2023-12-13 20:17:46

如果觉得小弟写的可以,请点一下关注支持

解析C语言中的stat函数:获取文件信息的利器

在C语言中,stat 系列函数是一个非常有用的工具,用于获取文件的各种信息。无论是文件大小、权限还是最后修改时间,stat 都能提供这些必要的数据。让我们一起深入了解它吧!

1. 介绍

stat 系列函数是C语言中的一个系统调用函数,用于获取文件的信息。通过提供文件路径,它能够返回包含文件属性的结构体数据。

2. 函数签名和参数

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

int stat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);

#include <fcntl.h>           /* Definition of AT_* constants */
#include <sys/stat.h>

int fstatat(int dirfd, const char *pathname, struct stat *statbuf,int flags);

其中,path 是文件路径,buf 是一个 struct stat 结构体指针,用于存储文件信息。

3. 文件信息

struct stat {
               dev_t     st_dev;         /* ID of device containing file */
               ino_t     st_ino;         /* Inode number */
               mode_t    st_mode;        /* File type and mode */
               nlink_t   st_nlink;       /* Number of hard links */
               mode_t    st_mode;        /* File type and mode */
               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;     /* Block size for filesystem I/O */
               blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */

               /* Since Linux 2.6, the kernel supports nanosecond
                  precision for the following timestamp fields.
                  For the details before Linux 2.6, see NOTES. */
    
               struct timespec st_atim;  /* Time of last access */
               struct timespec st_mtim;  /* Time of last modification */
               struct timespec st_ctim;  /* Time of last status change */
};
  • st_mode
    • 文件类型和访问权限的标志位。通过位掩码来确定文件类型(普通文件、目录、符号链接等)以及文件的访问权限(读、写、执行)。
  • st_ino
    • 文件的 inode 号码,用于在文件系统中唯一标识文件。
  • st_dev
    • 文件所在设备的 ID。
  • st_nlink
    • 文件的硬链接数量。
  • st_uid
    • 文件所有者的用户 ID。
  • st_gid
    • 文件所在组的组 ID。
  • st_size
    • 文件大小(以字节为单位)。
  • st_atime
    • 最后一次访问文件的时间。
  • st_mtime
    • 最后一次修改文件内容的时间。
  • st_ctime
    • 最后一次修改文件属性(比如权限)的时间。

4. 示例用法

以下是一个简单的例子,展示如何使用 stat 函数来获取文件大小:

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

int main() {
    const char *file_path = "example.txt";
    struct stat file_info;

    if (stat(file_path, &file_info) == 0) {
        printf("File size of %s: %lld bytes\n", file_path, file_info.st_size);
    } else {
        perror("Error getting file information");
    }

    return 0;
}

5. 错误处理

在使用 stat 函数时,需要注意可能出现的错误情况,比如文件不存在或权限问题。使用 perror 可以输出相关错误信息,方便调试和处理。

6. 与相关函数的比较

除了 stat 函数外,还有类似的函数如 fstatlstatfstatat。它们在获取文件信息时有所不同,比如针对符号链接或文件描述符的处理方式。

stat, fstat, lstat, 和 fstatat 都是用于获取文件信息的系统调用函数,但它们在特定情况下有些许不同:

  1. stat:
    • int stat(const char *path, struct stat *buf)
    • 用于获取文件信息,通过文件路径来查找文件的信息,并将结果存储在 struct stat 结构体中。
    • 如果 path 是符号链接,stat 函数会获取符号链接指向的文件的信息。
  2. fstat:
    • int fstat(int fd, struct stat *buf)
    • stat 类似,但是它是通过文件描述符 fd 来获取已经打开文件的信息,而不是通过文件路径。
    • 因此,不需要指定文件路径,只需要已经打开的文件描述符 fd
  3. lstat:
    • int lstat(const char *path, struct stat *buf)
    • 类似于 stat,但是不会跟踪符号链接,而是获取符号链接本身的信息,而不是链接所指向的文件的信息。
  4. fstatat:
    • int fstatat(int dirfd, const char *pathname, struct stat *buf, int flags)
    • 在处理相对路径时类似于 stat,但它允许相对路径查找,并且可以通过 flags 参数来控制符号链接的解析方式。
    • 可以指定文件描述符 dirfd,如果 pathname 是相对路径,则相对于 dirfd 所指定的目录进行查找。

这些函数在操作文件时都会填充一个 struct stat 结构体,其中包含了文件的各种信息,比如文件类型、大小、权限等。选择使用哪一个函数取决于你的需求和操作的方式。

7. 操作系统差异

不同的操作系统可能对 stat 函数的支持和行为有所差异,需要注意在跨平台开发时可能出现的情况。

8. 最佳实践和注意事项

在使用 stat 函数时,要确保路径正确、检查返回值以及正确处理可能出现的错误,以确保程序的稳定性和可靠性。

9. 扩展阅读和资源

文章来源:https://blog.csdn.net/weixin_50448879/article/details/134977802
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。