linux

Linux readdir过滤特定文件方法

小樊
39
2025-07-20 14:00:34
栏目: 智能运维

在Linux中,你可以使用readdir函数来读取目录中的文件。如果你想要过滤特定的文件,可以在遍历目录时检查每个文件的名称,然后根据需要决定是否处理该文件。

以下是一个简单的示例,展示了如何使用readdir函数过滤掉名为".DS_Store"的文件(这是macOS系统中用于存储文件夹自定义属性的隐藏文件):

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

int main(int argc, char *argv[]) {
    DIR *dir;
    struct dirent *entry;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
        return EXIT_FAILURE;
    }

    dir = opendir(argv[1]);
    if (dir == NULL) {
        perror("opendir");
        return EXIT_FAILURE;
    }

    while ((entry = readdir(dir)) != NULL) {
        // 过滤掉名为".DS_Store"的文件
        if (strcmp(entry->d_name, ".DS_Store") != 0) {
            printf("%s\n", entry->d_name);
        }
    }

    closedir(dir);
    return EXIT_SUCCESS;
}

编译并运行这个程序,传入一个目录作为参数,它将打印出该目录中除了".DS_Store"文件之外的所有文件。

如果你想要根据其他条件过滤文件,例如文件扩展名或者文件类型,你可以修改if语句来实现相应的逻辑。例如,以下代码将只打印出以".txt"结尾的文件:

// ...
while ((entry = readdir(dir)) != NULL) {
    // 只打印出以".txt"结尾的文件
    if (strstr(entry->d_name, ".txt") != NULL) {
        printf("%s\n", entry->d_name);
    }
}
// ...

请注意,readdir函数返回的文件名不包含路径信息,所以如果你需要处理文件的完整路径,你需要将目录名和文件名拼接起来。例如:

char path[PATH_MAX];

// ...
while ((entry = readdir(dir)) != NULL) {
    // 跳过".DS_Store"文件
    if (strcmp(entry->d_name, ".DS_Store") == 0) {
        continue;
    }

    // 拼接目录名和文件名
    snprintf(path, sizeof(path), "%s/%s", argv[1], entry->d_name);

    // 现在你可以使用完整路径来处理文件
    printf("%s\n", path);
}
// ...

在实际应用中,你可能需要根据具体需求来调整过滤条件和处理逻辑。

0
看了该问题的人还看了