1、python详细代码实现以及具体操作演示实现通过初始化操作建立一个模拟外存空间的虚拟磁盘文件的,在该文件中保存目录和文件内容。创建该文件时应创建初始的根目录内容、文件分配表。根目录实为一特殊文件,其开始内容为空,大小为一个块。 2、文件目录项(可以采用FCB格式)应包括类型(目录 or文件)、创建日期、大小、第一个磁盘块块号。 3、显示命令提示符“$”,并根据输入命令完成相应的文件操作: ●MD(创建子目录):创建目录文件,并在父目录文件中增加目录项。 ●RD(删除子目录):搜索所要删除的目录是否为空目录,若是则删除。 ●MK(创建空文件):创建指定大小的文件(如输入命令 “mk test 2000”,表示创建大小为2000字节的test文件),并在父目录中添加文件名称;还应对FAT表进行适当修改。 ●DEL(删除文件):如果所要删除的文件存在,则删除,同时修改父目录内容;还应对FAT表进行适当修改。
时间: 2024-02-03 15:12:56 浏览: 68
以下是一个简单的模拟外存空间的虚拟磁盘文件的 Python 代码实现:
```
import os
class VirtualDisk:
def __init__(self, size):
self.size = size
self.fat = [-1] * size
self.root = {'name': 'root', 'type': 'dir', 'size': 1, 'blocks': [0]} # 初始根目录内容
self.files = {'root': self.root} # 所有文件和目录的字典,以文件名为 key
# 初始化文件分配表
self.fat[0] = 1 # 根目录占用第一个块
for i in range(1, size):
self.fat[i] = -1
def save(self, filename):
with open(filename, 'w') as f:
f.write(f'{self.size}\n')
f.write(f'{self.fat}\n')
f.write(f'{self.root}\n')
f.write(f'{self.files}\n')
def load(self, filename):
with open(filename, 'r') as f:
self.size = int(f.readline().strip())
self.fat = eval(f.readline().strip())
self.root = eval(f.readline().strip())
self.files = eval(f.readline().strip())
def mkdir(self, name):
if name in self.files:
print(f'Error: {name} already exists')
return
new_dir = {'name': name, 'type': 'dir', 'size': 1, 'blocks': [self.get_free_block()]}
self.files[name] = new_dir
self.add_to_parent_dir(new_dir, self.root)
def rmdir(self, name):
if name not in self.files:
print(f'Error: {name} does not exist')
return
if self.files[name]['type'] != 'dir':
print(f'Error: {name} is not a directory')
return
if len(self.files[name]['blocks']) > 1:
print(f'Error: {name} is not empty')
return
self.remove_from_parent_dir(name, self.root)
del self.files[name]
def mkfile(self, name, size):
if name in self.files:
print(f'Error: {name} already exists')
return
new_file = {'name': name, 'type': 'file', 'size': size}
blocks = []
for i in range(size):
block = self.get_free_block()
if block == -1:
print('Error: Not enough space')
return
blocks.append(block)
new_file['blocks'] = blocks
self.files[name] = new_file
self.add_to_parent_dir(new_file, self.root)
def delfile(self, name):
if name not in self.files:
print(f'Error: {name} does not exist')
return
if self.files[name]['type'] != 'file':
print(f'Error: {name} is not a file')
return
for block in self.files[name]['blocks']:
self.fat[block] = -1
self.remove_from_parent_dir(name, self.root)
del self.files[name]
def get_free_block(self):
for i in range(1, self.size):
if self.fat[i] == -1:
self.fat[i] = 0
return i
return -1
def add_to_parent_dir(self, file, parent_dir):
parent_dir['size'] += 1
parent_dir['blocks'].append(self.get_free_block())
with open(f'block{parent_dir["blocks"][-1]}', 'w') as f:
f.write(f'{file}\n')
def remove_from_parent_dir(self, name, parent_dir):
parent_dir['size'] -= 1
parent_dir['blocks'].pop()
for block in parent_dir['blocks']:
with open(f'block{block}', 'r') as f:
lines = f.readlines()
with open(f'block{block}', 'w') as f:
for line in lines:
if not line.startswith(name):
f.write(line)
def ls(self):
for name in self.files:
if self.files[name]['type'] == 'dir':
print(f'{name}/')
else:
print(name)
def cd(self, name):
if name == '..':
return self.root
if name not in self.files:
print(f'Error: {name} does not exist')
return None
if self.files[name]['type'] != 'dir':
print(f'Error: {name} is not a directory')
return None
return self.files[name]
def pwd(self, node):
path = []
while node != self.root:
for name in self.files:
if self.files[name] == node:
path.append(name)
node = self.cd(name)
break
path.reverse()
return '/' + '/'.join(path)
vd = VirtualDisk(64) # 创建一个大小为 64 的虚拟磁盘文件
while True:
cmd = input('$ ').split()
if not cmd:
continue
if cmd[0] == 'quit':
break
if cmd[0] == 'md':
vd.mkdir(cmd[1])
elif cmd[0] == 'rd':
vd.rmdir(cmd[1])
elif cmd[0] == 'mk':
vd.mkfile(cmd[1], int(cmd[2]))
elif cmd[0] == 'del':
vd.delfile(cmd[1])
elif cmd[0] == 'ls':
node = vd.cd(cmd[1]) if len(cmd) > 1 else vd.root
if node:
for block in node['blocks']:
with open(f'block{block}', 'r') as f:
print(f.read().strip())
elif cmd[0] == 'cd':
vd.cd(cmd[1])
elif cmd[0] == 'pwd':
node = vd.cd(cmd[1]) if len(cmd) > 1 else vd.root
if node:
print(vd.pwd(node))
elif cmd[0] == 'save':
vd.save(cmd[1])
elif cmd[0] == 'load':
vd.load(cmd[1])
```
阅读全文