使用 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;
}
compare_directories 函數:這個函數用于比較兩個目錄的內容。它打開兩個目錄,逐個讀取條目,并使用 stat 函數獲取文件的 inode 和設備號進行比較。
主循環:在主函數中,程序會定期(例如每 5 秒)創建一個臨時目錄,并將當前目錄的內容復制到臨時目錄中。然后調用 compare_directories 函數比較原始目錄和臨時目錄的內容。
處理變化:如果發現目錄內容不同,程序會輸出提示信息。你可以在這里添加處理目錄變化的代碼,比如發送通知或執行其他操作。
system 調用外部命令(如 mkdir、cp 和 rm)可能會帶來安全風險,建議使用更安全的文件操作函數。對于更高級的目錄監控需求,可以考慮使用 inotify(在 Linux 上)或其他操作系統提供的文件系統事件通知機制。