操作系统实验报告 文件管理系统源程序文档格式.docx

上传人:b****2 文档编号:5188880 上传时间:2023-05-04 格式:DOCX 页数:52 大小:191.16KB
下载 相关 举报
操作系统实验报告 文件管理系统源程序文档格式.docx_第1页
第1页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第2页
第2页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第3页
第3页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第4页
第4页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第5页
第5页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第6页
第6页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第7页
第7页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第8页
第8页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第9页
第9页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第10页
第10页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第11页
第11页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第12页
第12页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第13页
第13页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第14页
第14页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第15页
第15页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第16页
第16页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第17页
第17页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第18页
第18页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第19页
第19页 / 共52页
操作系统实验报告 文件管理系统源程序文档格式.docx_第20页
第20页 / 共52页
亲,该文档总共52页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验报告 文件管理系统源程序文档格式.docx

《操作系统实验报告 文件管理系统源程序文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告 文件管理系统源程序文档格式.docx(52页珍藏版)》请在冰点文库上搜索。

操作系统实验报告 文件管理系统源程序文档格式.docx

Del

删除文件或目录。

查找当前目录是否有该文件名,没有则退出,有则调用access()判断是否有权限,有则判断是否为系统文件,是则无法删除,不是则判断是否是文件,是文件则直接删除,不是则判断是否文件夹,是文件夹则判断该文件夹下是否有文件,有文件则无法删除。

提示用户是否删除,确认则删除文件,修改当前文件夹目录和硬盘空间结构,修改超级块,写入模拟硬盘。

Dir

列文件目录(列出文件名、物理地址、保护码和文件长度)

2.实验原理

文件系统管理中用到的数据结构有:

(1)首先应确定文件系统的数据结构:

主目录、子目录及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

(2)用户创建的文件,可以编号存储于磁盘上。

如:

file0,file1,file2…并以编号作为物理地址,在目录中进行登记。

3、实验要求

(1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。

(2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。

另外,为打开文件设置了运行文件目录(AFD)。

(3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。

(4)文件保护简单使用了三位保护码:

允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。

二、实验的目的及意义

课程设计目的使学生熟悉文件管理系统的设计方法;

加深对所学各种文件操作的了解及其操作方法的特点。

通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。

同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。

三、详细设计

3.1功能设计

Help显示命令帮助

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

logout注销

exit退出系统

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

cdir[目录名]创建文件夹

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

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

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

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

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

del[文件名]删除文件

rename[文件名]重命名

3.2结构设计

1)总设计结构图

2)目录结构示意图

3)流程图

编辑功能流程图创建文件流程图

删除文件功能流程图

3.3核心算法

boolFormat(void);

//格式化

boolinstall(void);

//装载虚拟硬盘的数据

voidlogin(void);

/用户登陆

voidshowMenu(void);

//显示功能菜单

boolonAction(void);

//用户选择功能并执行

voidshowDir();

//显示当前文件夹里面文件的信息

voidlogout();

//注销

voidcreateFile(stringstr);

//创建文件

voidcreateDir(stringstr);

//创建文件夹

boolread(stringstr);

//读取文件

voideditFile(stringstr);

//编辑文件

intvisit(stringstr);

//打开一个文件夹

voidattrib(stringstr);

//显示文件属性

voidDelete(stringstr);

//删除一个文件

intrename(stringstr);

//重命名一个文件

3.4数据结构

/*---------常变量------*/

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;

/*目录号*/

四、调试分析

4.1运行环境

编译平台:

MicrosoftVisualStudio2010

运行平台:

win7/xp

4.2调试分析

五、缺点及改进

5.1实验缺点

由于对Linux的文件系统理解不够深刻,导致程序在一些原理上的迷糊不清,而时间较短,因此采取了简化或者放开的方法。

在写程序的开始,也没有做详细的规划,而且是四个人分工协作,因此在程序的结构上有些混乱。

在后期做了一些调整,但是整体还是有缺陷的。

另外,程序只是很简单的模拟了Linux的文件管理系统,只有一些非常简单的功能,而且功能考虑的也不尽全面、严谨,难免会出现一些Bug,另外,我们整体在写的时候是用的C++的写法,但是在编写的时候,又混用了c的一些方法,所以,整个程序更加混乱,给阅读理解带来非常大的困难。

5.2实验改进

首先,我们先要把一些原理知识搞清楚,其次,做一个统一的项目规划,做好一些定义的声明,结构再清晰一些。

更深层次的模拟Linux文件管理系统,将一些函数的考虑更加严谨、全面,多次调试,减少一些bug。

尽量用规范的C++语言才编写,注清函数功能,便于相互分享调用阅读。

六、实验总结

本实验是模拟Linux文件管理系统,而我们平时很少接触到Linux系统,只是在书上学了一些理论的皮毛,纸上得来总觉浅,因此在开始做的时候,感觉无从下手,只能去网上去查找一些相关知识,以及看老师给的例子,并且和其他组就行讨论,这个时间花了一天半的时间,但是成果不是很好,很多地方都不明白。

但是时间紧迫,我们就边做边理解、讨论,这样造成一个非常大的困难,不知道从哪里下手,只能模仿着做,加深理解。

在两天的仓促的时间里面,我们做出了一个简单可行的模拟文件系统,虽然问题不少,但是在时间的允许下,我们还是不错的。

在编程中,我们遇到了很多以前没有遇到的问题和知识,在通过相互讨论,上网查询等方法后,我们解决了大部分的问题,对C++语言的理解也加深了很多,对一个项目的需求也理解很多,一个合理的规划会提高不少效率。

七、参考文献

《C++程序设计》清华大学出版社谭浩强

《算法与数据结构(第二版)》高等教育出版社张乃孝

《操作系统教程(第四遍)》高等教育出版社孙钟秀

8.2源程序

#include<

iostream>

string>

stdio.h>

usingnamespacestd;

constunsignedintDINODE_NUM=512;

constunsignedintDATA_START=(2+DINODE_NUM)*BLOCK_SIZE;

constunsignedintDIRECTORY_NUM=12;

//每个目录最多允许拥有的子目录和文件

constunsignedshortFILE_NAME_LENGTH=20;

//最大文件名长度

/**************************

inode结构体

**************************/

unsignedshortdi_number;

unsignedshortdi_block;

/*————————————————————————

超级块结构

————————————————————————*/

unsignedshorts_inodes_count;

unsignedshorts_free_inodes_count;

/*空闲的inode总数*/

unsignedshorts_blocks_count;

/*块总数*/

unsignedshorts_r_blocks_count;

unsignedshorts_free_blocks_count;

unsignedshorts_log_block_size;

//unsignedshorts_free_blocks_group[GROUPNUM];

//新增一个数组来记录每个数据块组中的空闲数据块计数

//unsignedshorts_first_data_block;

/*第一个数据block*/

//unsignedshorts_blocks_per_group;

/*每blockgroup的block数量*/

//unsignedshorts_inodes_per_group;

/*每blockgroup的inode数量*/

账户信息

//用户ID

//权限1为管理员0为平民

文件、目录项结构

stringname;

/*目录、文件名*/

stringcontent;

/*文件数据,目录则没有数据*/

unsignedshortd_ino;

/*目录、文件号*/

/*----变量--------*/

unsignedshortdi_bitmap[DINODE_NUM];

//硬盘inode节点位图1表示已使用0表示未使用

unsignedshortbk_bitmap[DATA_BLOCK_NUM];

//数据块block位图

structsuper_blocksuperBlock;

//超级块

structuseraccount[ACCOUNT_NUM];

//共创建ACCOUNT_NUM个账户

FILE*f_stream;

//文件指针

structinode*cur_inode;

//inode当前目录指针

structinode*inode_temp;

//inode临时指针

constchardiskName[30]="

ext2forlinux.disk"

;

//模拟硬盘的文件名

structdirectorydir_buf[DIRECTORY_NUM];

//目录数组,每个目录最多允许有12个项(子目录或者文件)

stringcur_Path;

//cmd的头表示所在哪个文件夹

//inti_lock=0;

//inode位图锁可能会多线程

//intb_lock=0;

//block位图锁

structuser*cur_user;

//当前用户

structdirectorycur_dir[DIRECTORY_NUM];

//当前目录

/**********************

函数声明

********************/

//此函数用于格式化

//此函数用于装载虚拟硬盘的数据

intFindFile(stringfilename);

//次函数用于查找当前文件夹是否有该文件

boolaccess(structinode*pinode);

//权限判断

intmain(){

voidlogin(void);

//此函数用于用户登陆

voidshowMenu(void);

//此函数用于显示功能菜单

boolonAction(void);

//此函数用于用户选择功能并执行

charformat_bool;

/**************初始化************/

cout<

<

系统已启动,是否初始化所有数据?

\tY/N"

endl;

while(true){

cin>

>

format_bool;

if(format_bool=='

y'

||format_bool=='

Y'

){

if(!

Format())return0;

break;

}

elseif(format_bool=='

n'

N'

cout<

不初始化不能开始!

continue;

else{

请输入Y或者N"

}

}

初始化成功!

/********转载虚拟硬盘数据***********/

if(!

install()){

cout<

加载失败,无效的硬盘格式"

//main();

return0;

elsecout<

加载disk成功!

cur_Path=cur_dir[1].name+"

\\root"

/*******登陆**********/

login();

/**显示菜单**/

showMenu();

/**显示当前路径**/

cur_Path;

while(onAction());

return0;

}

/*此函数用于格式化*/

boolFormat(){

//创建文件

f_stream=fopen(diskName,"

wb+"

);

if(f_stream==NULL){

创建文件失败"

returnfalse;

//初始化超级块

superBlock.s_inodes_count=DINODE_NUM;

superBlock.s_free_inodes_count=DATA_BLOCK_NUM-2-ACCOUNT_NUM;

/*空闲的inode总数初始化时,主目录和账户信息各占一块,10个用户10块*/

superBlock.s_blocks_count=DATA_BLOCK_NUM;

superBlock.s_free_blocks_count=DATA_BLOCK_NUM-2-ACCOUNT_NUM;

//空闲块总数主目录/10个用户/账户信息共占用12个

superBlock.s_log_block_size=BLOCK_SIZE;

//超级块放第1个物理块,第0个为引导

fseek(f_stream,BLOCK_SIZE,SEEK_SET);

fwrite(&

superBlock,BLOCK_SIZE,1,f_stream);

//fprintf(f_stream,"

thisissuperblock"

//测试

//初始化dinode位图block位图

for(inti=0;

i<

DATA_BLOCK_NUM;

i++){

if(i<

2+ACCOUNT_NUM)bk_bitmap[i]=1;

elsebk_bitmap[i]=0;

//初始化block位图

DINODE_NUM;

2+ACCOUNT_NUM)di_bitmap[i]=1;

elsedi_bitmap[i]=0;

//位示图存放与第2.3块

fseek(f_stream,BLOCK_SIZE*2,SEEK_SET);

di_bitmap,BLOCK_SIZE,1,f_stream);

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

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2