完整操作系统 实验报告 文件管理.docx
《完整操作系统 实验报告 文件管理.docx》由会员分享,可在线阅读,更多相关《完整操作系统 实验报告 文件管理.docx(28页珍藏版)》请在冰豆网上搜索。
完整操作系统实验报告文件管理
昆明理工大学信息工程与自动化学院学生实验报告
(201—201学年第二学期)
课程名称:
操作系统开课实验室:
年月日
年级、专业、班
学号
姓名
成绩
实验项目名称
文件管理
指导教师
教师评语
教师签名:
年月日
一、实验目的
用C或C++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
二、实验原理及基本技术路线图(方框原理图)
用C模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。
功能设计:
Help显示命令帮助
dir显示当前目录下的文件和文件夹
exit退出系统
create[文件名]创建文本文件
cdir[目录名]创建文件夹
read[文件名]读取一个文件最多可同时读取五个
close[文件名]关闭一个文件
edit[文件名]编辑一个文件
cd[目录名]进子目录或者上级目录
attr[文件名]显示该文件的属性
del[文件名]删除文件
rename[文件名]重命名
编辑功能流程图
删除文件流程图创建文件流程图
核心算法:
boolFormat(void);//格式化
boolinstall(void);//装载虚拟硬盘的数据
voidlogin(void);/用户登陆
voidshowMenu(void);//显示功能菜单
boolonAction(void);//用户选择功能并执行
voidcreateFile(stringstr);//创建文件
boolread(stringstr);//读取文件
voideditFile(stringstr);//编辑文件
voidDelete(stringstr);//删除一个文件
数据结构:
/*——-—--——-常变量—-——-—*/
constunsignedintBLOCK_SIZE=512;//块长
constunsignedintDATA_BLOCK_NUM=512;//数据块数量
constunsignedintDINODE_START=4*BLOCK_SIZE;//inode起始位置
constunsignedintDINODE_SIZE=512;//inode大小
constunsignedintDINODE_NUM=32;//inode数量
constunsignedintDATASTART=(2+DINODE_NUM)*BLOCK_SIZE;//数据区的开始地址
constunsignedintACCOUNT_NUM=10;//用户数量
/*inode结构体*/
structinode{
unsignedshortdi_tag;/*inode标识*/
unsignedshortdi_number;/*关联文件数,当为0时表示删除文件,如一个目录至少包含两个文件:
"。
"和”.."*/
unsignedshortdi_mode;/*存取模式:
0为目录,1为文件*/
unsignedshortdi_userID;/*当前inode所属用户0为根目录ID,一次下去是管理员目录、用户目录*/
unsignedshortdi_access;/*访问权限0为不允许普通用户访问(公共目录),1为允许普通用户访问*/
unsignedshortdi_size;/*文件大小,目录没有大小,值为0*/
unsignedshortdi_ctime;/*创建时间*/
unsignedshortdi_mtime;/*最后一次修改时间*/
unsignedshortdi_block[DATA_BLOCK_NUM];/*数据块块地址编号*/
};
/**超级块***/
structsuper_block{
unsignedshorts_inodes_count;/*文件系统中inode的总数*/
unsignedshorts_blocks_count;/*数据块总数*/
unsignedshorts_r_blocks_count;/*保留块总数*/
unsignedshorts_free_blocks_count;//空闲块总数
unsignedshorts_free_inodes_count;/*空闲的inode总数*/
unsignedshorts_log_block_size;/*block的大小*/
};
/**账户信息**/
structuser{
unsignedshortuser_id;//用户ID
unsignedshortuser_access;//权限
stringusername;//用户名
stringpassword;//密码
};
/**文件/目录结构**/
structdirectory{
stringname;/*目录名*/
unsignedshortd_ino;/*目录号*/
};
三、所用仪器、材料(设备名称、型号、规格等).
计算机一台
四、实验方法、步骤
#include〈stdio。
h>
#include〈stdlib.h>
#include〈string.h〉
#include〈iostream。
h>
structOpenFileTable//打开文件表数据结构
{
longoffset;//当前文件读写指针
charfile_name[10];//文件名数组
longintfile_start;//文件起始块号
longintfile_length;//文件长度(字节)
};
structFCB_Block//FCB数据结构
{
intflag;//标志,—1表示未用,1表示文件用
charfile_name[10];//文件名数组
longintfile_date;//文件建立日期
longintfile_time;//文件建立时间
longintfile_start;//文件起始块号
longintfile_length;//文件长度(字节)
};
structSuper_Block//超级块数据结构,文件系统的分区信息,存放在0#物理块中
{
unsignedlongintfs_totalsize;//整个分区的总磁盘物理块数
unsignedlongintfs_freesize;//分区的所有空闲磁盘物理块数
unsignedintfs_blocksize;//文件系统的物理块大小(字节)
unsignedintfs_fat_start;//FAT的起始磁盘物理块号
unsignedintfs_fat_size;//FAT占用的磁盘物理块数
unsignedintfs_dir_start;//根目录的起始磁盘物理块号
unsignedintfs_dir_size;//根目录占用的磁盘物理块数
unsignedintfs_data_start;//数据区起始磁盘物理块号
unsignedlongintfs_data_size;//数据区的磁盘物理块数
};
constcharDiskName[]="FileSys。
dat”;//磁盘文件名
charrw_buffer[512];//读写使用的缓冲区
structFCB_Blockfilefcb[130];//读写目录使用的数据结构
structSuper_BlockFsSupBlk;//读写超级块使用的数据结构
longintfat_buffer[5000];//读写FAT使用的缓冲区,为简化在系统启动时全部装入内存,0为空闲
structOpenFileTableOFT[16];//打开文件表,当前只使用OFT[0]
unsignedintblock_size;//物理块大小(字节)
unsignedlonginttotal_disk_size;//磁盘总容量(物理块数)
unsignedinttotal_dir_size;//目录占有的物理块数
unsignedinttotal_fat_size;//FAT占有的物理块数
longintfind_fcb;//记录读FCB块的次数
FILE*fsPtr;//模拟磁盘的文件指针
/***********************磁盘块的申请***********************************/
unsignedlongintGet_Block(unsignedlongintcount)//分配count个物理快,返回首块指针,其它已经连接
{
unsignedlonginttmp,firstblk,tmpcount;
unsignedlonginti;
intflag=1;
if(count〉FsSupBlk。
fs_freesize)
{printf(”====没有足够磁盘容量,不能分配!
====\n");return0;}
tmpcount=0;
for(i=FsSupBlk.fs_data_start;i〈=FsSupBlk.fs_totalsize;i++)//建立分配链
{
if(fat_buffer[i]==0)//文件未占有,分配
{
if(flag==1)
{firstblk=i;flag=-1;}
else
{fat_buffer[tmp]=i;}
tmp=i;
fat_buffer[i]=-1;
tmpcount++;
if(tmpcount==count)//分配完成
{FsSupBlk。
fs_freesize=FsSupBlk。
fs_freesize-count;//减少可分配物理块
returnfirstblk;
}
}
}
return-1;//分配不成功
}
/***********************磁盘块的回收***********************************/
voidPut_Block(unsignedlongintaddr)
{unsignedlonginti,j;
intcount;
i=addr;count=