C语言不使用stat()函数读取文件状态的其他实现方法有哪些?
C语言读取文件状态的其他可用方法
除了stat()外,C语言生态下还有多个适配不同场景的文件状态读取方案,按适用场景分类如下:
- POSIX标准兼容接口(类Unix/Linux/macOS/Android等平台通用)
fstat(int fd, struct stat *buf):入参为已通过open()打开的文件描述符,无需重复做路径解析,效率更高,还能避免路径解析带来的竞态问题,返回的struct stat结构和stat()完全一致。lstat(const char *pathname, struct stat *buf):和stat()的唯一区别是不会自动解引用符号链接,如果你需要获取软链接本身的属性(而非它指向的目标文件属性),必须使用该接口。fstatat(int dirfd, const char *pathname, struct stat *buf, int flags):POSIX.1-2008新增的灵活接口,支持基于已打开的目录文件描述符传入相对路径查询状态,通过flags参数可配置是否解引用符号链接,适合批量处理同目录下文件的场景。
- Windows平台原生接口
不依赖POSIX兼容层的Windows原生开发场景下,可以使用Win32 API:GetFileAttributesExW():传入Unicode格式的文件路径,直接获取文件属性信息,返回结果存储在WIN32_FILE_ATTRIBUTE_DATA结构体中。GetFileInformationByHandle():入参为已打开的文件句柄,返回更全的文件状态信息,包含文件唯一索引、创建/修改/访问时间、大小等核心属性。
// lstat使用示例(POSIX环境) #include <stdio.h> #include <sys/stat.h> #include <unistd.h> int main(void) { struct stat file_stat; // 直接获取软链接本身的状态,不会追踪到指向的目标文件 if (lstat("./test_link", &file_stat) != 0) { perror("lstat执行失败"); return 1; } printf("软链接自身大小:%ld字节\n", file_stat.st_size); printf("软链接最后修改时间:%ld秒\n", file_stat.st_mtime); return 0; }
注意:所有POSIX系列的状态查询接口都需要引入<sys/stat.h>头文件,Windows原生接口需要引入<windows.h>头文件。
内容的提问来源于stack exchange,提问作者Kevin CM
相关产品推荐
相关产品推荐

