-
Notifications
You must be signed in to change notification settings - Fork 0
/
TAD-disco.h
165 lines (107 loc) · 5.03 KB
/
TAD-disco.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"TAD-setor.h"
#include"TAD-arquivo.h"
typedef struct{
char nome[40];
void* disco;
NoSetor* livres;
NoArquivo* arquivos;
unsigned long tamDisco;
unsigned long espacoLivre;
unsigned long espacoOcupado;
unsigned long qtdeArquivos;
}Disco;
typedef enum{
SUCESSO = 0,
ESPACO_INSUFICIENTE,
ARQUIVO_INEXISTENTE
}TipoRetorno;
Disco* disco_cria(char* nome, unsigned long tamanho);
TipoRetorno disco_grava(Disco* d, char* nomeArquivo); //nome arquivo deve conter o caminho absoluto ou relativo do arquivo
TipoRetorno disco_remove(Disco* d, char* nome); //somente o nome do arquivo sem o caminho
TipoRetorno disco_recupera(Disco* d, char* nome, FILE* arquivoFisico);
unsigned long Tamanho_arquivo(char *nomeArquivo);
///Implementações
unsigned long Tamanho_arquivo(char* nomeArquivo) {
char modo[3] = "rb";
FILE* Arquivo = fopen(nomeArquivo, modo) ;
fseek(Arquivo,0,SEEK_END);
unsigned long tamArquivo = ftell(Arquivo);
fseek(Arquivo,0,SEEK_SET); // * usando isso caso o ponteiro fique no final do arquivo. ai retorna para o inicio testar
fclose(Arquivo) ;
return tamArquivo; // Só passar o Parametro do nome do Arquivo
}
Disco* disco_cria(char* nome, unsigned long tamanho){
Disco *d = (Disco*)malloc(sizeof(Disco));
d->disco = (void*)malloc(tamanho) ;
d->livres = criar_NoSetor();//Ja cria a Sentinela
adicionar_NoSetor(d->livres, 0, tamanho);//Adiciona o Tamanho livre
//adicionar_NoSetor(d->livres, 5, 10);//Adiciona o Tamanho livre
//adicionar_NoSetor(d->livres, 0, 3);//Adiciona o Tamanho livre
d->arquivos = criar_NoArquivo();
strcpy(d->arquivos->nome, "Sentinela");
d->tamDisco = d->espacoLivre = tamanho ;
d->espacoOcupado = d->qtdeArquivos = 0 ;
strcpy(d->nome, nome);
return d ;// Cria um Disco com um Nome e o Tamanho que voce passou
}
TipoRetorno disco_grava(Disco* d, char* nomeArquivo){
unsigned long tamRes = 0;
int tmp = 1 ;
unsigned long SizeFile = Tamanho_arquivo(nomeArquivo);
//printf("\n Tamanho dessa porra: %d \n", SizeFile);
FILE* Arquivo = fopen(nomeArquivo, "rb") ;
if( SizeFile > ( d->espacoLivre )) return ESPACO_INSUFICIENTE; //Verifica se existe espaço
adicionar_NoArquivo(d->arquivos, nomeArquivo, SizeFile); //Cria uma struct Arquivo e Aloca dentro de Arquivos
tamRes = SizeFile;
while(tmp){
adicionar_NoSetor(d->arquivos->prox->setores, 0, 0); // cria um nó em setores no Arquivos
editar_NoSetor(d->arquivos->prox->setores, d->livres->prox->inicio, 0); // editar o nó de acordo com o diagrama
if( ((d->livres->prox->fim) - (d->livres->prox->inicio)) >= tamRes ){ // Verifica se o nó que esta no livres tem espaço suficiente para alocar os bits
editar_NoSetor(d->arquivos->prox->setores, d->arquivos->prox->setores->prox->inicio, (d->arquivos->prox->setores->prox->inicio)+tamRes);
if(d->livres->prox->inicio == d->arquivos->prox->setores->prox->inicio ){ // Verificar se é um Nó no Livre que ainda esta 'virgem'
d->livres->prox->inicio = d->arquivos->prox->setores->prox->fim;
if(d->livres->prox->inicio == d->livres->prox->fim){// veririca se a capacidade do nó nao esta cheia
/* Apagar Nó no Livre, fazer essa função*/
apagar_NoSetor(d->livres);
}
}
fread(d->disco+(d->arquivos->prox->setores->prox->inicio), (d->arquivos->prox->setores->prox->fim)-(d->arquivos->prox->setores->prox->inicio), 1, Arquivo);
d->espacoLivre = d->espacoLivre - SizeFile;
d->qtdeArquivos = d->qtdeArquivos + 1 ;
tmp = 0;
}else{
d->arquivos->prox->setores->prox->fim = d->livres->prox->fim;
apagar_NoSetor(d->livres);
tamRes = tamRes - ( d->arquivos->prox->setores->prox->fim - d->arquivos->prox->setores->prox->inicio );
fread(d->disco+(d->arquivos->prox->setores->prox->inicio), (d->arquivos->prox->setores->prox->fim)-(d->arquivos->prox->setores->prox->inicio), 1, Arquivo);
}
}
fclose(Arquivo);
return SUCESSO;
}
TipoRetorno disco_recupera(Disco* d, char* nome, FILE* arquivoFisico){
NoArquivo* auxArq = procurar_NoArquivo(d->arquivos, nome);
if(auxArq == NULL) return ARQUIVO_INEXISTENTE;
NoSetor *AuxNo = auxArq->setores->ant;
while(!(AuxNo == auxArq->setores)){
fwrite(d->disco+(AuxNo->inicio), (AuxNo->fim)-(AuxNo->inicio), 1, arquivoFisico);
AuxNo = AuxNo->ant;
}
fclose(arquivoFisico);
return SUCESSO;
}
TipoRetorno disco_remove(Disco* d, char* nome){
NoArquivo* auxArq = procurar_NoArquivo(d->arquivos, nome);
if(auxArq == NULL) return ARQUIVO_INEXISTENTE;
NoSetor *AuxNo = auxArq->setores->ant;
while(!(AuxNo == auxArq->setores)){
AuxNo = setorTolivre(d->livres, AuxNo);
}
d->espacoLivre = d->espacoLivre + (auxArq->tam);
apagar_NoArquivo(auxArq->ant);
d->qtdeArquivos = d->qtdeArquivos - 1;
return SUCESSO;
}