linux

如何用readdir实现目录监控

小樊
49
2025-07-16 13:13:19
栏目: 编程语言

使用 readdir 函数来实现目录监控是一种基本的方法,但需要注意的是,readdir 本身并不提供实时监控功能。它主要用于读取目录的内容。要实现目录监控,通常需要结合其他机制,比如定期轮询目录内容的变化。以下是一个使用 readdir 在 C 语言中实现简单目录监控的示例:

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

// 函数用于比较两个目录的内容
int compare_directories(const char *dir1, const char *dir2) {
    DIR *d1 = opendir(dir1);
    DIR *d2 = opendir(dir2);
    struct dirent *entry;

    if (!d1 || !d2) {
        return -1; // 打开目录失败
    }

    while ((entry = readdir(d1)) != NULL) {
        char path1[1024], path2[1024];
        snprintf(path1, sizeof(path1), "%s/%s", dir1, entry->d_name);
        snprintf(path2, sizeof(path2), "%s/%s", dir2, entry->d_name);

        struct stat st1, st2;
        stat(path1, &st1);
        stat(path2, &st2);

        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue; // 跳过当前目录和父目录
        }

        if (st1.st_ino != st2.st_ino || st1.st_dev != st2.st_dev) {
            closedir(d1);
            closedir(d2);
            return -1; // 目录内容不同
        }
    }

    // 检查第二个目录是否有第一个目录没有的文件
    while ((entry = readdir(d2)) != NULL) {
        char path1[1024], path2[1024];
        snprintf(path1, sizeof(path1), "%s/%s", dir1, entry->d_name);
        snprintf(path2, sizeof(path2), "%s/%s", dir2, entry->d_name);

        struct stat st1, st2;
        stat(path1, &st1);
        stat(path2, &st2);

        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue; // 跳过当前目录和父目录
        }

        if (st1.st_ino != st2.st_ino || st1.st_dev != st2.st_dev) {
            closedir(d1);
            closedir(d2);
            return -1; // 目录内容不同
        }
    }

    closedir(d1);
    closedir(d2);
    return 0; // 目录内容相同
}

int main() {
    const char *path = "/path/to/directory";
    char temp_path[1024];

    while (1) {
        // 创建一个临时目录用于存储上一次的目录内容
        snprintf(temp_path, sizeof(temp_path), "%s/temp_dir_%ld", path, time(NULL));
        system("mkdir -p " temp_path);

        // 复制当前目录内容到临时目录
        system("cp -r " path "/* " temp_path);

        // 比较目录内容
        if (compare_directories(path, temp_path) != 0) {
            printf("Directory %s has changed!
", path);
            // 在这里可以添加处理目录变化的代码
        }

        // 删除临时目录
        system("rm -rf " temp_path);

        // 等待一段时间后再次检查
        sleep(5);
    }

    return 0;
}

说明:

  1. compare_directories 函数:这个函数用于比较两个目录的内容。它打开两个目录,逐个读取条目,并使用 stat 函数获取文件的 inode 和设备号进行比较。

  2. 主循环:在主函数中,程序会定期(例如每 5 秒)创建一个临时目录,并将当前目录的内容复制到临时目录中。然后调用 compare_directories 函数比较原始目录和临时目录的内容。

  3. 处理变化:如果发现目录内容不同,程序会输出提示信息。你可以在这里添加处理目录变化的代码,比如发送通知或执行其他操作。

注意事项:

对于更高级的目录监控需求,可以考虑使用 inotify(在 Linux 上)或其他操作系统提供的文件系统事件通知机制。

0
看了该问题的人还看了