Генерация структуры каталогов в json формате - C (СИ)
Формулировка задачи:
Добрый день.
Надо на си изобразить генерацию json подобного файла, в котором была бы записана структура файлов и каталогов.
Сделано следующее:
1. Функция AddToJson, просто записывает данные в конкретный файл
2. Функция AddFolderToJson, добавляет в *json файл запись о каталоге
3. Функция AddFileToJson, добавляет в *json файл запись о файле
4. Функция MakeJsonStructure это рекурсивный цикл перебора всех файлов и каталогов
Запускается все из мэйна примерно так
Это пример правильного формата файла:
Вопрос следующий. Каким образом мне правильно расставить разделительные запятые в json файле?
Тоесть во время рекурсивного перебора файлов и каталогов как мне понять, что текущий каталог последний?
Запятая нужнаЗапятая ненужна Насколько я понимаю, что нужно ставить запятые между рекурсивными вызовами MakeJsonStructure, но как в рекурсии понять этот каталог последний? Запутался немного, буду благодарен за помощь
void AddToJson(char* value) { FILE *fw; int numwritten; if ((fw = fopen("data.json", "a+")) != NULL) { numwritten = fwrite(value, sizeof(char), strlen(value), fw); fclose(fw); } else printf("Problem opening the file\n"); }
void AddFolderToJson(char* id, char* directoryName, char pathToFile[]) { AddToJson("{id:"); AddToJson(id); AddToJson(", text:\""); AddToJson(directoryName); AddToJson("\", item:[\n"); MakeJsonStructure(pathToFile); AddToJson("]}\n"); }
void AddFileToJson(char* id, char* value) { AddToJson("{id:"); AddToJson(id); AddToJson(", text:\""); AddToJson(value); AddToJson("\"}"); }
int MakeJsonStructure(char* currentPath) { struct dirent *namelist = NULL; DIR *dir = NULL; char path[1000]; char *extension; char buff[100]; char * id; dir = opendir(currentPath); if (dir == NULL) { perror("Couldn't open directory"); return (2); } while (namelist = readdir(dir)) { struct stat entryInfo; char* directoryName; directoryName = namelist->d_name; if ((strcmp(directoryName, ".") != 0) && (strcmp(directoryName, "..") != 0)) { strcpy(path, ""); strcat(path, currentPath); strcat(path, "/"); strcat(path, directoryName); ++count; sprintf(buff, "%i\0", count); id = buff; if (lstat(path, &entryInfo) == -1) { puts("error"); } else if (S_ISDIR(entryInfo.st_mode)) { // it's folder AddFolderToJson(id, directoryName, path); } else if (S_ISREG(entryInfo.st_mode)) {// it's file extension = strrchr(namelist->d_name, '.'); if (extension != NULL && strstr(extension, ".ini")) { AddFileToJson(id, directoryName); } else { //without extension; } } } continue; } closedir(dir); return 1; }
AddToJson("{id:0,\nitem:[\n"); MakeJsonStructure(path); AddToJson("\n]}");
{id:0, item:[ {id:1,text:"first"}, {id:2, text:"second", item: [{id:"21", text:"child1", item: [{ id:"211", text:"child11" }, {id:"212", text:"child12", item:[{ id:"2121", text:"child121"}]}] }, {id:"22", text:"child2"}]}, {id:3,text:"third"} ] }
{id:1,text:"first"},
{id:3,text:"third"}
Решение задачи: «Генерация структуры каталогов в json формате»
textual
Листинг программы
extension = strrchr(namelist->d_name, '.'); if (extension != NULL && strstr(extension, ".ini")) { AddFileToJson(id, directoryName); } else { //without extension; }
Объяснение кода листинга программы
namelist
- это переменная, которая содержит имя текущего каталога в форматеd_name
.extension
- это переменная, которая содержит расширение текущего файла в форматеd_name
.- Если
extension
не равноNULL
и содержит строку.ini
, то выполняется функцияAddFileToJson
с аргументамиid
иdirectoryName
. - Если
extension
не равноNULL
и не содержит строку.ini
, то выполняется блок кода без функцииAddFileToJson
. id
иdirectoryName
- это переменные, которые передаются в функциюAddFileToJson
. Их значения не указаны в коде.