文件系统模拟程序 3 任务书
操作系统原理课程设计任务书
学院名称:数学与计算机学院课程代码:_8404061_
专业:年级:
一、设计题目
文件系统模拟程序
二、主要内容
设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
三、具体要求及应提交的材料
程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。
另外,为打开文件设置了运行文件目录(AFD)。
为了便于实现,对文件的读写可作简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
算法与框图:
因系统小,文件目录的检索使用简单的线性搜索。
文件保护简单使用三位保护码即可:允许读写执行、对应位为1,反之则为0。
程序中使用的主要设计结构如下:
主文件目录和用户文件目录(MFD、UFD)
打开文件目录(AFD)(即运行文件目录)
课程设计要求:
1.分析设计要求,给出解决方案(要说明设计实现所用的原理,采用的数
据结构);
2.画出程序的基本结构框图和流程图;
3.对程序的每一部分要有详细的设计分析说明;
4.程序执行的每个步骤要有具体的提示内容或输出;
5.源代码格式规范,注释不少于三分之一;
6.设计合适的测试用例,对得到的运行结果要有分析;
7.设计中遇到的问题,设计的心得体会。
设计结束后,每位同学必须上交如下材料:
1.《课程设计说明书》打印稿一份;
2.《课程设计说明书》电子文档及课程设计的程序源代码刻盘
四、主要技术路线提示
首先选择自己熟悉的程序设计语言,然后分析问题,画出流程图,再进行详细编码,实现相应的功能。
最后要对软件进行测试。
五、进度安排
共计2周时间,20个机时,建议进度安排如下:
1. 选题和需求分析2学时
2. 查阅资料(图书、期刊资料或上网查阅相关资料) 2学时
3. 构造框架(系统结构设计) 1.5学时
4. 编程上机,调试9学时
5. 现场验收(根据程序提问)0.5学时
6. 书写课程设计报告5学时
当然,仅靠课内时间是不够的,希望同学们课外多花时间编程学习。
六、推荐参考资料(不少于3篇)
1.张尧学等编著. 计算机操作系统教程.北京:清华大学出版社,2006.02 2.汤子瀛等编著.计算机操作系统.西安:西安电子科技出版社,1996.12 3.陈向群编著.操作系统教程.北京:北京大学出版社,2007.01
4.罗宇等编著.操作系统课程设计.北京:机械工业出版社,2005.9
指导教师签名日期年月日
系主任审核日期年月日。
南邮操作系统实验4.文件系统模拟实现
关闭文件close close (fd);
实验内容及原理说明——实验4
读文件read
写文件write
nr = read (fd, buf, count); buf 为读出信息所应送入的用户数据区首地址 count 为要求传送字节数 nr 为实际读入字节数 一旦读到文件末尾,系统调用就返回,故nr可能小于 count,甚至为0 nw = write (fd, buf, count); 参数类似 read 其中 buf 是信息传送的源地址,即将buf指向的用户数 据区中的信息写入文件中
具体功能:
#include <unistd.h> #include <stdio.h> #include <fcntl.h>
实验内容及原理说明——实验4
创建文件creat(兼具打开功能)
fd = creat (filenamep, mode);
filenamep指向所要创建的文件路径名
实验4:文件系统的模拟实现
实验基本信息 实验内容说明
实验基本信息
实验名称
文件系统的模拟实现
实验类型:综合 学时:2+2 实验时间:13.5.30(下午3-4节) 地点:教5-501 实验环境:
VMWare + Ubuntu
实验内容及原理说明——实验4
实验目link、open、close、 read、write的使用,编程模拟实现文件系统基本功能 运行终端给出命令提示,请用户选择创建、删除、读、 写、退出等操作(可用数字表示不同命令) 根据用户选择命令,提示用户输入文件名、文件内容 等信息 执行用户命令
文件系统实验 模拟设计文件操作
实验五文件系统实验一. 目的要求. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二. 例题:设计一个N个用户的文件系统,每次用户可保存L个文件,一次运行用户可以打开S个文件。
程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。
另外,为打开文件设置了运行文件目录,用户已打开文件表UOF.。
为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作算法与框图:因系统小,文件目录的检索使用了简单的线性搜索。
文件保护简单使用了保护码:允许读写执行、对应位为1,对应位为2,和对应位为3。
程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD)打开文件目录(UOF)(即运行文件目录)主文件目录MFD:用户文件目录UFD用户已打开文件表UOF二、实验要求:显示初始的文件目录表、输入的文件操作命令和每条命令执行后的UOF文件,程序运行后打印所有用户的文件目录表。
假定文件系统提供的文件操作有建立文件(CREATE),打开文件(OPEN),关闭文件(CLOSE),读文件(READ),写文件(WRITE)和删除文件(DELETE),在模拟程序中可以从键盘上输入文件操作命令来模拟各用户程序中所调用的各种文件操作,用一个结束命令(end)停止程序执行。
主程序结构流图如下:用输入命令来模拟用户程序中调用的文件操作,这些命令的格式和和要求如下:①建立文件:create(文件名,文件长度,文件属性)②写文件:write(文件名,记录号)有两种情况,第一种是在执行create后要求写,第二种是在执行open 后要求写,即对一个已存在的文件进行修改。
模拟文件系统
***课程设计报告书所属课程名称操作系统题目模拟文件系统分院**分院专业班级学号学生姓名指导教师2012 年 6 月20 日目录第1章课程设计内容及要求 (3)第2章需求分析 (4)第3章系统设计及实现 (5)第4章课程设计心得 (16)第5章参考文献 (17)第1章课程设计内容及要求课程设计题目:模拟文件系统课程设计内容及要求:通过本次实验,建立一个简单的模拟文件管理系统,理解用户界面和操作模拟管理在操作系统中的作用。
本模拟文件管理系统实现文件的创建、文件的删除、文件目录的创建、删除文件目录、改变目录显示目录等功能。
本次课设由本人独立完成.第2章需求分析该模拟文件系统包括目录文件(简称目录)、普通文件(简称文件),并实现下面一些基本功能:1.改变目录:cd 〈目录名〉,工作目录转到指定的目录下。
cd .. ,返回根目录下2.创建文件:create 〈文件名〉,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
3.删除文件:delete 〈文件名〉,删除指定的文件。
4.显示目录:ls [〈目录名〉],显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。
5.创建目录:mkdir 〈目录名〉,再指定路径下创建指定的目录,或者在没有指定路径时,在当前目录下创建子目录。
6.删除目录:rmdir〈目录名〉,删除指定的目录。
7. 获得命令帮助HELP8. 退出文件系统EXIT要考虑的特殊情况:1.各个命令对全路径和相对路径的支持A.目录不存在时,给出错误信息B.不能用cd 进入文件C.相对路径的解析D.路径中的空格剔除2.删除目录或文件时的问题A.删除不存在的文件或目录,给出错误提示B.删除目录时目录不为空; 如果该目录为空,则可删除,否则给出是否做删除,删除操作将该目录下的全部文件和子目录都删除C.进入到某个目录下,却要删除本目录或者上级目录第3章系统设计及实现模拟文件系统处理流程如下:文件系统的几个主要数据结构:<1>索引节点的数据结构:struct inode{struct inode *i_forw;struct inode *i_back;char I_falg;unsigned int I_ino;unsigned int I_count;unsigned int di_addr[NADDR];unsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned short di_size;};<2>超级块的数据结构:struct filsys{unsigned short s_isize;unsigned long s_fsize;unsigned int s_nfree;unsigned short s_pfree;unsigned int s_free[NICPREE];unsigned int s_ninode;unsigned short s_pinode;unsigned int s_inode[NICINOD];unsigned int s_rinode;char s_fmod;};<3>有关目录的数据结构:struct dinode{unsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned short di_size;unsigned int di_addr[NADDR]; };struct direct{char d_name[DIRSIZ];unsigned int d_ino;};struct dir{struct direct ditect[DIRNUM];int size;};主要模块说明<1>创建文件int get_file(int parent,char *file_name)//创建文件节点,成功则返回文件的索引号,失败返回-1{int index;if(search(parent,file_name,1,index)! =-1) //搜索在父目录下是否有同名文件存在,有则创建失败{printf("File name repeated!\n");return -1;}for(int i=0;i<FILE_NUM;i++) //搜索空闲的文件节点if(file_flag[i]==0){strcpy(file[i].file_name,file_nam e);file[i].block_count=0;if(get_block(i)==-1) //给新创建的文件申请磁盘块,如果失败,创建文件将失败{printf("Disk volumn error!\n");return -1;}file_flag[i]=1;fileflag_flag[i]++;//登记并给文件节点初始化file_change_flag[i]++;file[i].file_length=0;file[i].parent=parent;GetLocalTime(&file[i].ctime); //获得当前时间return i;}return -1;}int create_file(int parent,char *file_name) //在指定的目录下创建文件,如果创建成功则返回{//文件的索引号,否则返回-1if(dir[parent].file_count==16) //如果父目录已满,则创建失败{printf("Parent directory is full!\n");return -1;}intpos=get_file(parent,file_name);//开始创建文件if(pos==-1){printf("Create file error!\n");return -1;}dir_node *p=&dir[parent]; //修改父目录的控制信息int top=p->file_count;p->child_file[top]=pos;p->file_count++;dir_change_flag[parent]++;return pos;}int create(char *name) //创建文件的主调函数,前提是已经取得要创建文件的索引{//成功返回文件的索引号,否则返回-1int parent,p=0;parent=get_parent(name,p);if(parent==-1)//找不到父目录,输入错误,创建失败{printf("Path name error!\n");return -1;}returncreate_file(parent,name+p);//开始创建文件}<2>创建目录int create_dir(int parent,char *dir_name) //在指定的目录下创建目录,如果成功则返回目录{//的索引号,否则返回-1if(dir[parent].dir_count==8)//如果父目录已满,则创建失败{printf("Parent directory is full!\n");return -1;}intpos=get_dir(parent,dir_name);//开始创建目录if(pos==-1){printf("Create directory error!\n");return -1;}dir_node *p=&dir[parent]; //修改父目录的控制信息int top=p->dir_count;p->child_dir[top]=pos;p->dir_count++;dir_change_flag[parent]++;return pos;}int md(char *name) //创建目录的主调函数,它的参数只有用户输入{//如果创建成功,则返回目录的索引号,否则int parent,p=0; //返回-1parent=get_parent(name,p);if(parent==-1)//父目录找不到,输入有误,创建失败{printf("Path name error!\n");return -1;}returncreate_dir(parent,name+p);//开始创建目录}<3>删除文件void del_file(int pos) //删除文件,调用该函数的前提是已经取得要删除文件的索引号{return_block(pos);//释放磁盘块file_flag[pos]=0;fileflag_flag[pos]++;file_change_flag[pos]=0;}int del_file(int parent,char *file_name) //在指定的目录下删除文件,删除成功则返回文件的{//索引号,否则返回-1int del_pos,index;if((del_pos=search(parent,file_name, 1,index))==-1)//搜索该文件是否存在,不存在则删除失败{printf("The file to delete not exist!\n");return -1;}del_file(del_pos);//开始删除文件dir_node *p=&dir[parent]; //修改父目录的控制信息if(p->file_count>=2){int top=p->file_count-1;p->child_file[index]=p->child_f ile[top];}p->file_count--;dir_change_flag[parent]++;return del_pos;}int delfile(char *name) //删除文件的主调函数,前提是知道了删除文件的名字{int parent,p=0;parent=get_parent(name,p);if(parent==-1){printf("Path name error!\n");return -1;}return del_file(parent,name+p); }<4>删除目录void del_dir(int pos) //删除指定的目录节点,该目录已经为空{dir_flag[pos]=0;dirflag_flag[pos]++;dir_change_flag[pos]=0;}void del(int pos)//删除一个指定目录及它下面的所有文件及所有目录{for(inti=0;i<dir[pos].file_count;i++)//删除当前目录下的所有文件del_file(dir[pos].child_file[i]);for(i=0;i<dir[pos].dir_count;i++) //删除子目录del(dir[pos].child_dir[i]);del_dir(pos);//删除当前目录}void del_dir(int parent,int del_pos,int index) //在一个指定的目录下删除一个目录及它下面的{//所有文件及所有目录del(del_pos);//开始删除目录if(dir[parent].dir_count>=2)//修改父目录的控制信息{inttop=dir[parent].dir_count-1;dir[parent].child_dir[index]=dir[ parent].child_dir[top];}dir[parent].dir_count--;dir_change_flag[parent]++;}<5>保存文件void savefile(int file_id) //显式保存文件的核心函数{if(fileflag_flag[file_id]%2!=0) //如果创建或删除,需要写回磁盘{write_bit(file_id,1);fileflag_flag[file_id]=0;}if(file_change_flag[file_id]>0) //如果控制信息被修改,需要写回磁盘{ write_inode(file_id,1);file_change_flag[file_id]=0;for(inti=0;i<file[file_id].block_count;i++){inttemp=file[file_id].block[i];if(blockflag_flag[temp]%2!=0) //如果磁盘块被释放或被占用,需要写回磁盘{write_bit(temp,2);blockflag_flag[temp]=0;}}}<6>保存目录void save_dir(int dir_id) //保存空目录函数{if(dirflag_flag[dir_id]%2!=0)//如果删除或创建,需要写回磁盘{write_bit(dir_id,0);dirflag_flag[dir_id]=0;}if(dir_change_flag[dir_id]>0)//如果控制信息被修改,需要写回磁盘{write_inode(dir_id,0);dir_change_flag[dir_id]=0;}}void save(int dir_id) //保存一个目录及它下面的所有目录及文件{//用了递归for(inti=0;i<dir[dir_id].dir_count;i++)save(dir[dir_id].child_dir[i]);for(i=0;i<dir[dir_id].file_count;i ++)savefile(dir[dir_id].child_file[i]) ;save_dir(dir_id);}<7>改变目录void paste(int dir_id) //用于设置当前路径{if(dir_id==0)return;paste(dir[dir_id].parent);strcat(curr_path,dir[dir_id].dir_n ame);strcat(curr_path,"/");}int change_dir(char *name) //改变工作目录,成功则返回该目{//录的索引号,否则返回-1int parent,p=0,pos,index;if(strcmp(name,"/")==0)pos=0;else if(strcmp(name,"..")==0)pos=curr_dir->parent;else{parent=get_parent(name,p);if(parent==-1){ printf("Path name error!\n");return -1;}pos=search(parent,name+p,0,ind ex);}if(pos==-1)//如果该目录不存在,则失败{printf("The dictory not exist!\n");return -1;}curr_path[3]='\0';paste(pos);curr=pos;//改变当前目录及路径curr_dir=&dir[curr];return curr;}<8>显示当前目录下的文件和子目录信息void show_dir(int dir_id) //以下几个函数用于显示当前目录下面的目录和文件,{//跟上面不同的是,它不能显示目录及文件之间的关系,printf("%s",dir[dir_id].dir_name ); //但它可以显示一些细节,如创建时间,文件for(inti=strlen(dir[dir_id].dir_name);i<20;i ++)printf(" ");printf("<DIR>");for(i=25;i<30;i++)printf(" ");printf("%d-%.2d-%.2d%.2d:%.2d:% .2d\n",dir[dir_id].ctime.wY ear,dir[di r_id].ctime.wMonth,dir[dir_id].ctim e.wDay,dir[dir_id].ctime.wHour,dir[ dir_id].ctime.wMinute,dir[dir_id].cti me.wSecond);}void show_file(int file_id) //显示一个文件{printf("%s",file[file_id].file_name); for(inti=strlen(file[file_id].file_name);i<20 ;i++)printf(" ");printf("<FILE>");for(i=26;i<30;i++)printf(" ");printf("%d-%.2d-%.2d%.2d:%.2d:%.2d",file[file_id].ctime.wYear,file[fil e_id].ctime.wMonth,file[file_id].cti me.wDay,file[file_id].ctime.wHour,f ile[file_id].ctime.wMinute,file[file_i d].ctime.wSecond);for(i=0;i<8;i++)printf(" ");int length=file[file_id].file_length; printf("len: %d bytes\n",length);}void show(int dir_id) //显示目录及文件的核心函数,用了递归思想{for(inti=0;i<dir[dir_id].file_count;i++) show_file(dir[dir_id].child_file[i]); for(i=0;i<dir[dir_id].dir_count;i++) show_dir(dir[dir_id].child_dir[i]);}void list() //显示文件及目录的主调函数{show(curr);//该函数的参数表示根目录的索引printf("\n%dfiles.\n",curr_dir->file_count); //统计文件数printf("\n%ddirs.\n",curr_dir->dir_count); //统计目录数}<9>获得系统的命令的帮助void help() //打印命令及解释{printf("Commands:Explanation:\n\n"); printf(" exit -Exit!\n"); printf(" dir -Show files and directories!\n"); printf(" mkf -Create a new file!\n"); printf(" mkd -Create a new directory!\n"); printf(" delf -Delete a file!\n"); printf(" deld -Delete a directory!\n"); printf(" cd -Change the current directory!\n"); printf(" help -Print commands!\n"); }系统实现相关截图:第4章课程设计心得课程设计能反映出一个人的编程的综合能力。
文件管理模拟程序报告 大作业
文件管理模拟程序姓名:学号:班级:1.设计目的(1)建立一个简单的模拟文件管理系统。
(2)理解用户界面和操作命令在操作系统中的作用。
2.设计要求需要实现一个命令行操作界面,包含如下命令:1.创建文件功能:创立一个指定名字的新文件,即在目录中增加一项,不考虑文件内容,但必须能输入文件长度。
2.删除文件功能:删除指定的文件3.创建目录功能:在当前路径下创建指定的目录。
4.删除目录功能:删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否作删除,删除操作将该目录下的全部文件和子目录都删除。
5.改变目录功能:工作目录转移到指定的目录下,只要求完成改变到当前目录的某一个子目录下的功能,不要求实现相对目录以及绝对目录。
6.显示目录功能:显示全部目录以及文件,输出时要求先输出接近根的目录,再输出子目录。
对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误情况,程序应该作出相应处理并给出错误信息。
界面的提示符为#,提示的命令以及调试的方法应和前面的要求一致,可以自己设计更多的命令或者附加功能。
3.环境本实验是在windows xp+vc 6.0环境下实现的,利用windows SDK 提供的系统接口(API)完成程序功能。
在windows xp下安装好VC后进行,VC是一个集成开发环境,其中包含了windows SDK所有工具,所以就不用单独在安装SDK了,程序中所用的API是操作系统提供的用来进行应用程序设计的系统功能接口。
要使用这些API,需要包含对这些函数进行说明的SDK头文件,最常见的就是windows.h。
一些特殊的API调用还需要包含其他的头文件。
4.步骤1.打开VC,选择菜单项File->New,选择Project选项卡并建立一个名为filesys的win32console application工程。
2.在工程中创建原文件filesys.cpp:选择菜单项Project->Add to Project->File,此时将打开一个新窗口,在其中输入想要创建的文件名字,这里是filesys.cpp,在其中编辑好原文件并保存。
模拟文件系统的设计与实现
中北年夜学之阿布丰王创作把持系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:xxx学号:xxx设计题目:模拟文件系统的设计与实现起迄日期: 2015年12月28日- 2016年1月8日指导教师:xxx2016 年1月8日1需求分析通过模拟文件系统的实现,深入理解把持系统中文件系统的理论知识, 加深对教材中的重要算法的理解.同时通过编程实现这些算法,更好地掌握把持系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握把持系统结构、实现机理和各种典范算法,系统地了解把持系统的设计和实现思路,并了解把持系统的发展意向和趋势.模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件.2总体设计结合数据结构、法式设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解把持系统.文件的创立: create 文件关闭:close 文件的翻开:open文件的读:read 文件的写:write 文件关闭:close删除文件:delete 创立子目录:mkdir 删除子目录:rmdir列出文件目录:dir 退出:exit#define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表年夜小#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号#define ROOT_DISK_SIZE sizeof(struct direct) //根目录年夜小#define DIR_MAXSIZE 1024 //路径最年夜长度为1KB #define MSD 5 //最年夜子目录数5 #define MOFN 5 //最年夜文件深度为5#define MAX_WRITE 1024*128 //最年夜写入文字长度128KBstruct fatitem /* size 8*/{int item; /*寄存文件下一个磁盘的指针*/char em_disk; /*磁盘块是否空闲标识表记标帜位 0 空闲*/};struct direct{/*-----文件控制快信息-----*/struct FCB{char name[9]; /*文件/目录名 8位*/char property; /*属性 1位目录 0位普通文件*/int size; /*文件/目录字节数、盘块数)*/int firstdisk; /*文件/目录起始盘块号*/int next; /*子目录起始盘块号*/int sign; /*1是根目录 0不是根目录*/ }directitem[MSD+2];};struct opentable{struct openttableitem{char name[9]; /*文件名*/int firstdisk; /*起始盘块号*/int size; /*文件的年夜小*/}openitem[MOFN];int cur_size; /*以后打文件的数目*/};管理文件的主要代码:int create(char *name){int i,j;if(strlen(name)>8) /*文件名年夜于 8位*/return(-1);for(j=2;j<MSD+2;j++) /*检查创立文件是否与已存在的文件重名*/{if(!strcmp(cur_dir->directitem[j].name,name))break;}if(j<MSD+2) /*文件已经存在*/return(-4);for(i=2;i<MSD+2;i++) /*找到第一个空闲子目录*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2) /*无空目录项*/return(-2);if(u_opentable.cur_size>=MOFN) /*翻开文件太多*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++) /*找到空闲盘块 j 后退出*/{if(fat[j].em_disk=='0')break;}if(j>=DISK_NUM)return(-5);fat[j].em_disk = '1'; /*将空闲块置为已经分配*//*-----------填写目录项-----------------*/strcpy(cur_dir->directitem[i].name,name);cur_dir->directitem[i].firstdisk = j;cur_dir->directitem[i].size = 0;cur_dir->directitem[i].next = j;cur_dir->directitem[i].property = '0';/*---------------------------------*/fd = open(name);return 0;}int open(char *name){int i, j;for(i=2;i<MSD+2;i++) /*文件是否存在*/{if(!strcmp(cur_dir->directitem[i].name,name))break;if(i>=MSD+2)return(-1);/*--------是文件还是目录-----------------------*/if(cur_dir->directitem[i].property=='1')return(-4);/*--------文件是否翻开-----------------------*/ for(j=0;j<MOFN;j++){if(!strcmp(u_opentable.openitem[j].name,name))break;}if(j<MOFN) /*文件已经翻开*/return(-2);if(u_opentable.cur_size>=MOFN) /*文件翻开太多*/return(-3);/*--------查找一个空闲用户翻开表项-----------------------*/for(j=0;j<MOFN;j++){if(u_opentable.openitem[j].firstdisk==-1)break;/*--------------填写表项的相关信息------------------------*/u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk;strcpy(u_opentable.openitem[j].name,name);u_opentable.openitem[j].size = cur_dir->directitem[i].size;u_opentable.cur_size++;/*----------返回用户翻开表表项的序号--------------------------*/return(j);}int close(char *name){int i;for(i=0;i<MOFN;i++){if(!strcmp(u_opentable.openitem[i].name,name))break;}if(i>=MOFN)return(-1);/*-----------清空该文件的用户翻开表项的内容---------------------*/strcpy(u_opentable.openitem[i].name,"");u_opentable.openitem[i].firstdisk = -1;u_opentable.openitem[i].size = 0;u_opentable.cur_size--;return 0;}int write(int fd, char *buf, int len){char *first;int item, i, j, k;int ilen1, ilen2, modlen, temp;/*----------用 $ 字符作为空格 # 字符作为换行符-----------------------*/char Space = 32;char Endter= '\n';for(i=0;i<len;i++){if(buf[i] == '$')buf[i] = Space;else if(buf[i] == '#')buf[i] = Endter;}/*----------读取用户翻开表对应表项第一个盘块号-----------------------*/item = u_opentable.openitem[fd].firstdisk;/*-------------找到以后目录所对应表项的序号-------------------------*/for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].firstdisk==item)break;}temp = i; /*-寄存以后目录项的下标-*//*------找到的item 是该文件的最后一块磁盘块-------------------*/while(fat[item].item!=-1){item =fat[item].item; /*-查找该文件的下一盘块--*/}/*-----计算出该文件的最末地址-------*/first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZ E;/*-----如果最后磁盘块剩余的年夜小年夜于要写入的文件的年夜小-------*/if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len){strcpy(first,buf);u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;}else{for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++){/*写一部份内容到最后一块磁盘块的剩余空间(字节)*/first[i] = buf [i];}/*-----计算分配完最后一块磁盘的剩余空间(字节)还剩下几多字节未存储-------*/ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);ilen2 = ilen1/DISKSIZE;modlen = ilen1%DISKSIZE;if(modlen>0)ilen2 = ilen2+1; /*--还需要几多块磁盘块-*/ for(j=0;j<ilen2;j++){for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*寻找空闲磁盘块*/{if(fat[i].em_disk=='0')break;}if(i>=DISK_NUM) /*--如果磁盘块已经分配完了-*/return(-1);first = fdisk+i*DISKSIZE; /*--找到的那块空闲磁盘块的起始地址-*/if(j==ilen2-1) /*--如果是最后要分配的一块-*/{for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE;k++)first[k] = buf[k];}else/*-如果不是要最后分配的一块--*/{for(k=0;k<DISKSIZE;k++)first[k] =buf[k];}fat[item].item = i; /*--找到一块后将它的序号寄存在上一块的指针中-*/fat[i].em_disk = '1'; /*--置找到的磁盘快的空闲标识表记标帜位为已分配-*/fat[i].item = -1; /*--它的指针为 -1 (即没有下一块)-*/}/*--修改长度-*/u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;}return 0;}int read(int fd, char *buf){int len = u_opentable.openitem[fd].size;char *first;int i, j, item;int ilen1, modlen;item = u_opentable.openitem[fd].firstdisk;ilen1 = len/DISKSIZE;modlen = len%DISKSIZE;if(modlen!=0)ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/ first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/for(i=0;i<ilen1;i++){if(i==ilen1-1) /*--如果在最后一个磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];}else /*--不在最后一块磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];item = fat[item].item; /*-查找下一盘块-*/first = fdisk+item*DISKSIZE;}}return 0;}int del(char *name){int i,cur_item,item,temp;for(i=2;i<MSD+2;i++) /*--查找要删除文件是否在以后目录中-*/{if(!strcmp(cur_dir->directitem[i].name,name))break;}cur_item = i; /*--用来保管目录项的序号,供释放目录中-*/if(i>=MSD+2) /*--如果不在以后目录中-*/return(-1);if(cur_dir->directitem[cur_item].property!='0') /*--如果删除的(不)是目录-*/return(-3);for(i=0;i<MOFN;i++) /*--如果文件翻开,则不能删除,退出-*/{if(!strcmp(u_opentable.openitem[i].name,name))return(-2);}item = cur_dir->directitem[cur_item].firstdisk;/*--该文件的起始盘块号-*/while(item!=-1) /*--释放空间,将FAT表对应项进行修改-*/{temp = fat[item].item;fat[item].item = -1;fat[item].em_disk = '0';item = temp;}/*-----------------释放目录项-----------------------*/cur_dir->directitem[cur_item].sign = 0;cur_dir->directitem[cur_item].firstdisk = -1;strcpy(u_opentable.openitem[cur_item].name,""); cur_dir->directitem[cur_item].next = -1;cur_dir->directitem[cur_item].property = '0';cur_dir->directitem[cur_item].size = 0;return 0;}主函数:int main(){FILE *fp;char ch;char a[100];char code[11][10];char name[10];int i,flag,r_size;char *contect;contect = (char *)malloc(MAX_WRITE*sizeof(char));if((fp=fopen("disk.dat","rb"))==NULL){printf("You have not format,Do you want format?(y/n)");scanf("%c",&ch);if(ch=='y'){initfile();printf("Successfully format! \n");}else{return 0;}}enter();print();show();strcpy(code[0],"exit");strcpy(code[1],"create");strcpy(code[2],"open");strcpy(code[3],"close");strcpy(code[4],"write");strcpy(code[5],"read");strcpy(code[6],"del");strcpy(code[7],"mkdir");strcpy(code[8],"rmdir");strcpy(code[9],"dir");strcpy(code[10],"cd");while(1){scanf("%s",a);for(i=0;i<11;i++){if(!strcmp(code[i],a))break;}switch(i){case 0: //退出文件系统free(contect);halt();return 0;case 1: //创立文件scanf("%s",name);flag = create(name);if(flag==-1){printf("Error: \n The length is too long !\n");}else if(flag==-2){printf("Error: \n The direct item is already full !\n");}else if(flag==-3){printf("Error: \n The number of openfile is too much !\n");}else if(flag==-4){printf("Error: \n The name is already in the direct !\n");}else if(flag==-5){printf("Error: \n The disk space is full!\n");}else{printf("Successfully create a file! \n");}show();break;case 2://翻开文件scanf("%s",name);fd = open(name);if(fd == -1){printf("Error: \n The open file not exit! \n");}else if(fd == -2){printf("Error: \n The file have already opened! \n");}else if(fd == -3){printf("Error: \n The number of open file is too much! \n");}else if(fd == -4){printf("Error: \n It is a direct,can not open for read or write! \n");}else{printf("Successfully opened! \n");}show();break;case 3://关闭文件scanf("%s",name);flag = close(name);if(flag == -1){printf("Error:\n The file is not opened ! \n");}else{printf("Successfully closed! \n");}show();break;case 4://写文件if(fd ==-1){printf("Error:\n The file is not opened ! \n");}else{printf("Please input the file contect:");scanf("%s",contect);flag=write(fd,contect,strlen(contect));if(flag == 0){printf("Successfully write! \n");}else{printf("Error:\n The disk size is not enough! \n");}}show();break;case 5://读文件if(fd ==-1){printf("Error:\n The file is not opened ! \n");}else{flag = read(fd,contect);if(flag == 0){for(i=0;i<u_opentable.openitem[fd].size;i++){printf("%c",contect[i]);}printf("\t\n");}}show();break;case 6://删除文件scanf("%s",name);flag = del(name);if(flag == -1){printf("Error:\n The file not exit! \n");}else if(flag == -2){printf("Error:\n The file isopened,please first close it ! \n");}else if(flag == -3){printf("Error:\n The delete is not file ! \n");}else{printf("Successfully delete! \n");}show();break;}}}法式运行截图:4.心得体会在设计的过程中,我查询了很多相关资料,不竭地发现问题、提出问题、解决问题.用C做法式开发语言,让我重新认识了C的基础,在新语言不竭呈现并发展迅速的今天,重新体会到C的基础性、重要性,以及面对过程,面对函数式的编程方式.在对自己所编写的源法式段的纠错的过程中,使我更好的理解了把持系统中文件系统的理论知识,同时在编程时用到了模块化的设计思想,这种编程方法可以使我们的编程更简单,可以使我们的查错与纠错变得更加方便.总的来说通过这次的设计学习使我学到了很多在平时的学习中学不到的很多工具,对把持系统有了更深一层的了解,同时也提高了C语言的能力,由于时间以及个人知识的问题,因此有很多的处所还需要改进.在以后的学习中还要更加努力.。
模拟文件系统
操作系统课程设计-模拟文件系统班级:计044班姓名:夏鑫学号:2004121228一.实验目的用高级语言编写和调试一个简单的文件系统。
模拟文件管理的工作过程。
加深理解文件系统的内部功能和内部实现。
二.基本要求在任意一个OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟UNIX文件系统。
可以实现下列几条命令FORMAT 初始化MKF 创建文件(给出文件名,文件长度)MKD 创建目录CD 改变当前目录(CD .. 返回根目录)DELF 删除文件DELD 删除目录DIR 显示文件目录(当前目录下)HELP 获得命令的帮助EXIT 退出系统三.设计思想说明1.设计环境课程设计的环境是windows xp sp2操作系统。
在windows系统中创建一个较大容量的文件,作为所设计文件系统的假想的“文件卷”,从而编写各程序模块。
2.开发环境课程设计所使用的开发环境是VC++ 6.03.基本思想以 1M 的存储器空间为例作为文件空间,空间“分块”。
超级块,在最前面,共占3.2k个字节。
其中0.2K个字节存放目录节点的位示图,1K个字节存放文件节点的位示图,2k字节存放盘块节点的位示图。
用位状态='0'表示空闲,状态='1'表示已分配。
后半部用于存放目录接点和文件接点。
超级块不参与文件空间的动态分配。
其他块用于存贮目录接点和文件接点的信息。
该程序在系统盘内自动创建一个目录A :作为该系统的根目录。
四.需求分析该模拟文件系统包括目录文件(简称目录)、普通文件(简称文件),并实现下面一些基本功能:1.改变目录:CD 〈目录名〉,工作目录转到指定的目录下。
CD .. ,返回上一级目录下2.创建文件:MKF 〈文件名〉,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
3.删除文件:DELF 〈文件名〉,删除指定的文件。
4.显示目录:DIR [〈目录名〉],显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。
模拟文件管理系统
理学院School of Sciences 课程设计报告所选题目:模拟文件管理系统学生姓名:刘宁学生学号:200801055所在班级:08级二班所在专业:信息与计算科学指导教师:段建丽一、课程设计简介1、设计目的:设计和调试一个简单的文件系统,通过模拟文件操作命令的执行,来模拟文件管理对主要文件操作命令的实质和执行过程有比较深入的了解,掌握它们的基本实施方法.2、实验内容:•建立文件存储介质的管理机制•建立目录•文件系统功能(显示目录、创建、删除、打开、关闭、读、写)•文件操作接口(显示目录、创建、删除、打开、关闭、读、写)二、数据结构及算法及结构图1、创建大文件作为虚拟磁盘此部分处于程序初始化阶段,当程序检测到大文件(FileSystem)不存在时调用init.c 文件中的space_aquire()函数创建512*512*512B 的一个大文件,其中最后一个512 为块大小,整个虚拟磁盘一共有512*512 个BLOCK。
创建成功返回0,其中文件指针为外部变量,指向创建的文件。
创建文件即采用创建一个文件,写入512*512 个大小为512B 的块即可得到。
2、初始化super block1)建立空闲盘块分组链接索引结构:在此即涉及到虚拟磁盘块的功能划分,若将磁盘块编号,则下列各区分别占用块数如下管理块结构如下:typedef struct super_block_struct { /*管理块*/f_block block; /*直接管理的空闲块结构*/f_inode inode; /*直接管理的空闲i 结点结构*/ } superB;typedef struct free_block { /*空闲块组*/int s_nfree; /*管理的空闲块数*/int s_free[127]; /*空闲块号栈*/} f_block;其中超块与空闲块结构的关系可用下图表示:所有空闲块看似形成了一个链表,实际上是一个栈,超块直接管理一个空闲块组,每个空闲块组的0 号s_free[0]指向前一组。
模拟文件管理系统
一、课程设计名称及题目操作系统课程设计----模拟文件管理系统二、算法思想及功能:编制文件管理模拟程序,进行文件的操作与管理—— “模拟文件管理系统”。
1、采用两级目录进行文件管理,最多支持5个用户。
主目录(MFD ):采用顺序表存储结构,用户文件目录(UFD ):采用链式存储结构。
文件记录采用链式存储结构。
2、采用菜单方式与用户交互,实现文件操作,各菜单具体功能如下:(1)建立文件:在某用户下建立一个或多个文件,文件中可以保存一条或多条记录。
(2)打开文件:打开已经建立的文件,任何文件必须先打开后使用(包括读、写和查看显示),若要打开没有建立文件,返回错误提示。
(3)删除文件:删除已经建立的文件,若文件已经被打开,先关闭再删除。
(4)关闭文件:关闭已经打开的文件,若文件内容被修改,需要保存新的文件内容。
(5)读文件:读某一被打开的文件第Ri 个记录内容。
读出记录后,可以选择对文件记录进行修改或删除操作,也可不做任何改动,直接返回主菜单。
(6)写文件;对打开的文件写入记录数据,包括姓名和性别。
(7)显示目录 :显示用户文件表和打开文件表。
(8)显示文件:显示某一被打开文件的全部记录。
(9)退出操作:退出当前用户,可选择另外一个用户进行操作或者直接退出程序。
3、可反复选择不同用户,针对性实施文件操作程序主要数据结构:主目录 (link f )用户名用户文件目录指针username [ ]next结构体数组程序主要数据结构与函数功能描述:struct linkf{ }; //主目录struct links{ }; //用户文件目录struct linkr { }; //文件——记录类型struct linkt { }; //打开文件表void print1() //显示主目录void print2() //显示当前用户的文件目录void print3() //显示文件内容void pcreate() //建立新文件void popen() //打开文件void pclose() //关闭文件void pdelete() //删除文件void pread() //读文件void pwrite() //写文件void close() //退出某用户操作时,关闭所有打开文件void main() // 主函数三、负责的功能段程序:删除文件部分void pdelete(){p2=ufd;if(p2==NULL){ printf("该用户没有文件,不能删除!\n");return;}printf("输入要删除的文件名:");scanf("%s",X);q3=afd;p3=afd;if(q3!=NULL){while((strcmp(q3->filename,X)!=0)&&(q3->next!=NULL)){p3=q3;q3=q3->next;}if(strcmp(q3->filename,X)==0)//如果在活动文件列表中找到=》从中删除 {if(q3==afd)afd=afd->next;p3->next=q3->next;free(q3);//!!printf("删除前已经将文件关闭\n");}}q2=ufd;while((strcmp(p2->filename,X)!=0)&&(p2->next!=NULL)){q2=p2;p2=p2->next;}if(strcmp(p2->filename,X)==0)//查找和输入文件名相容的链表项{q=p2->headlink;if(q!=NULL){while(q->next!=NULL){p=q;q=q->next;free(p);}free(q);}//p2->headlink=NULL;//while(p2->headlink!=NULL)// {// p2->headlink=p2->headlink->next;// free(p2->headlink);// }if(p2==ufd) ufd=ufd->next;q2->next=p2->next;free(p2);//释放文件记录空间printf("文件已经成功删除\n");}else{printf("该文件不存在,不能删除!\n"); return;}}四、程序流程图:课设个人完成模块需要编制pdelete()函数,相应流程图如下:五、调试运行情况先创建两个用户,1,2;然后显示了MFD中已经有两个用户1和2 了;然后输入对用户1进行操作;先在用户1中创建三个文件;分别取名为a;aa;aaa创建好了之后打开文件a,并且写入学生的纪录还是在文件a 中写入两条新的纪录然后在文件aa中写入新的记录显示操作出错了,因为没有打开文件aa 然后打开文件aa在aa中写入两条记录然后进行读操作选择5 读取文件a 中的第一条记录,并且将记录修改一下;然后看一下7,显示一下用户和文件的目录条件发现在MFD中的长度依旧是0然后将文件aa进行关闭操作想再往文件aa中进行相应的写入新的记录;发现出现了以下的错误操作;所以,要是想进一步进行操作,必须先打开文件aa 这时打开7再看一下发现MFD中aa的长度已经作了相应的修改了现在看下a中具体的记录,选择8然后删除文件aaa发现文件直接删除掉了,不需要打开;再重新创建下文件aaa创建成功再对删除的另一种情况进行操作先打开文件aa发现删除时会显示在删除前已经将文件关闭了然后再删除一个不存在的文件aaaa发现显示的是该文件不存在没有办法删除关闭文件a选择7显示结果:发现aa 删除之后的文件的空间已经释放了。
实验三 文件管理 (2)
实验三文件管理
专业:计算机科学与技术班级: 1班学号: 122 姓名:
实验地点:工A207 实验时间: 2012-11-23 指导教师:
一、实验目的
通过调试并运行一个简单的文件系统来模拟文件操作命令的执行、模拟文件管理,使学生对主要文件操作命令的实质和执行过程有比较深入的了解,掌握它们的基本实施方法。
二、实验环境
具备Windows或MS-DOS操作系统、带有Turbo Pascal 集成环境的PC机。
三、实验内容
一.阅读实验程序
文件管理模拟程序代码见【实验例程】。
二.编译实验例程
用Turbo Pascal 编译实验例程。
三.运行程序并对照实验源程序阅读理解实验中输入、输出的意义。
四、实验记录
1.实验目录
2.create
3.open
4.close
5.delete
6.driectory
User
main
五、思考题
1、该文件模拟系统目录结构的特点?
答:模拟二级目录结构的特点
2、该文件模拟系统支持几个用户?
答:最多5个用户
3、主文件目录、用户文件目录、活动文件目录的目录项有哪些?
答:主文件目录: user_name,file_number
用户文件目录:filename,protection code ,length
活动文件目录:
4、设置数据域pcode的目的是什么?请说明如何发挥它的作用?
答:用于访问控制。
5、描述文件管理主控程序的算法(流程图或N-S图)。
答:
六、实验小结
答:学习了模拟文件管理系统的二级系统结构,文件的建立查看等。
课程设计模拟文件系统
文件目录树
用户界面
剪切 粘贴 删除 查找 替换
用户登陆
系统目录树
bin (系统目录)
etc
(系统目录)
user
(注册用户目录)
admin kite
(系统默认用户目录)
(普通文件)
磁盘使用状况
新建文件/文件夹 新建文件 文件夹
查看、 文件属性(查看、修改 查看 修改)
文件属性说明
磁盘索引结点:D表示盘 块,A表示索引顺序(D2 A6)
问题及讨论
程序设计特点
1、程序实现上采用了静态常量,文件目录树大小、磁盘索引结点个数、虚拟磁盘盘 块数等都可以通过修改静态常量而改变,方便了系统的扩展。 2、虚拟磁盘保留六个盘块存放系统目录树、磁盘索引结点;每个盘块大小固定为 1024B;虚拟磁盘保存在物理磁盘HardDisk.mlw文件中。 3、磁盘索引结点占用36字节,故每个盘块中可以保存28个结点;文件目录树大小=用 户数×每个用户拥有的最多文件数;磁盘索引结点值在新建文件时由系统自动获得。 4、采用多级目录结构,系统设定bin、etc、user、user/admin四个系统文件,用户不 得对其进行修改、删除、剪切等操作。 5、外存分配采用单级索引分配,文件最大长度1024/3×1024B。 6、文件存储空间管理采用位示图法。
文件系统结构
文件目录树
文件主 文件名 磁盘索引结点
文件结点
物理磁盘
0 1
文件类型 存储权限 物理位置 文件长度 连接计数 建立时间 修改时间
磁盘索引结点
2 . . .
虚拟磁盘
程序文件结构
系统工作流程
初始化虚拟磁盘初始化文件目录树初始化磁盘索引结点文件操作
保存虚拟磁盘
