首页 > 其他分享 >操作系统 实验三 文件管理

操作系统 实验三 文件管理

时间:2024-11-01 21:48:39浏览次数:5  
标签:文件 操作系统 实验 user file print path os

实验目的

        编写一个简单的二级文件系统实现程序,加深对文件系统的内部功能和内部实现的理解。

实验内容

        文件系统的管理功能是将其管理的程序和数据通过组织为一系列文件的方式实现的。而文件则是指由创建者所定义的、具有文件名的一组相关元素的集合。文件管理的主要任务是对用户文件和系统文件进行管理方便用户使用,并保证文件的安全性。文件的类型按文件用途可分为系统文件、用户文件和库文件;按文件中数据的形式可分为源文件、目标文件、可执行文件;按文件的存取控制属性可分为只执行文件、只读文件、读写文件;按文件的组织形式可分为普通文件、目录文件、特殊文件。

        用户所看到的文件称为逻辑文件,它是由一系列的逻辑记录组成的。从用户的观点而言,文件的逻辑记录是能够被存取的基本单位。在进行文件系统高层设计时,所涉及的主要问题是文件的逻辑结构,即如何将这些逻辑记录构成一个逻辑文件。在进行文件系统低层设计时,所涉及的主要问题是文件的物理结构, 即如何将一个文件存储在外存上。由此可见,在系统中的所有文件都存在着以下两种形式的文件结构:(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

相关文章

  • Java实验三 面向对象编程
    1.编写Java代码实现一个计数器类“Counter”,其中包含域“counterValue”用来保存计数器的当前数值、方法“increment()”使计数器加一、方法“decrement()”使计数器减一、方法“reset()”使计数器清零。构造计数器类的对象,并使用。packageproject;publicclassCounter......
  • Java实验二 分支循环程序设计
    1.编写程序接受用户输入的一个表示月份的整数,若用户输入了从1到12以外的整数则提示“输入有误”,输出对应月份的天数。提示1:可暂不考虑闰年,以2月份为28天来实现提示2:可以使用if或switch实现,体会选择分支的构造packageproject;importjava.util.Scanner;publicclassMont......
  • 20222325 2024-2025-1 《网络与系统攻防技术》实验四实验报告
    1.实验内容一、恶意代码文件类型标识、脱壳与字符串提取对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下:(1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具;(2)使用超级巡警脱壳机等脱壳软件,......
  • ctfshow web入门 文件上传
    CtfshowWeb入门151 查看源代码,发现只能上传.png的文件用bp抓包.png的图片格式添加一句话木马,文件格式修改成.php   对于上传成功的后门代码,直接通过hackbar发送post包利用php内置system()函数执行  查看flag.php文件   152和上一题做题步骤一样......
  • 实验7-2-3 求矩阵的局部极大值
     ......
  • 「漏洞复现」F22服装管理软件系统 openfile.aspx 任意文件读取漏洞
    0x01 免责声明请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需......
  • 《保卫萝卜》客户端缺失pthreadvce2.dll 文件?详解《保卫萝卜》Luobo.exe 加载 pthread
    在享受《保卫萝卜》这款趣味横生的塔防游戏时,部分玩家可能会遇到游戏无法启动的问题,屏幕上弹出错误提示:“由于找不到pthreadvce2.dll,无法继续执行代码。”这一错误通常意味着你的电脑系统中缺失了pthreadvce2.dll这个关键的动态链接库(DLL)文件。别担心,本文将为你提供详细的修......
  • activecontentwizard.dll文件损坏怎么办?修复受损的activecontentwizard.dll有效策略汇
    当您在使用某些软件或程序时,可能会遇到“activecontentwizard.dll文件损坏”的错误提示。这个DLL文件对于程序的正常运行至关重要,一旦损坏,可能会导致程序无法启动或运行不稳定。为了帮助您解决这个问题,以下是一些有效的修复策略汇总:1. 使用系统文件检查器(SFC)Windows系统自......
  • 如何修复aurnianimation.dll文件缺失导致的古剑奇谭启动失败?详解《古剑奇谭》客户端缺
    针对《古剑奇谭》客户端因缺少 aurnianimation.dll 文件而导致的启动失败问题,以下是一系列详细的修复步骤,旨在帮助玩家恢复游戏的正常运行。一、检查回收站与备份检查回收站:打开计算机的回收站,搜索 aurnianimation.dll 文件。如果找到该文件,右键点击并选择“还原”,W......
  • 实验一 入门基础
    编程题1,用换行分隔语句不需要分号,没有大括号(用缩进表示)2,因为Python不支持C或Java中的那种类型转换语法。Python的类型转换使用函数调用的方式n=int(input()) //调用函数强制转化,如果不强制转化都会看为字符串math.floor //向下取整函数3,a,b,c=map(int,inp......