以Django为框架模拟文件系统

前言:笔者以学习Django为目的而完成的模拟文件系统,在底层设计上有很多不足和偷懒,望读者原谅。

(关于如何运行和获取源代码等涉及与文件系统无关的东西,你在本文中找不到答案,请移步https://github.com/chenfei0328/fileSystem

一、题目:模拟文件系统的设计与实现

二、设计要求
1.文件系统通过磁盘上建立的一个文件来模拟分区上的各种文件操作,通过系统初始化文件分区获得磁盘分区得到信息。
2.提供基本的文件系统调用和文件系统基本操作。
3.文件系统采用树型目录结构。
4.用提供的文件系统的系统调用实现类似记事本(edit)的简单程序。
5.程序需要图形化界面

三、系统设计
1.整体框架
这里写图片描述

2.前台(略)

3.后台
Django以MVC为设计模式,故可分为三个部分:
(1)模型:models.py用于处理数据库,而本系统的数据库就是用于模拟磁盘空间而开辟的文本文件。
(2)视图:views.py的功能相当于沟通的桥梁,将前台和后台的数据进行交互。
(3)控制器:urls.py通过正则表达式定义了每一个AJAX数据传输路径,而Django封装了控制器代码,用户只写路径即可。

4.磁盘模拟文件
(1)区块分布
本系统通过创建root.txt文件用以模拟磁盘存储器,所有与文件系统概念相关的源数据都在里面,且假定以行为块,共64*64块,在忽略‘\n’的前提下,每块占512字节,总大小为2MB。
a.引导块:占第一个盘块,内容包括对此模拟文件系统的简介。
b.用户信息块:占第二个盘块,内容包括每个可以操作本文件系统的用户信息,包含用户账号和用户密码两项。
c.位示图块:在保证原理正确的前提下,为了配合Python将繁琐的文件操作化为最简,本系统给位示图分配了第3到第66共64个盘块,每块占64个字节,在文本文件中形成64*64的矩阵。
d.数据块:数据块内容包含两项,第一项为文件控制块,系统为之分配了第67到第70共4个盘块,用于存放根目录下所有文件的控制块信息,虽然以深度树的方式排列这些文件控制块有些不妥,但也不失原理;第二项为文件数据块,占有此文件其余所有盘块,数据内容包括文件的索引表和文件具体内容。

(2)磁盘分配表
本系统采用位示图法来进行磁盘的分配与回收。位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况。当其值为“0”时,表示相应的盘块空闲;为“1”时,表示已分配。磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。本系统所采用的位示图可描述为一个64*64的二维数组,其大小值4096等于磁盘的总块数。
根据位示图进行盘块分配时,可分为三步进行:
a.顺序扫描位示图,从中找出一个或一组其值为“0”的二进制位(“0”表示空闲)。
b.将所找到的一个或一组二进制位转换成与之相应的盘块号。假定找到的其值为“0”的二进制位位于位示图的第i行、第j列,则其相应的盘块号应按下式计算:
B = n ( i - 1 ) + j
式中,n代表每行的位数。
c.修改位示图,令map[i,j] = 1。
盘块的回收分两步:
a.将回收盘块的盘块号转换成位示图中的行号和列号。转换公式为:
I = ( b - 1 ) DIV n + 1
J = ( b - 1 ) MOD n + 1
b.修改位示图。令map[i,j] = 0。

(3)文件组织方式
本文件系统的文件组织方式采用二级索引组织方式。系统根据文件的大小分配相应的索引块,其中分为第一级索引块和第二级索引块,第一级索引块中存放第二级索引块号,第二级索引块存放文件的数据块号。在建立一个文件时,只须在为之建立的目录项中填上指向该第一级索引块的块号指针,系统就能根据索引快的内容通过链指针将各数据块的内容按时序链接起来形成完整的文件内容。
本系统初始化每个盘块的大小为512字节,共64*64=4096个盘块,因此每个盘块号占4个字节,则在一个索引块中可存放128个盘块号。这样,在两级索引时,最多可包含的存放文件的盘块的盘块号总数N=128*128=16K个。由此可得出结论:采用两级索引时,所允许的文件最大长度为8MB。

(4)文件控制块
为了能对一个文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构,称之为“文件控制块”即FCB(File Control Block)。文件与文件控制块一一对应,而人们把文件控制块的有序集合称为文件目录,即一个文件控制块就是一个文件目录项。通常,一个文件目录也被看做是一个文件,称为目录文件。
文件控制块通常含有三类信息,即基本信息、存取控制信息及使用信息。而本系统为模拟文件系统的简单操作,将文件控制块的内容设置为以下六个信息:文件路径、文件名、文件大小、创建日期、文件类型和起始盘块号。

self.FCB = {
            # path = ''
            # name = '',
            # size = 0,
            # date = '',
            # kind = 0, # 0表示文件夹,1表示文件
            # startIndexBlock = 0,  # 文件的索引块
    }

(5)模块算法(以修改文件为例)
a.整体流程图
这里写图片描述

b.后台代码

# 修改文件
    # 输入参数为文件路径和文件内容
    def reviseFile(self, path, contents):
        # 查找改路径下的文件控制块FCB
        fcb = self.readFCB(path)
        # 删除该文件(如果是文件夹则递归删除文件夹下所有文件)
        self.deleteFolder(path)
        # 创建新的FBC
        path = fcb['path']
        name = fcb['name']
        date = fcb['date']
        kind = fcb['kind']
        # 创建新文件
        self.createFile(path, name, date, kind, contents)

(6)界面截图
这里写图片描述

四、总结
1.优点什么的就不说了
2.缺点:
(1)为了操作方便,存储文件的盘块只有四块,即从root根目录下只能创建文件最多到第四层,并且缺少针对用户请求的检验。
(2)由于时间紧迫,如果创建文件或修改文件导致分配盘块数不够时,后台会自动回收这些盘块,但是没有提示信息给前台用户。
(3)缺乏对Python引用和对象的概念,在切换用户时只能切换一次,切换多次会导致用户信息表内容被覆盖,形成乱码。
(4)在实现重命名功能时,文件的重命名较简单,但文件夹的重命名涉及迭代、多次删改文件的操作,略繁琐,故未完成此功能。
(5)秉着从简的原则,文件内容不允许写入换行符’\n’,否则会导致磁盘模拟文件读写出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值