在 C 語言中,我們可以使用標準庫中的 dirent.h 頭文件來遍歷文件夾和文件,同時通過 cJSON 庫來輸出 json 格式的數據。
#include <stdio.h> #include <dirent.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> #include <cJSON.h> #define MAX_PATH 1024 bool is_directory(char *path) { DIR *dir = opendir(path); if (dir != NULL) { closedir(dir); return true; } return false; } void traverse_directory(char *path, cJSON *json_obj) { DIR *dir; struct dirent *entry; char subpath[MAX_PATH]; if ((dir = opendir(path)) == NULL) { perror("opendir error"); exit(EXIT_FAILURE); } while ((entry = readdir(dir)) != NULL) { if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; sprintf(subpath, "%s/%s", path, entry->d_name); if (is_directory(subpath)) { cJSON *new_json_obj = cJSON_CreateObject(); cJSON_AddItemToObject(json_obj, entry->d_name, new_json_obj); traverse_directory(subpath, new_json_obj); } else { cJSON_AddItemToObject(json_obj, entry->d_name, cJSON_CreateString(subpath)); } } closedir(dir); } int main(int argc, char **argv) { char *path = argc >1 ? argv[1] : "."; cJSON *json_obj = cJSON_CreateObject(); traverse_directory(path, json_obj); char *json_str = cJSON_Print(json_obj); printf("%s", json_str); free(json_str); cJSON_Delete(json_obj); return 0; }
上面的代碼中,我們定義了一個 is_directory 函數來判斷一個路徑是否是文件夾,如果是文件夾就返回 true,否則返回 false。同時,我們還定義了一個 traverse_directory 函數來遍歷文件夾和文件,并且使用 cJSON 庫來輸出 json 格式的數據。
在 main 函數中,我們先定義了一個 json_obj 指針,然后通過 traverse_directory 函數來遍歷指定的路徑,最后使用 cJSON_Print 把 json_obj 輸出為字符串,并通過 printf 輸出到控制臺。
完整的代碼示例可以在 GitHub 上找到:https://github.com/TroyLiu1996/c-traverse-directory-and-output-json
上一篇c 遍歷讀取json對象
下一篇c 遍歷解析json