操作系统 实验报告 文件管理.docx

上传人:b****4 文档编号:616420 上传时间:2022-10-11 格式:DOCX 页数:27 大小:229.80KB
下载 相关 举报
操作系统 实验报告 文件管理.docx_第1页
第1页 / 共27页
操作系统 实验报告 文件管理.docx_第2页
第2页 / 共27页
操作系统 实验报告 文件管理.docx_第3页
第3页 / 共27页
操作系统 实验报告 文件管理.docx_第4页
第4页 / 共27页
操作系统 实验报告 文件管理.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

操作系统 实验报告 文件管理.docx

《操作系统 实验报告 文件管理.docx》由会员分享,可在线阅读,更多相关《操作系统 实验报告 文件管理.docx(27页珍藏版)》请在冰豆网上搜索。

操作系统 实验报告 文件管理.docx

操作系统实验报告文件管理

昆明理工大学信息工程与自动化学院学生实验报告

(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

#include

#include

#include

 

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=0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1