linux

如何用copendir实现目录过滤功能

小樊
38
2025-08-20 09:07:27
栏目: 编程语言

opendir 是一个用于打开目录的函数,它返回一个指向 DIR 结构的指针,该结构包含了目录的信息。要实现目录过滤功能,你可以结合使用 readdir 函数和正则表达式库(如 regex.h)来筛选出符合条件的文件和子目录。

以下是一个简单的示例,展示了如何使用 opendirreaddir 实现目录过滤功能:

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <regex.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("Usage: %s <directory> <pattern>\n", argv[0]);
        return 1;
    }

    const char *dir_path = argv[1];
    const char *pattern = argv[2];

    DIR *dir = opendir(dir_path);
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

    struct dirent *entry;
    regex_t regex;
    int reti;

    // Compile the regular expression
    reti = regcomp(&regex, pattern, REG_EXTENDED);
    if (reti) {
        fprintf(stderr, "Could not compile regex\n");
        return 1;
    }

    // Iterate through the directory entries
    while ((entry = readdir(dir)) != NULL) {
        // Skip "." and ".." entries
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue;
        }

        // Apply the regular expression to the entry name
        reti = regexec(&regex, entry->d_name, 0, NULL, 0);
        if (!reti) {
            printf("%s\n", entry->d_name);
        }
    }

    // Free the compiled regular expression
    regfree(&regex);

    // Close the directory
    closedir(dir);

    return 0;
}

这个程序接受两个命令行参数:一个目录路径和一个正则表达式模式。它打开指定的目录,然后使用 readdir 函数读取目录中的每个条目。对于每个条目,它使用 regexec 函数检查条目名称是否与正则表达式匹配。如果匹配,则输出该条目的名称。

要编译并运行此程序,请将其保存为 filter_directory.c,然后使用以下命令:

gcc filter_directory.c -o filter_directory
./filter_directory <directory> <pattern>

<directory> 替换为要过滤的目录路径,将 <pattern> 替换为正则表达式模式。

0
看了该问题的人还看了