-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathFileClass.py
More file actions
108 lines (96 loc) · 3.38 KB
/
FileClass.py
File metadata and controls
108 lines (96 loc) · 3.38 KB
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
import random
class File:
ids = set()
def __init__(self, name):
self.name = name
self.pointer = 0
self.file_size = 0
self.blocks = list()
self.id = random.randint(1, 1000000)
while self.id in File.ids:
self.id += 1
File.ids.add(self.id)
def write(self, data, MainMemory):
size = len(data)
freed_blocks = self.blocks.copy()
self.file_size = size
self.blocks.clear()
MainMemory.free_blocks(freed_blocks)
self.file_size = size
blockes_needed = size // 64
self.pointer = 0
for i in range(blockes_needed + 1):
block = MainMemory.allocate_block(self.id)
MainMemory.blocks[block] = data[self.pointer:self.pointer + 64]
self.blocks.append(block)
if size < 64:
self.pointer += size
size = 0
else:
self.pointer += 64
size -= 64
def append(self, data, MainMemory):
size = len(data)
current_pointer = 0
self.file_size += size
last_block = self.blocks[-1]
if MainMemory.space_left_in_a_block(last_block) >= 0:
space_left = MainMemory.space_left_in_a_block(last_block)
MainMemory.blocks[last_block] += data[0:
space_left]
current_pointer += space_left
blockes_needed = (size - current_pointer) // 64
for i in range(blockes_needed + 1):
block = MainMemory.allocate_block(self)
self.blocks.append(block)
MainMemory.blocks[block] = data[current_pointer:current_pointer + 64]
if size < 64:
current_pointer += size
size = 0
else:
current_pointer += 64
size -= 64
self.pointer += current_pointer
def moveContentWithinFile(self, MainMemory, start, size, new_start):
my_blocks = self.blocks.copy()
data = ""
for block in my_blocks:
data += MainMemory.blocks[block]
previous_data = data[:start]
selected_data = data[start:start+size]
next_data = data[start+size:]
new_data = previous_data[:new_start] + \
selected_data + previous_data[new_start:] + next_data
pointer = 0
for block in my_blocks:
MainMemory.blocks[block] = new_data[pointer:pointer + 64]
pointer += 64
if pointer > len(new_data):
break
def truncatefile(self, MainMemory, size):
self.file_size = size
my_blocks = self.blocks.copy()
data = ""
for block in my_blocks:
data += MainMemory.blocks[block]
free_blocks = my_blocks
self.blocks.clear()
MainMemory.free_blocks(free_blocks)
new_data = data[:size]
self.write(new_data, MainMemory)
def delete(self, MainMemory):
self.file_size = 0
my_blocks = self.blocks.copy()
self.blocks.clear()
MainMemory.free_blocks(my_blocks)
def read(self, MainMemory):
data = ""
for block in self.blocks:
data += MainMemory.blocks[block]
return data
def isDirectory(self):
return False
def isFile(self):
return True
def __str__(self):
return self.name + " " + str(self.id)