操作系统-实验报告-文件管理.pdf
《操作系统-实验报告-文件管理.pdf》由会员分享,可在线阅读,更多相关《操作系统-实验报告-文件管理.pdf(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、昆明理工大学信息工程与自动化学院学生实验报告昆明理工大学信息工程与自动化学院学生实验报告 201201201201学年学年 第第 二二学期学期 课程名称:操作系统课程名称:操作系统开课实验室:开课实验室:年年月月日日年级、年级、专业、专业、班班实验项目名称实验项目名称教教师师评评教师签名:教师签名:学号学号文件管理文件管理成绩成绩指导教师指导教师语语年年月月日日一、实验目的实验目的用 C 或 C+语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。二、实验原理及基本技术路线图方框原理图二、实验原理及基本技术路线图方框原理图用 C
2、 模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。功能设计功能设计:Helpdirexitcreate 文件名cdir 目录名read 文件名close文件名edit 文件名cd 目录名attr 文件名del 文件名rename 文件名显示命令帮助显示当前目录下的文件和文件夹退出系统创建文本文件创建文件夹读取一个文件最多可同时读取五个关闭一个文件编辑一个文件进子目录或者上级目录显示该文件的属性删除文件重命名-1-编辑功能流程图编辑功能流
3、程图-2-删除文件流程图删除文件流程图创建文件流程图创建文件流程图核心算法:bool Format(void);/格式化bool install(void);/装载虚拟硬盘的数据void login(void);/用户登陆-3-void showMenu(void);/显示功能菜单bool onAction(void);/用户选择功能并执行void createFile(string str);/创建文件bool read(string str);/读取文件void editFile(string str);/编辑文件void Delete(string str);/删除一个文件数据结构:始地
4、址/*inode 结构体*/struct inodeunsigned short di_tag;/*inode 标识*/*关联文件数,当为 0 时表示删除文件,如一个目录至少包含两个文件:.和.*/const unsigned int ACCOUNT_NUM=10;/用户数量/*-常变量-*/const unsigned int BLOCK_SIZE=512;/块长const unsigned int DATA_BLOCK_NUM=512;/数据块数量const unsigned int DINODE_START=4*BLOCK_SIZE;/inode 起始位置const unsigned i
5、nt DINODE_SIZE=512;const unsigned int DINODE_NUM=32;/inode 大小/inode 数量const unsigned int DATASTART=(2+DINODE_NUM)*BLOCK_SIZE;/数据区 的开unsigned short di_number;unsigned short di_mode;/*存取模式:0 为目录,1 为文件*/unsigned short di_userID;/*当前 inode 所属用户 0 为根目录 ID,一次下去是管理员目-4-录、用户目录*/unsigned short di_access;/*访问
6、权限 0 为不允许普通用户访问(公共目录),1 为允许普通用户访问*/;unsigned short di_size;/*文件大小,目录没有大小,值为 0*/unsigned short di_ctime;/*创建时间*/unsigned short di_mtime;/*最后一次修改时间*/unsigned short di_blockDATA_BLOCK_NUM;/*数据块块地址编号*/*超级块*/struct super_block;/*账户信息*/struct user;/*文件/目录结构*/struct directory-5-unsigned short s_inodes_coun
7、t;/*文件系统中 inode 的总数*/unsigned short s_blocks_count;/*数据块总数*/unsigned short s_r_blocks_count;/*保留块总数*/unsigned short s_free_blocks_count;/空闲块总数unsigned short s_free_inodes_count;/*空闲的 inode 总数*/unsigned short s_log_block_size;/*block 的大小*/unsigned short user_id;/用户 IDunsigned short user_access;/权限str
8、ing username;string password;/用户名/密码;string name;/*目录名*/unsigned short d_ino;/*目录号*/三、所用仪器、材料设备名称、型号、规格等三、所用仪器、材料设备名称、型号、规格等。电脑一台四、实验方法、步骤四、实验方法、步骤#include#include#include#includestruct OpenFileTablelongoffset;char file_name10;long int file_start;long int file_length;struct FCB_Blockintflag;/打开文件表数据
9、结构/当前文件读写指针/文件名数组/文件起始块号/文件长度字节/FCB 数据结构/标志,-1 表示未用,1 表示文件用-6-char file_name10;/文件名数组long int file_date;/文件建立日期long int file_time;/文件建立时间;struct Super_Block/超级块数据结构,文件系统的分区信息,存放在 0#物理块中unsigned long int fs_totalsize;/整个分区的总磁盘物理块数unsigned long int fs_freesize;/分区的所有空闲磁盘物理块数unsigned int fs_blocksize;/
10、文件系统的物理块大小字节unsigned int fs_fat_start;/FAT的起始磁盘物理块号unsigned int fs_fat_size;/FAT占用的磁盘物理块数unsigned int fs_dir_start;/根目录的起始磁盘物理块号unsigned int fs_dir_size;/根目录占用的磁盘物理块数unsigned int fs_data_start;/数据区起始磁盘物理块号unsigned long int fs_data_size;/数据区的磁盘物理块数long int file_start;/文件起始块号long int file_length;/文件长度
11、字节;const char DiskName=FileSys.dat;/磁盘文件名char rw_buffer512;/读写使用的缓冲区struct FCB_Block filefcb130;/读写目录使用的数据结构-7-struct Super_Block FsSupBlk;/读写超级块使用的数据结构long int fat_buffer5000;/读写 FAT使用的缓冲区,为简化在系统启动时全部装入内存,0 为空闲struct OpenFileTable OFT16;/打开文件表,当前只使用 OFT0unsigned int block_size;/物理块大小字节unsigned long
12、 int total_disk_size;/磁盘总容量物理块数unsigned int total_dir_size;/目录占有的物理块数unsigned int total_fat_size;/FAT占有的物理块数long int find_fcb;/记录读 FCB 块的次数FILE*fsPtr;/模拟磁盘的文件指针/*磁盘块的申请*/unsigned long int Get_Block(unsigned long int count)/分配 count 个物理快,返回首块指针,其它已经连接unsigned long int tmp,firstblk,tmpcount;unsigned l
13、ong int i;int flag=1;if(count FsSupBlk.fs_freesize)-8-printf(=没有足够磁盘容量,不能分配!=n);return 0;tmpcount=0;for(i=FsSupBlk.fs_data_start;iFsSupBlk.fs_totalsize)printf(=超出磁盘容量,不能读!=n);return;count+;i=j;fread(buf,512,1,fsPtr);-10-return;/*写磁盘块*/void Write_Block(unsigned long int addr,char*buf)fseek(fsPtr,FsSu
14、pBlk.fs_blocksize*addr,SEEK_SET);if(addrFsSupBlk.fs_totalsize)printf(=超出磁盘容量,不能写!=n);return;fwrite(buf,512,1,fsPtr);/*格式化磁盘*/void Real_Format()unsigned long int bcount;return;long int fatval,i;/更改系统超级块信息char*c;FsSupBlk.fs_totalsize=total_disk_size;FsSupBlk.fs_blocksize=block_size;FsSupBlk.fs_dir_sta
15、rt=1;FsSupBlk.fs_dir_size=total_dir_size;FsSupBlk.fs_fat_start=total_dir_size+1;-11-FsSupBlk.fs_fat_size=total_fat_size;FsSupBlk.fs_data_start=FsSupBlk.fs_fat_start+FsSupBlk.fs_fat_size;FsSupBlk.fs_data_sizeFsSupBlk.fs_fat_size-1;FsSupBlk.fs_freesize=FsSupBlk.fs_data_size;/初始化 FAT/初始化目录for(i=0;i128;
16、i+)filefcbi.flag=-1;/为-1 表示 FCB 未使用fseek(fsPtr,512L,SEEK_SET);fwrite(&filefcb0,sizeof(struct FCB_Block),128,fsPtr);=FsSupBlk.fs_totalsize-FsSupBlk.fs_dir_size-fatval=FsSupBlk.fs_fat_start*512;fseek(fsPtr,fatval,SEEK_SET);/定位文件指针bcount=FsSupBlk.fs_fat_size+FsSupBlk.fs_dir_size+1;for(i=0;ibcount;i+)fa
17、t_bufferi=-1;/标记已经使用的磁盘数据块,即 FAT区、目录区和启动区-12-for(;iFsSupBlk.fs_totalsize;i+)fat_bufferi=0;/为 0 表示为空的物理快fwrite(&fat_buffer0,sizeof(long int),FsSupBlk.fs_totalsize,fsPtr);/初始化数据区for(i=0;i512;i+)rw_bufferi=;/缓冲区清空for(i=FsSupBlk.fs_data_start;iFsSupBlk.fs_totalsize;i+)Write_Block(i,rw_buffer);/缓冲区写入第 i
18、块/*新建系统磁盘文件*/void Create_Disk()/建立磁盘文件total=total_disk_size;for(i=0;itotal;i+)/建立大小为 total 的磁盘文件-13-long int i;unsigned long int total;fsPtr=fopen(DiskName,wb+);if(fsPtr=NULL)printf(不能建立磁盘所需的文件!n);exit(0);fwrite(rw_buffer,512,1,fsPtr);fclose(fsPtr);fsPtr=fopen(DiskName,rb+);Real_Format();return;/*读写
19、系统超级块信息*/void Read_Boot()/读取磁盘超级块数据信息rewind(fsPtr);void FileBoot()/超级块数据信息存盘rewind(fsPtr);fread(&FsSupBlk,sizeof(struct Super_Block),1,fsPtr);return;fwrite(&FsSupBlk,sizeof(struct Super_Block),1,fsPtr);return;-14-/*FAT操作*/void LoadFat()/装载全部 FAT到内存fseek(fsPtr,FsSupBlk.fs_fat_start*512,SEEK_SET);void
20、 SaveFat()/FAT到文件 FAT区/*显示超级块信息*/void boot_dis()printf(FsSupBlk.fs_totalsize=%ldn,FsSupBlk.fs_totalsize);printf(FsSupBlk.fs_blocksize=%dn,FsSupBlk.fs_blocksize);printf(FsSupBlk.fs_dir_start=%dn,FsSupBlk.fs_dir_start);printf(FsSupBlk.fs_dir_size=%dn,FsSupBlk.fs_dir_size);-15-fread(fat_buffer,sizeof(l
21、ong int),FsSupBlk.fs_totalsize,fsPtr);return;fseek(fsPtr,FsSupBlk.fs_fat_start*512,SEEK_SET);fwrite(fat_buffer,sizeof(long int),FsSupBlk.fs_totalsize,fsPtr);return;printf(FsSupBlk.fs_fat_start=%dn,FsSupBlk.fs_fat_start);printf(FsSupBlk.fs_fat_size=%dn,FsSupBlk.fs_fat_size);printf(FsSupBlk.fs_data_st
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 文件 管理
限制150内