2024年4月29日发(作者:)
昆明理工大学信息工程与自动化学院学生实验报告
( 2011 —2012 学年 第 二 学期 )
一、实验目的
用c或c++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而对各
种文件操作命令的实质内容和执行过程有比较深入的了解。
二、实验原理及基本技术路线图(方框原理图)
用c模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文
件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、
重命名、复制、移动等功能,并对文件有一定的存取权限控制。
请加上程序功能结构图、流程图、数据结构定义、主要变量的说明、函数的说明等
流程图:
主要数据结构
界面采用vc6 mfc环境开发
#define maxfile 20 //每个用户最多保存20个文件 #define maxuser 10 //假想
文件系统最多支持的人数 #define blocksize 32 //虚拟磁盘中物理块为每块32字节
#define disksize blocksize*1000 //虚拟磁盘容量为1000*32=32k struct ufd //
说明文件项的结构数组 { 节
};
struct mfd { };
struct headblock { };
struct block //虚拟磁盘的物理块数据结构 {
byte pstack; //堆栈指针
short pblock[10]; //块号 pblock[10]是下一个盘块号逻辑地址 char username[10];
//主目录用户名 bool isexist; //该用户否存在 ufd ufd[maxfile]; //用户文件数
组 ushort nitem;//ufd个数 char filename[15];
char time[16]; //文件建立或修改时间 如2003/5/6 12:00 bool isexist;
//文件是否存在,删除时标为0
bool isshared; //共享标记,共享文件可被其它用户所访问 bool attrread;
//文件是否可读 bool attrwrite; //文件是否可写 bool attrexecute; //文件是否
可执行
htreeitem treenode; //用于树控件显示的结点句柄 ushort filelen; //文件占用
字节数 ushort blocknum; //文件占用的物理块数
ushort filelink[100];//文件物理块地址数组,每块32字节,限定一个文件最大
100*32=3200字
union{ };
struct fat { };
//空闲块成组链接法
bool openlist[maxuser][maxfile]; //描述文件是否打开的布尔型数组 fat filefat;
//描述文件记录项的fat结构
cfile fatio; //负责和打交道的文件句柄 cstring
currentuser; //当前登录的用户名 int currentid;
//前前登录的用户标识号
block superblock; //超级块,指示第一个空闲块逻辑号 ushort maxopen;
//该用户同时可打开的最大文件数 ushort usernum; //最户数
mfd mfd[maxuser]; //最多可支持10个用户 byte block[32]; //一块
为32字节 headblock headinfo; };
说明:本实验采用模拟文件结构的方法,把记录用户帐号,用户文件和磁盘块的信息用
当前目录下的
来记录,可以把看成是一个虚拟的磁盘,其头部是fat结构,用
来记录各个用户和文件信息,紧接着是空闲块成组链接法的数据结构,每块32字节,每组
10块,共1000块,也就是说,用户文件数据的总容量是32*1000字节,如果程序当前目录
下找不到用于做实验用的,在登录时程序会提示是否“格式化虚拟磁盘”也就是新
建一个文件,接着,程序会显示“用户管理”的窗口,此时应新建几个帐号用于
登录做实验。
登录后,程序会显示该用户的所有文件,右方的文件列表会显示每个文件的属性信息,
和windows的“资源管理器”相似。用鼠标双击列表的每个文件就可以查看文件的内容。单
击“新建文件”按钮可以创建一个新的用户文件。
选中某个文件后,就可以进行相应的操作,如“修改文件”、“删除文件”或是“打开文
件”,删除某个文件时检查该文件的属性,如果是只读的,就是显示警告窗口让用户确认是否
一定要删除。
硬盘工具可以用图形方式显示“磁盘”块的详细情况,空白块说明该块没有使用,暗红
色的说明块已分配,窗口还统计占用的空间大小、用户数等信息。
程序中用到的结构图如下图所示:
mfd
三、所用仪器、材料(设备名称、型号、规格等)。 计算机一台
四、实验方法、步骤
void cdlguser::onadduser() {
updatedata(true);
if (m>=10) {
afxmessagebox(用户数量已达到最大10个,你可以删除一些无用的帐号!); return; }
for(int i=0;i<10;i++)
{
if([i].isexist==false) {
wsprintf([i].username,m_username);
} }
m++;
writefat();
readfat();
showuser();//显示现有的用户列表 m_(); updatedata(false);
}
bool readblock(int id, block* buffer) //读指定块号内容(32字节)到buffer所指
向的单元 {
if(!fatio) return false; //如果虚拟磁盘文件句柄为空,出错返回
if(!(sizeof(fat)+(id-1)*blocksize,cfile::begin)) return false;//移
动文件指针到指定块号 if((buffer,blocksize)!=blocksize) return false;//
读该块的内容到buffer指定的单元 return true; }
bool writeblock(int id, block* buffer) //把buffer所指向的单元的内容(32字节)
写到指定的物理块中 {
发布评论