Генерация структуры каталогов в json формате - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день. Надо на си изобразить генерацию json подобного файла, в котором была бы записана структура файлов и каталогов. Сделано следующее: 1. Функция AddToJson, просто записывает данные в конкретный файл
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");
 
}
2. Функция AddFolderToJson, добавляет в *json файл запись о каталоге
void AddFolderToJson(char* id, char* directoryName, char pathToFile[]) {
    AddToJson("{id:");
    AddToJson(id);
    AddToJson(", text:\"");
    AddToJson(directoryName);
    AddToJson("\", item:[\n");
    MakeJsonStructure(pathToFile);
    AddToJson("]}\n");
}
3. Функция AddFileToJson, добавляет в *json файл запись о файле
void AddFileToJson(char* id, char* value) {
    AddToJson("{id:");
    AddToJson(id);
    AddToJson(", text:\"");
    AddToJson(value);
    AddToJson("\"}");
 
}
4. Функция MakeJsonStructure это рекурсивный цикл перебора всех файлов и каталогов
 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"}
        ]
}
Вопрос следующий. Каким образом мне правильно расставить разделительные запятые в json файле? Тоесть во время рекурсивного перебора файлов и каталогов как мне понять, что текущий каталог последний? Запятая нужна
{id:1,text:"first"},
Запятая ненужна
{id:3,text:"third"}
Насколько я понимаю, что нужно ставить запятые между рекурсивными вызовами MakeJsonStructure, но как в рекурсии понять этот каталог последний? Запутался немного, буду благодарен за помощь

Решение задачи: «Генерация структуры каталогов в json формате»

textual
Листинг программы
extension = strrchr(namelist->d_name, '.');
                                if (extension != NULL && strstr(extension, ".ini")) {
                                        AddFileToJson(id, directoryName);
                                } else {
                                        //without extension;
                                }

Объяснение кода листинга программы

  1. namelist - это переменная, которая содержит имя текущего каталога в формате d_name.
  2. extension - это переменная, которая содержит расширение текущего файла в формате d_name.
  3. Если extension не равно NULL и содержит строку .ini, то выполняется функция AddFileToJson с аргументами id и directoryName.
  4. Если extension не равно NULL и не содержит строку .ini, то выполняется блок кода без функции AddFileToJson.
  5. id и directoryName - это переменные, которые передаются в функцию AddFileToJson. Их значения не указаны в коде.

Оцени полезность:

13   голосов , оценка 3.692 из 5