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

  • 格式:doc
  • 大小:844.50 KB
  • 文档页数:33

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

( 201 —201 学年 第 二 学期 )

课程名称:操作系统 开课实验室: 年 月 日

年级、专业、班 学号 姓名 成绩

实验项目名称 文件管理 指导教师

教师评语

教师签名:

年 月 日

一、实验目的

用C或C++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。

二、实验原理及基本技术路线图(方框原理图)

用C模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。

功能设计 :

Help 显示命令帮助

dir 显示当前目录下的文件和文件夹

exit 退出系统

create [文件名] 创建文本文件

cdir [目录名] 创建文件夹

read [文件名] 读取一个文件最多可同时读取五个

close[文件名] 关闭一个文件

edit [文件名] 编辑一个文件

cd [目录名] 进子目录或者上级目录

attr [文件名] 显示该文件的属性

del [文件名] 删除文件

rename [文件名] 重命名

-2-

编辑功能流程图 -3-

删除文件流程图 创建文件流程图

核心算法:

bool Format(void); //格式化

bool install(void); //装载虚拟硬盘的数据

void login(void); /用户登陆 -4- 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_BLOCK_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{

unsigned short di_tag; /*inode标识*/

unsigned short di_number; /*关联文件数,当为0时表示删除文件,如一个目录至少 包含两个文件:"."和".."*/

unsigned short di_mode; /*存取模式:0为目录,1为文件*/

unsigned short di_userID; /*当前inode所属用户 0为根目录ID,一次下去是管理员目 -5- 录、用户目录*/

unsigned short di_access; /*访问权限 0为不允许普通用户访问(公共目录),1为允许 普通用户访问*/

unsigned short di_size; /*文件大小,目录没有大小,值为0*/

unsigned short di_ctime; /* 创建时间 */

unsigned short di_mtime; /* 最后一次修改时间*/

unsigned short di_block[DATA_BLOCK_NUM]; /* 数据块块地址编号 */

};

/**超级块***/

struct super_block{

unsigned short s_inodes_count; /* 文件系统中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 的大小 */

};

/**账户信息**/

struct user{

unsigned short user_id; //用户ID

unsigned short user_access; //权限

string username; //用户名

string password; //密码

};

/**文件/目录结构**/

struct directory{ -6- string name; /*目录名*/

unsigned short d_ino; /*目录号*/

};

三、所用仪器、材料(设备名称、型号、规格等)。

计算机一台

四、实验方法、步骤

#include

#include

#include

#include

struct OpenFileTable //打开文件表数据结构

{

long offset; // 当前文件读写指针

char file_name[10]; // 文件名数组

long int file_start; // 文件起始块号

long int file_length; // 文件长度(字节)

};

struct FCB_Block //FCB数据结构

{

int flag; // 标志,-1表示未用,1表示文件用 -7- char file_name[10]; // 文件名数组

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_freesize; // 分区的所有空闲磁盘物理块数

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_size; // 数据区的磁盘物理块数

};

const char DiskName[]="FileSys.dat"; //磁盘文件名

char rw_buffer[512]; // 读写使用的缓冲区

struct FCB_Block filefcb[130]; // 读写目录使用的数据结构 -8- struct Super_Block FsSupBlk; // 读写超级块使用的数据结构

long int fat_buffer[5000]; // 读写FAT使用的缓冲区,为简化在系统启动时全部装入内存,0为空闲

struct OpenFileTable OFT[16]; // 打开文件表,当前只使用OFT[0]

unsigned int block_size; // 物理块大小(字节)

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 long int tmp,firstblk,tmpcount;

unsigned long int i;

int flag=1;

if (count > FsSupBlk.fs_freesize)