#pragma once /* struct dir_list_struct{ struct metadata* top; struct metadata* file; struct dir_list_struct* next; }; typedef struct metadata { char* name; bool tipe_dir; long int size; struct dir_list_struct* dir_list; struct metadata* top; struct dir_list_struct* jamp; } stack_element; */ struct NodeDisk { uint32_t id; uint32_t parent_id; uint32_t first_child_id; uint32_t next_sibling_id; uint64_t name_offset; // смещение имени в файле имён uint32_t name_len; // длина имени, опционально uint64_t type; // другие ваши поля }; /* // Файл 1: структура дерева void serialize_tree(Node *node, FILE *f_struct, FILE *f_names, uint64_t *names_offset) { FILE *f_nodes = fopen("nodes.bin", "wb"); struct NodeDisk disk; disk.type = node->type; disk.name_offset = *names_offset; // Сохраняем имя во второй файл uint16_t len = strlen(node->name); fwrite(&len, 2, 1, f_names); fwrite(node->name, 1, len, f_names); *names_offset += 2 + len; fwrite(&disk, sizeof(disk), 1, f_struct); for (Node *child = node->first_child; child; child = child->next_sibling) serialize_tree(child, f_struct, f_names, names_offset); uint8_t end = END_MARKER; fwrite(&end, 1, 1, f_struct); // Маркер конца детей } */ #define DOWN_MARKER 0xFE #define END_MARKER 0xFF struct metadata_file { uint64_t name_offset; bool tipe_dir; long int size; }; void name_file_w(char* name, FILE * f_names, uint64_t *names_offset){ uint16_t len = strlen(name); fwrite(&len, sizeof(uint16_t), 1, f_names); fwrite(name, 1, len, f_names); names_offset += len + sizeof(uint16_t); } void nodes_file_w(struct metadata* meta, FILE * f_nodes, uint64_t *nodes_offset, uint64_t names_offset){ struct metadata_file file; file.name_offset = names_offset; file.size = meta->size; file.tipe_dir = meta->tipe_dir; fwrite(&file, 1, sizeof(struct metadata_file), f_nodes); nodes_offset += sizeof(struct metadata_file); } void aaasss(struct dir_list_struct* dir_list, struct metadata* mata_local, struct metadata* mata_local_top, FILE *f_nodes, FILE *f_names, int* marker, uint16_t* len){ if (NULL != dir_list->file){ dir_list = dir_list->next; dir_list = je_malloc(sizeof(struct dir_list_struct)); } mata_local = malloc(sizeof(struct metadata)); // Это не маркер — значит начало структуры! ungetc(*marker, f_nodes); // возвращаем байт обратно struct metadata_file file; fread(&file, sizeof(file), 1, f_nodes); mata_local->size = file.size; mata_local->tipe_dir = file.tipe_dir; fread(len, 1, sizeof(uint16_t), f_names); mata_local->name = malloc(*len+1); fread(mata_local->name, 1, *len, f_names); printf("Файл: %s\n", mata_local->name); // Дальше обработка структуры... dir_list->top = mata_local_top; mata_local->top = mata_local_top; dir_list->file = mata_local; *marker = fgetc(f_nodes); } void nanaaa_2(struct metadata* mata){ FILE *f_nodes = fopen("nodes.bin", "rb"); FILE *f_names = fopen("names.bin", "rb"); struct metadata_file file, file_2; uint16_t len; struct metadata* mata_local = mata; struct metadata* mata_local_top = mata; mata_local->name = "./"; struct dir_list_struct* dir_list = je_malloc(sizeof(struct dir_list_struct)); mata_local->dir_list = dir_list; int marker = fgetc(f_nodes); while(marker != EOF){ if (marker == 0xFF){ if (mata_local->jamp != NULL && mata_local->jamp->next != NULL ){ dir_list = mata_local->jamp->next; mata_local = mata_local->jamp->next->file; aaasss(dir_list, mata_local, mata_local_top, f_nodes, f_names, &marker, &len); } else{ DEBUG_PRINT("Контлоьные точки закончелись, поднимаюсь!\n"); if (mata_local->top == NULL){ printf("Подём отменён!\n"); break; } aaasss(dir_list, mata_local, mata_local_top, f_nodes, f_names, &marker, &len); DEBUG_PRINT("Подём!\n"); mata_local = mata_local->top; } dir_list = mata_local->jamp->next; //if (dir_list == NULL) printf("ПИЗДЕЦ\n"); //dir_list = je_malloc(sizeof(struct dir_list_struct)); //aaasss(dir_list, mata_local, mata_local_top, f_nodes, f_names, &marker, &len); dir_list->file = mata_local; mata_local = dir_list->file; // END_MARKER: конец детей, возвращаемся наверх //return; continue; }else if (marker == 0xFE){ printf("SAS_xxxx\n"); mata_local->jamp = dir_list; //struct dir_list_struct* dir_list = je_malloc(sizeof(struct dir_list_struct)); mata_local->dir_list = dir_list; mata_local->top = mata_local_top; aaasss(dir_list, mata_local, mata_local_top, f_nodes, f_names, &marker, &len); // DOWN_MARKER: начало детей, идём вниз // Ваша логика: вызывать рекурсивный парсер детей }else{ printf("SAS_AAA\n"); aaasss(dir_list, mata_local, mata_local_top, f_nodes, f_names, &marker, &len); dir_list = dir_list->next; dir_list = je_malloc(sizeof(struct dir_list_struct)); } } fread(&file, 1, sizeof(struct metadata_file), f_nodes); fread(&len, 1, sizeof(uint16_t), f_names); fread(&file_2, 1, len, f_names); file.name_offset; char* name; //printf("Файл: %s\n", name); } void nanaaa(struct metadata* mata){ uint64_t names_offset = 0; uint64_t nodes_offset = 0; FILE *f_nodes = fopen("nodes.bin", "wb"); FILE *f_names = fopen("names.bin", "wb"); struct metadata *meta_data, *meta_data_tmp; meta_data = mata; if (meta_data->dir_list == NULL) meta_data->jamp = meta_data->dir_list; struct dir_list_struct* global_dir_list = meta_data->dir_list; while(1){ DEBUG_PRINT("Цикол!\n"); while(global_dir_list != NULL){ DEBUG_PRINT("%s" ,"while global_dir_list\n"); if (global_dir_list->file->tipe_dir){ DEBUG_PRINT("Выполняю прыжок вниз!\n"); DEBUG_PRINT("%s%s",global_dir_list->file->name ," AAA \n"); meta_data_tmp = global_dir_list->file; DEBUG_PRINT("%s --- dd\n", global_dir_list->file->name); meta_data_tmp->jamp = global_dir_list; meta_data = meta_data_tmp; global_dir_list = meta_data->dir_list; //printf("Name0: %s\n", meta_data->name); nodes_file_w(meta_data, f_nodes, &nodes_offset, names_offset); name_file_w(meta_data->name, f_names, &names_offset); //fwrite(meta_data->name, 1, sizeof(struct metadata), f_names); fputc(DOWN_MARKER, f_nodes); break; } else{ DEBUG_PRINT("Нaйден файл: %s\n",global_dir_list->file->name); //printf("Name1: %s\n", global_dir_list->file->name); nodes_file_w(global_dir_list->file, f_nodes, &nodes_offset, names_offset); name_file_w(global_dir_list->file->name, f_names, &names_offset); global_dir_list = global_dir_list->next; DEBUG_PRINT("Прыгаю вперёд!\n"); } } if (global_dir_list == NULL){ DEBUG_PRINT("Глобальный список закончен, прыгаю верх за контрольную точку!\n"); if (meta_data->jamp != NULL && meta_data->jamp->next != NULL ){ global_dir_list = meta_data->jamp->next; meta_data = meta_data->jamp->next->file; fputc(END_MARKER, f_nodes); } else{ DEBUG_PRINT("Контлоьные точки закончелись, поднимаюсь!\n"); if (meta_data->top == NULL){ DEBUG_PRINT("Подём отменён!\n"); break; } fputc(END_MARKER, f_nodes); DEBUG_PRINT("Подём!\n"); meta_data = meta_data->top; } } } DEBUG_PRINT("Готово!\n"); } /* void file_weit(struct metadata mata){ FILE *f_nodes = fopen("nodes.bin", "wb"); FILE *f_names = fopen("names.bin", "wb"); uint64_t names_offset = 0; struct metadata mata_local = mata; fwrite(&mata_local, 1, sizeof(struct metadata), f_nodes); for (){ } mata for (int i = 0; i < num_nodes; ++i) { NodeDisk n = ...; // имя n.name_offset = names_offset; n.name_len = strlen(node[i].name); fwrite(node[i].name, 1, n.name_len, f_names); names_offset += n.name_len; fwrite(&n, sizeof(n), 1, f_nodes); } } */