c - 检测文件类型(常规文件、目录、符号链接(symbolic link)等)

标签 c

我正在尝试使用 stat(2)确定 argv[i] 是否是常规文件、目录或符号链接(symbolic link)。从 stat(2) 手册页中我不明白两件事:

  1. stat(2) 采用的第二个参数是什么(即 buf arg)

     int stat(const char *path, struct stat *buf);
    
  2. 如何使用返回值来确定它是 reg 文件、目录还是符号链接(symbolic link)?

最佳答案

要回答第一个问题,您可以取消引用 stat 结构体的实例,并将取消引用的值传递给 stat() 以填充实例的字段值:

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

/* ... */

struct stat foo;
const char *path = "/a/b/c";

/* test the result of stat() to make sure it ran correctly */

if (stat(path, &foo) != 0) { 
    fprintf(stderr, "something went wrong with stat()\n"); 
    exit(EXIT_FAILURE); 
}

/* now do stuff with foo; e.g. from docs: */

switch (foo.st_mode & S_IFMT) {
    case S_IFBLK:  printf("block device\n");            break;
    case S_IFCHR:  printf("character device\n");        break;
    case S_IFDIR:  printf("directory\n");               break;
    case S_IFIFO:  printf("FIFO/pipe\n");               break;
    case S_IFLNK:  printf("symlink\n");                 break;
    case S_IFREG:  printf("regular file\n");            break;
    case S_IFSOCK: printf("socket\n");                  break;
    default:       printf("unknown?\n");                break;
}

要回答第二个问题,请参阅您链接到的文档:

The following POSIX macros are defined to check 
the file type using the st_mode field:

S_ISREG(m) - is it a regular file?
S_ISDIR(m) - directory?
S_ISCHR(m) - character device?
S_ISBLK(m) - block device?
S_ISFIFO(m) - FIFO (named pipe)?
S_ISLNK(m) - symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) - socket? (Not in POSIX.1-1996.)

如果 stat() 成功,st_mode 字段就会填充,因此您可以将该结果传递给上面列出的宏:

if (S_ISREG(foo.st_mode)) { 
    fprintf(stderr, "whatever foo points to is a regular file\n"); 
}
else {
    fprintf(stderr, "whatever foo points to is something else\n"); 
}

您应该首先测试 stat() 的结果,以确保 st_mode 和其他字段中有可用的值。再次,请引用文档,它实际上写得很好,或者参见上面的代码片段。

关于c - 检测文件类型(常规文件、目录、符号链接(symbolic link)等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25586516/

相关文章:

c - 区分定时器生成的 sigalrm 和用户生成的 sigalrm

c - 如何找到动态数组的大小

c++ - 如何使用指针从不同的函数访问局部变量?

C11 _通用 : how to deal with string literals?

c - 具有某些值的 realloc 的奇怪行为

c - 这个嵌套循环的简单解释是什么

c - 指向结构的指针声明会为其成员分配内存吗?

c++ - 使用 openmp 无法达到所需的速度

c - 为什么用 float 除以 10 的幂不如直接输入数字准确?

c - Linux 中的启动默认堆大小?