-
Notifications
You must be signed in to change notification settings - Fork 0
/
file_manager.py
123 lines (106 loc) · 4.7 KB
/
file_manager.py
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
# Gerencia os arquivos e aas operações dos arquivos
# deve ter uma lista com os objetos da classe File (de fioe.py)
# deve ter uma lista com as operações qe foram feitas (são dadas na entrada)
from file import File
from process import Process
class FileManager:
def __init__(self):
self.blocks_quantity = 0
self.files = {}
self.operations = []
self.disc = []
self.log = []
def initialize_disc(self):
self.disc = [0] * self.blocks_quantity # Inicializa o mapa do disco
# Aloca os arquivos que foram adicionados via .txt
for file_info in self.files.values():
for i in range(file_info["memory_blocks"]):
self.disc[file_info["first_block"] + i] = 1
def print_map(self):
"""
Printa o mapa de ocupação do disco.
A string que representa o disco começa | | | |...| |
então podemos mapear o índice do bloco ocupado para o índice da string usando a fórmula
2 * (n + 1) - 1, onde n é o bloco ocupado começando em 0
"""
disc_map = "| " * self.blocks_quantity
disc_map += "|"
for file in self.files.keys():
file_obj = self.files[file]
block_index = file_obj["first_block"]
for i in range(file_obj["memory_blocks"]):
disc_map = disc_map[:2*(block_index + 1) - 1] + file + disc_map[2*(block_index + 1):]
block_index += 1
print(disc_map)
def create_file(self, name, size, creator):
offset = None
available = 0
if name in self.files:
self.log.append({
"status": "Falha",
"mensagem": f"O processo P{str(creator)} nao criou o arquivo (Arquivo já existe no disco)"
})
else:
for i in range(self.blocks_quantity):
block = self.disc[i]
if block == 0:
available += 1
if available == size:
offset = i - available + 1
for j in range(size):
self.disc[offset + j] = 1
fileObj = File(name + ", " + str(offset) + ", " + str(size), creator)
self.files[fileObj.name] = {
"first_block": fileObj.first_block,
"memory_blocks": fileObj.memory_blocks,
"process_id": fileObj.process_id
}
self.log.append({
"status": "Sucesso",
"mensagem": f"O processo P{str(creator)} criou o arquivo {fileObj.name}"
})
else:
available = 0
if offset is None:
self.log.append({
"status": "Falha",
"mensagem": f"O processo P{str(creator)} nao criou o arquivo {name} (sem espaco livre)"
})
def delete_file(self, filename, process: Process):
if filename not in self.files:
self.log.append({
"status": "Falha",
"mensagem": f"O processo {str(process.PID)} nao pode deletar o arquivo {filename}, pois ele não existe"
})
return
file = self.files[filename] # Pega as informações do arquivo
if process.priority != 0 and file["process_id"] != process.PID:
self.log.append({
"status": "Falha",
"mensagem": f"O processo {str(process.PID)} nao pode deletar o arquivo {filename}, pois o arquivo não foi criado por ele"
})
else:
# Atualiza o mapa do disco
for i in range(file["memory_blocks"]):
self.disc[file["first_block"] + i] = 0
self.log.append({
"status": "Sucesso",
"mensagem": f"O processo {str(process.PID)} deletou o arquivo {filename}"
})
# Remove do dicionário
self.files.pop(filename)
def operate_process(self, process: Process):
# Pegar a próxima operação
op = None
for operation in self.operations:
if operation.pid == process.PID:
op = operation
self.operations.remove(operation)
break
if(op):
if (op.opcode == 0):
self.create_file(op.filename, op.file_size, process.PID)
else:
self.delete_file(op.filename, process)
else:
print("Não tem operação pendente") # Print para indicar que acabou, mudar dps na integração