溫馨提示×

如何用readdir實現目錄監控

小樊
48
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. 處理變化:如果發現目錄內容不同,程序會輸出提示信息。你可以在這里添加處理目錄變化的代碼,比如發送通知或執行其他操作。

注意事項:

  • 這種方法比較簡單,但可能不夠高效,尤其是在目錄內容較多或變化頻繁的情況下。
  • 使用 system 調用外部命令(如 mkdir、cprm)可能會帶來安全風險,建議使用更安全的文件操作函數。
  • 這種方法無法檢測到目錄中文件的元數據變化(如權限、所有者等),只能檢測文件的存在與否。

對于更高級的目錄監控需求,可以考慮使用 inotify(在 Linux 上)或其他操作系統提供的文件系統事件通知機制。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女