温馨提示×

readdir如何实现目录监控

小樊
58
2025-08-20 13:19:34
栏目: 编程语言

readdir 是一个用于读取目录内容的函数,通常在 C 语言中使用。要实现目录监控,你可以定期调用 readdir 函数来检查目录内容是否发生变化。以下是一个简单的示例,展示了如何使用 readdir 实现目录监控:

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <time.h>

#define CHECK_INTERVAL 1 // 监控间隔时间,单位:秒

int main() {
    const char *dir_path = "/path/to/your/directory"; // 要监控的目录路径
    struct dirent *entry;
    DIR *dp;
    struct stat dir_stat_before, dir_stat_after;
    int directory_exists = 1;

    // 获取初始目录状态
    if (stat(dir_path, &dir_stat_before) != 0) {
        perror("stat");
        return 1;
    }

    while (1) {
        sleep(CHECK_INTERVAL);

        // 检查目录是否存在
        if (access(dir_path, F_OK) == -1) {
            directory_exists = 0;
            break;
        }

        if (directory_exists) {
            // 获取更新后的目录状态
            if (stat(dir_path, &dir_stat_after) != 0) {
                perror("stat");
                return 1;
            }

            // 比较目录状态,如果发生变化,则重新读取目录内容
            if (memcmp(&dir_stat_before, &dir_stat_after, sizeof(dir_stat_before)) != 0) {
                printf("Directory changed, updating...\n");

                // 关闭之前的目录流
                if (dp) {
                    closedir(dp);
                }

                // 打开目录
                dp = opendir(dir_path);
                if (!dp) {
                    perror("opendir");
                    return 1;
                }

                // 读取并打印目录内容
                while ((entry = readdir(dp)) != NULL) {
                    printf("%s\n", entry->d_name);
                }

                // 关闭目录流并更新目录状态
                closedir(dp);
                memcpy(&dir_stat_before, &dir_stat_after, sizeof(dir_stat_before));
            }
        } else {
            printf("Directory does not exist anymore.\n");
            break;
        }
    }

    return 0;
}

这个示例程序会每隔 CHECK_INTERVAL 秒检查一次指定目录的内容是否发生变化。如果发生变化,它会重新读取目录并打印出新的内容。请注意,这个示例仅适用于简单的目录监控场景,可能无法检测到所有类型的文件系统事件。对于更高级的目录监控需求,你可以考虑使用操作系统提供的专门工具或库,如 Linux 的 inotify 或 Windows 的 ReadDirectoryChangesW。

0