1、操作系统 实验报告 文件管理昆明理工大学信息工程与自动化学院学生实验报告( 201 201 学年 第 二 学期 )课程名称:操作系统 开课实验室: 年 月 日年级、专业、班 学号 姓名 成绩实验项目名称文件管理指导教师 教师评语 教师签名: 年 月 日一、实验目的用C或C+语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。二、实验原理及基本技术路线图(方框原理图)用C模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复
2、制、移动等功能,并对文件有一定的存取权限控制。功能设计 : Help 显示命令帮助 dir 显示当前目录下的文件和文件夹 exit 退出系统 create 文件名 创建文本文件 cdir 目录名 创建文件夹 read 文件名 读取一个文件最多可同时读取五个 close文件名 关闭一个文件 edit 文件名 编辑一个文件 cd 目录名 进子目录或者上级目录 attr 文件名 显示该文件的属性 del 文件名 删除文件 rename 文件名 重命名 编辑功能流程图 删除文件流程图 创建文件流程图核心算法: bool Format(void); /格式化 bool install(void); /装
3、载虚拟硬盘的数据 void login(void); /用户登陆 void showMenu(void);/显示功能菜单 bool onAction(void);/用户选择功能并执行 void createFile(string str);/创建文件 bool read(string str);/读取文件 void editFile(string str);/编辑文件 void Delete(string str);/删除一个文件数据结构: /*-常变量-*/ const unsigned int BLOCK_SIZE=512; /块长 const unsigned int DATA_BLOC
4、K_NUM=512; /数据块数量 const unsigned int DINODE_START=4*BLOCK_SIZE; /inode起始位置 const unsigned int DINODE_SIZE=512; /inode大小 const unsigned int DINODE_NUM=32; /inode数量 const unsigned int DATASTART=(2+DINODE_NUM)*BLOCK_SIZE; /数据区的开始地址 const unsigned int ACCOUNT_NUM=10; /用户数量 /*inode结构体*/ struct inode unsi
5、gned short di_tag; /*inode标识*/ unsigned short di_number; /*关联文件数,当为0时表示删除文件,如一个目录至少 包含两个文件:.和.*/ unsigned short di_mode; /*存取模式:0为目录,1为文件*/ unsigned short di_userID; /*当前inode所属用户 0为根目录ID,一次下去是管理员目 录、用户目录*/ unsigned short di_access; /*访问权限 0为不允许普通用户访问(公共目录),1为允许 普通用户访问*/ unsigned short di_size; /*文件
6、大小,目录没有大小,值为0*/ unsigned short di_ctime; /* 创建时间 */ unsigned short di_mtime; /* 最后一次修改时间*/ unsigned short di_blockDATA_BLOCK_NUM; /* 数据块块地址编号 */;/*超级块*/struct super_block unsigned short s_inodes_count; /* 文件系统中inode的总数 */ unsigned short s_blocks_count; /* 数据块总数 */ unsigned short s_r_blocks_count; /*
7、 保留块总数 */ unsigned short s_free_blocks_count; / 空闲块总数 unsigned short s_free_inodes_count; /* 空闲的inode总数 */ unsigned short s_log_block_size; /* block 的大小 */;/*账户信息*/struct user unsigned short user_id; /用户ID unsigned short user_access; /权限 string username; /用户名 string password; /密码;/*文件/目录结构*/struct d
8、irectory string name; /*目录名*/ unsigned short d_ino; /*目录号*/;三、所用仪器、材料(设备名称、型号、规格等)。计算机一台四、实验方法、步骤#include #include#include#includestruct OpenFileTable /打开文件表数据结构 long offset; / 当前文件读写指针 char file_name10; / 文件名数组 long int file_start; / 文件起始块号 long int file_length; / 文件长度(字节);struct FCB_Block /FCB数据结构
9、 int flag; / 标志,-1表示未用,1表示文件用 char file_name10; / 文件名数组 long int file_date; / 文件建立日期 long int file_time; / 文件建立时间 long int file_start; / 文件起始块号 long int file_length; / 文件长度(字节);struct Super_Block / 超级块数据结构, 文件系统的分区信息,存放在0#物理块中 unsigned long int fs_totalsize; / 整个分区的总磁盘物理块数 unsigned long int fs_frees
10、ize; / 分区的所有空闲磁盘物理块数 unsigned int fs_blocksize; / 文件系统的物理块大小(字节) 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_s
11、ize; / 数据区的磁盘物理块数 ;const char DiskName=FileSys.dat; /磁盘文件名char rw_buffer512; / 读写使用的缓冲区struct FCB_Block filefcb130; / 读写目录使用的数据结构struct Super_Block FsSupBlk; / 读写超级块使用的数据结构long int fat_buffer5000; / 读写FAT使用的缓冲区,为简化在系统启动时全部装入内存,0为空闲struct OpenFileTable OFT16; / 打开文件表,当前只使用OFT0unsigned int block_size;
12、 / 物理块大小(字节)unsigned long 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 lon
13、g int tmp,firstblk,tmpcount; unsigned long int i; int flag=1; if (count FsSupBlk.fs_freesize) printf( = 没有足够磁盘容量,不能分配!= n); return 0; tmpcount=0; for(i=FsSupBlk.fs_data_start;iFsSupBlk.fs_totalsize) printf( = 超出磁盘容量,不能读!= n); return; fseek(fsPtr,FsSupBlk.fs_blocksize*addr,SEEK_SET); fread(buf,512,1,
14、fsPtr); return;/* 写磁盘块*/ void Write_Block(unsigned long int addr,char *buf) if (addrFsSupBlk.fs_totalsize) printf( = 超出磁盘容量,不能写!= n); return; fseek(fsPtr,FsSupBlk.fs_blocksize*addr,SEEK_SET); fwrite(buf,512,1,fsPtr); return;/* 格式化磁盘*/ void Real_Format() unsigned long int bcount; long int fatval,i; c
15、har *c; /更改系统超级块信息 FsSupBlk.fs_totalsize=total_disk_size; FsSupBlk.fs_blocksize=block_size; FsSupBlk.fs_dir_start=1; FsSupBlk.fs_dir_size=total_dir_size; FsSupBlk.fs_fat_start=total_dir_size+1; FsSupBlk.fs_fat_size=total_fat_size; FsSupBlk.fs_data_start=FsSupBlk.fs_fat_start+FsSupBlk.fs_fat_size; Fs
16、SupBlk.fs_data_size = FsSupBlk.fs_totalsize - FsSupBlk.fs_dir_size - FsSupBlk.fs_fat_size-1; FsSupBlk.fs_freesize= FsSupBlk.fs_data_size; /初始化目录 for(i=0;i128;i+) filefcbi.flag=-1; /为-1表示FCB未使用 fseek(fsPtr,512L,SEEK_SET); fwrite(&filefcb0,sizeof(struct FCB_Block),128,fsPtr); /初始化FAT fatval=FsSupBlk.f
17、s_fat_start*512; fseek(fsPtr,fatval,SEEK_SET); /定位文件指针 bcount=FsSupBlk.fs_fat_size+FsSupBlk.fs_dir_size+1; for(i=0;ibcount;i+) fat_bufferi=-1; /标记已经使用的磁盘数据块,即FAT区、目录区和启动区 for(;iFsSupBlk.fs_totalsize;i+) fat_bufferi=0; /为0表示为空的物理快 fwrite(&fat_buffer0,sizeof(long int),FsSupBlk.fs_totalsize,fsPtr); /初始
18、化数据区 for(i=0;i512;i+) rw_bufferi= ;/缓冲区清空 for(i=FsSupBlk.fs_data_start;iFsSupBlk.fs_totalsize;i+) Write_Block(i,rw_buffer); /缓冲区写入第i块 /*新建系统磁盘文件 */ void Create_Disk() long int i; unsigned long int total; fsPtr=fopen(DiskName,wb+); if(fsPtr=NULL) printf( 不能建立磁盘所需的文件 !n); exit(0); / 建立磁盘文件 total=total
19、_disk_size; for(i=0;itotal;i+) /建立大小为total的磁盘文件 fwrite(rw_buffer,512,1,fsPtr); fclose(fsPtr); fsPtr=fopen(DiskName,rb+); Real_Format(); return;/*读写系统超级块信息*/ void Read_Boot() /读取磁盘超级块数据信息 rewind(fsPtr); fread(&FsSupBlk,sizeof(struct Super_Block),1,fsPtr); return; void FileBoot() /超级块数据信息存盘 rewind(fsP
20、tr); fwrite(&FsSupBlk,sizeof(struct Super_Block),1,fsPtr); return; /*FAT操作*/ void LoadFat() /装载全部FAT到内存 fseek(fsPtr,FsSupBlk.fs_fat_start*512,SEEK_SET); fread(fat_buffer,sizeof(long int),FsSupBlk.fs_totalsize ,fsPtr); return; void SaveFat() /FAT到文件FAT区 fseek(fsPtr,FsSupBlk.fs_fat_start*512,SEEK_SET)
21、; fwrite(fat_buffer,sizeof(long int),FsSupBlk.fs_totalsize,fsPtr); return; /*显示超级块信息*/ 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_si
22、ze=%dn,FsSupBlk.fs_dir_size); printf(FsSupBlk.fs_fat_start=%dn,FsSupBlk.fs_fat_start); printf(FsSupBlk.fs_fat_size=%dn,FsSupBlk.fs_fat_size); printf(FsSupBlk.fs_data_start=%dn,FsSupBlk.fs_data_start); printf(FsSupBlk.fs_data_size=%ldn,FsSupBlk.fs_data_size); printf(FsSupBlk.fs_freesize=%ldn,FsSupBlk
23、.fs_freesize); /*系统初始化*/ void Sys_Init() /初始化 fsPtr=fopen(DiskName,rb+); if(fsPtr = NULL) Create_Disk(); Read_Boot(); /boot_dis(); LoadFat(); return; /*显示操作*/ void dir() /显示目录下的文件 int i,countFile=0; char str16; long int n,pos_dir,pos_fat; coutendl; pos_dir=FsSupBlk.fs_dir_start*512; pos_fat=FsSupBlk
24、.fs_fat_start*512; fseek(fsPtr,pos_dir,SEEK_SET); while(ftell(fsPtr)pos_fat) fread(&filefcb0,sizeof(struct FCB_Block),16 ,fsPtr); for(i=0;i16;i+) if(filefcbi.flag = 1) /文件占有 countFile+; n = filefcbi.file_length; printf( %-15s%15d bytesn, filefcbi.file_name,file,n); coutendl; printf( 总共有 %d 个文件n,countFile); printf( 系统总共有 %ld 个物理块可用nn,FsSupBlk.fs_freesize); /*查找文件*/ /查找文件,文件存在返回当前FCB数组下标,否则返回-1int Find_File(char *filename) int i; long int pos_dir,pos_fat
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1