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字节)

写到指定的物理块中 {