实验目的
编写一个简单的二级文件系统实现程序,加深对文件系统的内部功能和内部实现的理解。
实验内容
文件系统的管理功能是将其管理的程序和数据通过组织为一系列文件的方式实现的。而文件则是指由创建者所定义的、具有文件名的一组相关元素的集合。文件管理的主要任务是对用户文件和系统文件进行管理方便用户使用,并保证文件的安全性。文件的类型按文件用途可分为系统文件、用户文件和库文件;按文件中数据的形式可分为源文件、目标文件、可执行文件;按文件的存取控制属性可分为只执行文件、只读文件、读写文件;按文件的组织形式可分为普通文件、目录文件、特殊文件。
用户所看到的文件称为逻辑文件,它是由一系列的逻辑记录组成的。从用户的观点而言,文件的逻辑记录是能够被存取的基本单位。在进行文件系统高层设计时,所涉及的主要问题是文件的逻辑结构,即如何将这些逻辑记录构成一个逻辑文件。在进行文件系统低层设计时,所涉及的主要问题是文件的物理结构, 即如何将一个文件存储在外存上。由此可见,在系统中的所有文件都存在着以下两种形式的文件结构:(1)文件的逻辑结构。这是从用户观点出发所观察到的文件组织形式,即文件是由一系列的逻辑记录组成的,是用户可以直接处理的数据及其结构,它独立于文件的物理特性,又称为文件组织。(2)文件的物理结构,又称为文件的存储结构。这是指系统将文件存储在外存上所形成的一种存储组织形式,是用户不能看见的。文件的物理结构不仅与存储介质的存储性能有关,而且与所采用的外存分配方式有关。无论是文件的逻辑结构,还是其物理结构,都会影响对文件的检索速度。
最基本的文件操作包括:(1)创建文件:在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项。目录项中应该记录新文件的文件名及其在外存的地址等属性。(2)删除文件:当已不再需要某文件时,可将它从文件系统中删除。在删除时,系统应该先从目录中找到要删除的文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。(3)读文件:在读一个文件时,须在相应的系统调用中给出文件名和应该读入的内存目标地址。此时,系统同样要查找目录,找到制定的目录项,从中得到被读文件在外存中的位置。在目录项中,还有一个指针用于对文件的读/写。(4)写文件:在写一个文件时,须在相应的系统调用中给出该文件名及该文件在内存中的(源)地址。为此,也同样须先查找目录,找到指定文件的目录项,在利用目录中的写指针进行写操作。(5)设置文件的读/写位置:前述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。设置文件读/写位置的操作,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作。也正因如此,才能改顺序存取为随机存取。
为了克服单级文件目录所存在的缺点,可以采用二级文件目录,在二级文件目录中,为每一个用户再建立一个单独的用户文件目录UFD。这些文件目录具有相似的结构,它由用户所有文件的文件控制块组成。此外,在系统中再建立一个主文件目录MFD;在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录文件的指针。在两级文件目录中,如果用户希望有自己的用户文件目录UFD,可以请求系统为自己建立一个用户文件目录;如果自己不再需要UFD,也可以请求系统管理员将它撤消。在有了UFD后,用户可以根据自己的需要创建新文件。每当此时,OS只需检查该用户的UFD,判定在该UFD中是否已有同名的另一个文件。若有,用户必须为新文件重新命名。若无,便在UFD中建立一个新目录项,将新文件名及其有关属性填入目录项中,并置其状态位为“1”。当用户要删除一个文件时,OS也只需查找该用户的UFD,从中找出指定文件的目录项,在回收该文件所占用的存储空间后,将该目录项删除。两级文件目录已基本上能够满足对文件目录的四方面的要求。
实验设计
import os
def menu_user():
print("----------------用户界面----------------")
print(" 1.创建 ")
print(" 2.查询 ")
print(" 3.登录 ")
print(" 4.删除 ")
print(" 0.退出 ")
print("---------------------------------------")
def user_create():
username = input("请输入用户名:")
user_folder = os.path.join("root", username)
mfd_file = os.path.join("root", "MFD.txt")
# 检查用户名文件夹是否已存在
if os.path.exists(user_folder):
print("该用户名已被使用")
else:
# 创建用户名文件夹
os.mkdir(user_folder)
print(f"用户{username}创建成功")
# 更新 MFD.txt 文件
with open(mfd_file, "a") as file:
file.write(username + "\n")
def user_search():
while True:
menu_search()
choice = input("请输入选项: ")
if choice == "1":
search_one()
elif choice == "2":
search_all()
elif choice == "0":
break
else:
print("无效选项,请重新输入。")
def user_login():
username = input("请输入用户名:")
user_folder = os.path.join("root", username)
mfd_file = os.path.join("root", "MFD.txt")
flag = 0
# 检查 MFD.txt 文件是否存在
if os.path.exists(mfd_file):
# 将 MFD.txt 文件的用户信息存入列表
with open(mfd_file, "r") as file:
user_list = [line.strip() for line in file]
if username in user_list:
flag = 1
# 用户名文件夹存在并且 MFD.txt 文件存在用户信息
if os.path.exists(user_folder) and flag == 1:
print("登录成功。")
while True:
menu_file()
choice2 = input("请输入选项: ")
if choice2 == "1":
file_create(user_folder)
elif choice2 == "2":
file_delete(user_folder)
elif choice2 == "3":
file_read(user_folder)
elif choice2 == "4":
file_write(user_folder)
elif choice2 == "0":
break
else:
print("无效选项,请重新输入。")
else:
print("登录失败")
def user_delete():
username = input("请输入需要删除的用户名:")
user_folder = os.path.join("root", username)
mfd_file = os.path.join("root", "MFD.txt")
# 检查用户名文件夹是否存在
if os.path.exists(user_folder):
# 删除用户名文件夹
os.rmdir(user_folder)
print(f"用户{username}已成功删除。")
else:
print(f"用户{username}不存在。")
# 检查 MFD.txt 文件是否存在
if os.path.exists(mfd_file):
# 将 MFD.txt 文件的用户信息存入列表
with open(mfd_file, "r") as file:
user_list = [line.strip() for line in file]
if username in user_list:
user_list.remove(username)
# 更新 MFD.txt 文件
with open(mfd_file, "w") as file:
file.write("\n".join(user_list))
print("用户信息已从 MFD.txt 文件中删除成功。")
else:
print("用户信息不存在于 MFD.txt 文件中。")
else:
print("MFD.txt 文件不存在。")
def menu_search():
print("----------------查询界面----------------")
print(" 1.单个查询 ")
print(" 2.全部查询 ")
print(" 0.退出 ")
print("---------------------------------------")
def search_one():
username = input("请输入用户名:")
user_folder = os.path.join("root", username)
# 检查用户名文件夹是否存在
if os.path.exists(user_folder):
print(f"用户{username}存在。")
else:
print(f"用户{username}不存在。")
def search_all():
mfd_file = os.path.join("root", "MFD.txt")
# 检查 MFD.txt 文件是否存在
if os.path.exists(mfd_file):
# 将 MFD.txt 文件的用户信息存入列表
with open(mfd_file, "r") as file:
user_list = [line.strip() for line in file]
print(f"全部用户:{user_list}")
else:
print("MFD.txt 文件不存在。")
def menu_file():
print("----------------文件界面----------------")
print(" 1.创建文件 ")
print(" 2.删除文件 ")
print(" 3.读取文件 ")
print(" 4.写入文件 ")
print(" 0.退出 ")
print("---------------------------------------")
def file_create(user_folder):
filename = input("请输入要创建的文件名: ")
file_path = os.path.join(user_folder, filename)
ufd_file = os.path.join(user_folder, "UFD.txt")
# 检查该用户文件是否已存在
if os.path.exists(file_path):
print("该文件名已被使用")
else:
with open(file_path, "a") as file:
pass
print(f"文件{filename}创建成功")
# 更新 UFD.txt 文件
with open(ufd_file, "a") as file:
file.write(filename + "\n")
def file_delete(user_folder):
filename = input("请输入要删除的文件名: ")
file_path = os.path.join(user_folder, filename)
ufd_file = os.path.join(user_folder, "UFD.txt")
if os.path.exists(file_path):
os.remove(file_path)
print("文件删除成功")
else:
print("该文件不存在")
# 检查 UFD.txt 文件是否存在
if os.path.exists(ufd_file):
with open(ufd_file, "r") as file:
file_list = [line.strip() for line in file]
if filename in file_list:
file_list.remove(filename)
# 更新 UFD.txt 文件
with open(ufd_file, "w") as file:
file.write("\n".join(file_list))
print("用户信息已从 UFD.txt 文件中删除成功。")
else:
print("用户信息不存在于 UFD.txt 文件中。")
else:
print("UFD.txt 文件不存在。")
def file_read(user_folder):
filename = input("请输入要读取的文件名: ")
file_path = os.path.join(user_folder, filename)
if os.path.exists(file_path):
with open(file_path, "r") as file:
content = file.read()
print(f"文件内容: {content}")
else:
print("该文件不存在")
def file_write(user_folder):
filename = input("请输入要写入的文件名: ")
file_path = os.path.join(user_folder, filename)
if os.path.exists(file_path):
content = input("请输入要写入的内容: ")
with open(file_path, "w") as file:
file.write(content)
print("文件写入成功")
else:
print("该文件不存在")
def main():
# 检查 root 文件夹是否存在
if not os.path.exists("root"):
os.mkdir("root")
while True:
menu_user()
choice = input("请输入选项:")
if choice == "1":
user_create()
elif choice == "2":
user_search()
elif choice == "3":
user_login()
elif choice == "4":
user_delete()
elif choice == "0":
break
else:
print("无效选项,请重新输入。")
if __name__ == '__main__':
main()
实验结果
初始界面
创建用户
查询界面
查询单个用户
查询全部用户
登录界面
创建文件
写文件
读文件
删除文件
删除用户
标签:文件,操作系统,实验,user,file,print,path,os From: https://blog.csdn.net/weixin_69276268/article/details/143243964