基于Ext2的思想和算法,设计一个类Ext2的文件系统,实现Ext2文件系统的一个功能子集。并且用现有操作系统上的文件来代替硬盘进行硬件模拟。
- 文件系统存储结构
- 文件访问权限
- 多级索引:直接索引6块,一级索引512/2=256块,二级索引256x256=65536块
-
三种时间:
CreateTime:目录或文件创建时的时间LastAccessTime:上一次目录列出所有项,文件读出的时间ModifyTime:目录创建新文件或目录、删除子目录或文件,文件写入的时间
-
命令层操作准备:
Void Fun() { fp=fopen(PATH"rb+");//文件打开权限不同函数可能不同 ext2_inode cur_inode; reload_inode_entry(currentdir_inode&cur_inode);//获取当前目录的索引结点 ... fclose(fp); }
初始密码为666,若输入错误有一次重新输入密码的机会,两次输入都错误则退出文件系统
- 当前目录为根目录,且初始化后没有创建文件或目录,因此只有两个目录项。
- 目录的size表示目录下所有目录项的大小之和,文件的size表示文件内容的大小所占的字节数。
- 文件或目录新创建时默认权限都为r_w_x,可以使用命令进行修改。由于此处并没有不同类型的用户,因此imode只设置了一组值。
成功创建目录dir1,并且可以看到根目录的modifytime修改为了dir1的createtime。
- 成功创建文件file1,并且再次ls可以看到lastaccesstime被修改为上一次使用ls命令访问根目录的时间
- 可以看出,在同一目录下不允许存在同名文件或同名目录,也不允许文件和目录同名。 下面进行一些文件和目录的创建以便进行后面的测试。
root/
├── dir1/
│ ├── dir11/
│ └── file11
├── file1
├── file2
├── dir2/
│ ├── dir21/
│ └── file_a
└── dir3
创建好后访问根目录如下:
进入当前目录下的子目录dir1:
返回上级目录,再使用相对路径进入dir1下的目录dir11:
在任意目录下使用绝对路径可进入另一路径下的目录:
使用cd /命令可直接返回根目录:
- 测试x权限:
- 测试w权限:
- 测试r权限:
- dir1不为空所以不能删除
- 当前目录下不存在dir所以不能删除
- dir3为空目录被成功删除
10.open+file_name:打开文件,close+file_name:关闭,read+file_name:读出write+file_name+>/>>+...:>为写入时覆盖原文件,>>为写入时追加内容到文件末尾
(1)测试打开文件和读文件
- 文件未打开时不能进行读写操作
- 成功打开file1,未写入时读取文件显示文件为空
(2)测试两种写入文件的方式
(3)测试写入过程中数据块的分配及文件的访问时间和修改时间
- 第一次输入103个a覆盖文件原有内容,再追加103x4个字符,总共515个字符,一个数据块存不下,需要在写入时分配数据块,可以从文件大小及读出结果看出成功分配了数据块。
- 从ls的结果可以看出,file1的modifytime在写入文件时被修改,lastaccesstime在读文件时被修改
(4)测试文件的关闭
(5)测试文件的访问权限
- 修改访问权限时需要输入密码,这里使用这个功能来验证密码是否成功被修改
- 未登出时不能重复登录
- 登出后重新登录文件系统内容保持不变
输入两次2500个字符,共5000个字符,需要10个数据块来存储(如果没有索引文件是无法分配这么多块的)。从运行结果可以看出,文件成功分配了5000字节空间并能读出5000个a(太长了,没有放全),之后成功删除文件并在删除时关闭了文件。
原因:使用fopen打开文件时未正确设置权限,每次打开时都使用wb+清空了文件
解决方法:通过查阅资料设置了正确的权限 (https://blog.csdn.net/qq_37037348/article/details/130563950)
原因:localtime函数实现的时候采用的是一块固定buffer,因此如果多次调用此函数,结果值会是最后一次的结果值
解决方法:在localtime函数调用后直接将buffer内容拷贝出来 (https://blog.csdn.net/cleanfield/article/details/6224804)