WebDisk_C/file.h

247 lines
9.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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){
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); ///xxxxx
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);
}
}
*/