计算机操作系统课程设计_简单的二级文件系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《操作系统》课程设计
题目:设计一个简单二级文件系统
专业:计算机科学与技术
年级:文计091-1
*名:***
学号:200990514103
指导教师:任满杰
时间:2011-2012第二学期
2012年9月1日
一、设计内容
1、可以实现下列几条命令。
Format 格式化
Dir 列文件目录
Create 创建文件
Delete 删除文件
Deldir 删除目录
Open 打开文件
Close 关闭文件
Search 查询文件
Copy 拷贝文件
Cut 剪切文件
二、开发环境
Windows操作系统
Microsoft Visual C++
三、分析设计
(一)实验原理
通过程序模拟Linux文件系统,用一个二进制文件(FileSystem.disk)来模拟磁盘.设计一个多用户的二级文件系经统、实现一般的创建文件、目录,删除文件、目录,切换目录,打开、关闭文件、读写文件等操作。
文件系统,包含格式化,显示文件(目录),创建文件等几个简单命令的实现,而且能完成超级块的读写,节点的读写等过程. 本文件系统采用两级目录,其中第一级对应
于用户账号,第二级对应于用户账号下的文件。
另外,为了简单本文件系统未考虑文件共享、文件系统安全以及管道文件与设备文件等特殊内容。
1.程序执行流程图:
2.数据块的分配和回收
(二)程序结构
设计FileSystem类负责管理磁盘空间和磁盘内存I节点,负责对磁盘空间和磁盘数据进行优化管理。
并提代接口言方法供用户或程序调用。
(三)数据结构
int physic[100]; //文件地址缓冲区
int style=1; //文件的类型
char cur_dir[10]="root"; //当前目录
int search_i=0;
struct command
{
char com[10];
}cmd[20];
struct block
{
int n; //空闲的盘快的个数
int free[50]; //存放空闲盘快的地址
int a; //模拟盘快是否被占用
}memory[20449];
struct block_super
{
int n; //空闲的盘快的个数
int free[50]; //存放进入栈中的空闲块
int stack[50]; //存放下一组空闲盘快的地址
}super_block;
struct node //i结点信息
{
int file_style; //i结点文件类型
int file_length; //i结点文件长度
int file_address[100]; //i结点文件的物理地址 char file_message[100];
} i_node[640];
struct dir //目录项信息
{
char file_name[10]; //文件名
int i_num; //文件的结点号
char dir_name[10]; //文件所在的目录
} root[640];
四.运行示例及结果分析
菜单
删除目录文件查询
拷贝
剪切
五、程序实现
详细程序请参见源文件, 在此只列举3点
1、剪切文件
程序片段:void cut(char *tmp,char *newname) {
int i; //,j
char t[20];
_strtime(t);
for(i=0;i<640;i++)
if(strcmp(newname,root[i].file_name)==0)
{
break;
}
if(i==640)
{
printf("目录不存在,不能剪切!\n");
return;
}
for(i=0;i<640;i++)
{
if(strcmp(tmp,root[i].file_name)==0)
{
strcpy(root[i].dir_name,newname);
strcpy(i_node[root[i].i_num].change_t,t);//
printf("剪切成功!\n");//
return;
}
}
if(i==640)
printf("文件不存在,执行失败!\n");
}
2.无文件查询
程序片段:void search(char* filename){
int sign=0;
for(search_i=0;search_i<640;search_i++)
{
if(strcmp(root[search_i].file_name,filename)==0) //查询文件中所在目录信息和当前目录信息相同的数据
{
sign=1;
int k=root[search_i].i_num;
printf("%s\t",root[search_i].file_name); //文件名
printf(" %d\t",i_node[k].file_style); //文件的类型
printf(" %d\t\t",i_node[k].file_length); //文件的长度
printf("%s\n",root[search_i].dir_name); //文件所在的目录
}
}
if (sign==0)
{
printf("%s\n","未找到该文件!");
}
}
六、心得与体会
这次设计中遇到最难的问题就是拷贝功能的实现,由于之前没有接触过拷贝的原理,所以通过和同伴的讨论和试验,终于突发奇想的运用改变文件路径的源代码和创建文件相结合,终于实现了拷贝功能,能够将一个文件从一个目录拷贝到另一目录(即先移动过去然后再在原位置创建一个原文件),可是却无法拷贝到root根目录,为了解决这个问题,又在创建文件的程序里添加了一个判断是否为根目录的语句,可是后来又发现了真个系统存在重命名的问题。
设计在逐步深入,功能在逐渐健全,可是问题也就随之暴露的更多,逐步的解决问题,我想,这才是我们课程设计的意义吧。
主要解决了拷贝问题,剪切问题和无文件查询问题。
可是由于C++编程语言掌握的不是很好,程序编写的很普通,而且很多不足,例如:查询的编写过程中没有做出模糊查询,只做到了精确查询,而且是用了将全部磁盘块查询一遍的方法;拷贝中文件可以重名,无法提示用户文件重名;剪切无法做到从一子目录剪切到根目录。
这些问题还有待深入学习和探讨。
通过几天来的设计和学习,真的学习到了很多东西。
通过这次的操作系统的课程设计,在老师的细心指导和同学的积极讨论下,终于做出了模拟Linux二级文件系统,能够简单得实现目录的创建和删除,文件的建立和删除,文件的读写等这些基本操作,并且着重改编了拷贝、剪切和查询的功能,了解二级目录的有关内容,并且通过编写的模拟Lunix下的操作环境有了更进一步的了解。
最后,感谢老师的指导。