以下是一個完整的C函數,用于在指定目錄下自動查找最近更新的日志文件(根據文件名中的時間戳選擇最新的文件):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <regex.h>// 檢查文件名是否符合日志格式: YYYY-MM-DD_HH-MM-SS.log
int is_valid_log_filename(const char *filename) {regex_t regex;int ret;// 編譯正則表達式char *pattern = "^[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}-[0-9]{2}-[0-9]{2}\\.log$";if (regcomp(®ex, pattern, REG_EXTENDED) != 0) {return 0; // 正則編譯失敗}// 執行匹配ret = regexec(®ex, filename, 0, NULL, 0);regfree(®ex);return (ret == 0) ? 1 : 0;
}// 查找最新日志文件
char *find_latest_log(const char *log_dir) {DIR *dir;struct dirent *entry;char *latest_file = NULL;// 打開日志目錄if ((dir = opendir(log_dir)) == NULL) {perror("無法打開日志目錄");return NULL;}// 遍歷目錄中的文件while ((entry = readdir(dir)) != NULL) {// 跳過.和..目錄if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {continue;}// 檢查文件名格式if (is_valid_log_filename(entry->d_name)) {// 如果是第一個有效文件或比當前最新文件更新if (latest_file == NULL || strcmp(entry->d_name, latest_file) > 0) {// 釋放之前的內存(如果有)if (latest_file != NULL) {free(latest_file);}// 分配內存并復制新文件名latest_file = strdup(entry->d_name);if (latest_file == NULL) {perror("內存分配失敗");closedir(dir);return NULL;}}}}closedir(dir);// 如果找到最新文件,構建完整路徑if (latest_file != NULL) {// 計算完整路徑長度size_t path_len = strlen(log_dir) + strlen(latest_file) + 2; // +2 用于'/'和空字符char *full_path = malloc(path_len);if (full_path == NULL) {perror("內存分配失敗");free(latest_file);return NULL;}// 構建完整路徑snprintf(full_path, path_len, "%s/%s", log_dir, latest_file);free(latest_file);return full_path;}return NULL; // 未找到符合條件的日志文件
}// 使用示例:
int main() {const char *log_dir = "/appdata/log";char *latest_log = find_latest_log(log_dir);if (latest_log != NULL) {printf("最新的日志文件是: %s\n", latest_log);free(latest_log);} else {printf("未找到符合條件的日志文件\n");}return 0;
}
函數說明:
is_valid_log_filename
?函數:使用正則表達式驗證文件名是否符合?
YYYY-MM-DD_HH-MM-SS.log
?格式確保只處理符合命名規范的日志文件
find_latest_log
?函數:輸入:日志目錄路徑 (如 "/appdata/log")
輸出:最新日志文件的完整路徑(動態分配的內存,需調用者釋放)
處理流程:
打開指定目錄
遍歷所有文件,跳過 "." 和 ".."
驗證文件名格式是否符合日志文件規范
通過字符串比較找到時間戳最新的文件(文件名越大表示時間越新)
構建完整路徑并返回
內存管理:
使用?
strdup
?和?malloc
?動態分配內存調用者負責使用?
free()
?釋放返回的字符串
錯誤處理:
檢查目錄打開是否成功
處理內存分配失敗的情況
未找到文件時返回 NULL
編譯說明:
需要鏈接正則表達式庫:
bash
復制
下載
gcc -o log_finder log_finder.c -lregex
運行示例:
bash
復制
下載
./log_finder
注意事項:
文件名格式必須嚴格遵循?
YYYY-MM-DD_HH-MM-SS.log
?格式函數僅基于文件名判斷,不檢查文件修改時間
返回的路徑字符串需要調用者釋放內存
如果目錄中有大量文件,建議添加最大文件數量限制
對于嵌入式系統等資源受限環境,可簡化正則表達式檢查
此實現能正確處理您提供的示例文件列表,并返回最新文件(如 "2025-08-15_11-07-58.log")。