ImageVerifierCode 换一换
格式:DOCX , 页数:46 ,大小:105.62KB ,
资源ID:8720010      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8720010.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(文件管理.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

文件管理.docx

1、文件管理武夷学院实验报告课程名称:_操作系统_ 项目名称:_进程管理_ 姓名:_李辉文_ 专业:_计科_ 班级:_2_ 学号:_4_ 同组成员_无_一、实验预习部分:实验目的及要求 1.帮助了解文件系统的特点。2.通过模拟文件管理的工作过程,从而对各种文件操作命令的实质内容和执行过程有更深入的了解实验设备(环境)及要求 一台运行Windows操作系统并安装了VC+的计算机。二、实验过程记录部分:实验内容与步骤 程序功能方面要求实现一个命令行操作界面,包含如下命令:1. 改变目录。格式:CD功能:工作目录转移到指定的目录下,只要求完成改变到当前目录的某一个子目录下的功能,不要求实现相对目录以及绝

2、对目录。1. 创建文件。格式:CREATE 功能:创立一个指定名字的新文件,即在目录中增加一项,不考虑文件内容,但必须能输入文件长度。1. 删除文件。格式:DEL 功能:删除指定的文件。1. 显示目录。格式:LSALL 功能:显示全部目录以及文件,输出时要求先输出接近根的目录,再输出子目录。1. 创建目录。格式:MD功能:在当前路径下创建指定的目录。(6)删除目录。格式:RD功能:删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否作删除,删除则将该目录下的全部文件和子目录都删除。程序源代码如下:#include #include #include using namespace

3、 std;/*-常变量-*/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=512; /inode数量const unsigned int DATA_START=(2+DINODE_NUM)*BLOCK_SIZE; /数据

4、区的开始地址const unsigned int ACCOUNT_NUM=10; /用户数量const unsigned int DIRECTORY_NUM=12; /每个目录最多允许拥有的子目录和文件const unsigned short FILE_NAME_LENGTH=20; /最大文件名长度/*inode结构体*/*inode结构体*/struct inode unsigned short di_tag; /*inode标识*/ unsigned short di_number; /*关联文件数,当为0时表示删除文件,如一个目录至少包含两个文件:.和.*/ unsigned shor

5、t di_mode; /*存取模式:0为目录,1为文件*/ unsigned short di_userID; /*当前inode所属用户 0为根目录ID,一次下去是管理员目录、用户目录*/ unsigned short di_access; /*访问权限 0为不允许普通用户访问(公共目录),1为允许普通用户访问*/ unsigned short di_size; /*文件大小,目录没有大小,值为0*/ unsigned short di_ctime; /* 创建时间 */ unsigned short di_mtime; /* 最后一次修改时间*/ unsigned short di_blo

6、ck; /* 数据块块地址编号 */;/* 超级块结构*/struct super_block unsigned short s_inodes_count; /* 文件系统中inode的总数 */ unsigned short s_free_inodes_count; /* 空闲的inode总数 */ unsigned short s_blocks_count; /* 块总数 */ unsigned short s_r_blocks_count; /* 保留块总数 */ unsigned short s_free_blocks_count; / 空闲块总数 unsigned short s_l

7、og_block_size; /* block 的大小 */ unsigned short s_free_blocks_groupGROUPNUM;/新增 一个数组来记录每个数据块组中的空闲数据块计数 / unsigned short s_first_data_block; /* 第一个数据 block */ / unsigned short s_blocks_per_group; /* 每 block group 的 block 数量 */ unsigned short s_inodes_per_group; /* 每 block group 的 inode 数量 */ ;/* 账户信息*/

8、struct user unsigned short user_id; /用户ID unsigned short user_access; /权限 1为管理员 0为平民 string username; /用户名 string password; /密码;/* 文件、目录项结构*/struct directory string name; /*目录、文件名*/ string content;/*文件数据, 目录则没有数据*/ unsigned short d_ino; /*目录、文件号*/;/*-变量-*/unsigned short di_bitmapDINODE_NUM; / 硬盘inod

9、e节点位图 1表示已使用 0表示未使用unsigned short bk_bitmapDATA_BLOCK_NUM; / 数据块block位图 struct super_block superBlock; /超级块struct user accountACCOUNT_NUM; /共创建ACCOUNT_NUM个账户FILE *f_stream; /文件指针struct inode *cur_inode; /inode当前目录指针struct inode *inode_temp; /inode临时指针 const char diskName30=ext2 for linux.disk; /模拟硬盘

10、的文件名struct directory dir_bufDIRECTORY_NUM; /目录数组,每个目录最多允许有12个项(子目录或者文件)string cur_Path;/cmd 的头 表示所在哪个文件夹/int i_lock=0;/inode位图锁 可能会多线程/int b_lock=0;/block位图锁struct user *cur_user; /当前用户struct directory cur_dirDIRECTORY_NUM;/ 当前目录/*函数声明*/bool Format(void); /此函数用于格式化bool install(void); /此函数用于装载虚拟硬盘的数据

11、int FindFile(string filename);/次函数用于查找当前文件夹是否有该文件 bool access(struct inode *pinode);/权限判断int main() void login(void); /此函数用于用户登陆 void showMenu(void);/此函数用于显示功能菜单 bool onAction(void);/此函数用于用户选择功能并执行 char format_bool; /*初始化*/ cout系统已启动,是否初始化所有数据?tY/Nformat_bool; if(format_bool=y|format_bool=Y) if(!For

12、mat() return 0; break; else if(format_bool=n|format_bool=N) cout不初始化不能开始!endl; continue; else cout请输入Y或者Nendl; continue; cout初始化成功!endl; cout欢迎使用本程序,学号:20134012004 姓名:李辉文endl; /*转载虚拟硬盘数据*/ if(!install() cout加载失败,无效的硬盘格式endl; /main(); return 0; else cout加载disk成功!endl; cur_Path=cur_dir1.name+root; /*登

13、陆*/ login(); /*显示菜单*/ showMenu(); /*显示当前路径*/ coutcur_Path; while(onAction(); return 0;/*此函数用于格式化*/bool Format() /创建文件 f_stream=fopen(diskName,wb+); if(f_stream=NULL) cout创建文件失败endl; return false; /初始化超级块 superBlock.s_inodes_count=DINODE_NUM; /* 文件系统中inode的总数 */ superBlock.s_free_inodes_count=DATA_BL

14、OCK_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; /* block 的大小 */ /超级块放第1个物理块,第0个为引导 fseek(f_stream,BL

15、OCK_SIZE,SEEK_SET); fwrite(&superBlock,BLOCK_SIZE,1,f_stream);/ fprintf(f_stream,this is super block);/测试 /初始化dinode位图 block位图 for(int i=0;iDATA_BLOCK_NUM;i+) if(i2+ACCOUNT_NUM) bk_bitmapi=1; else bk_bitmapi=0; /初始化block位图 for(i=0;iDINODE_NUM;i+) if(idi_tag=0;/i节点标志 node_temp-di_number=2+ACCOUNT_NUM

16、;/关联12个文件夹 node_temp-di_mode=0;/0为目录 node_temp-di_userID=0;/用户id 第一个用户 node_temp-di_access=0;/0为公共可以访问 node_temp-di_size=0;/目录无size node_temp-di_ctime=0; /* 创建时间 */ node_temp-di_mtime=0; /* 修改时间 */ node_temp-di_block=0; fseek(f_stream,DINODE_START,SEEK_SET); fwrite(node_temp,sizeof(struct inode), 1,

17、f_stream); /账户信息的inode node_temp-di_tag=1; node_temp-di_number=0;/无文件关联,此项等于0表明是账户信息,可用作区别于文件、目录的标识 node_temp-di_mode=0;/0为目录 node_temp-di_userID=0;/用户id 第一个用户 node_temp-di_access=0;/0为公共可以访问 node_temp-di_size=0;/无size node_temp-di_ctime=0; /* 创建时间 */ node_temp-di_mtime=0; /* 修改时间 */ node_temp-di_bl

18、ock=1; /*账户信息存在数据块的第1块*/ fseek(f_stream,DINODE_START+BLOCK_SIZE,SEEK_SET); fwrite(node_temp,sizeof(struct inode), 1,f_stream); /管理员和9个普通用户的inode for(i=1;idi_tag=i+1;/inode标志 node_temp-di_number=2;/关联2个文件夹 node_temp-di_access=1;/1为用户私有 node_temp-di_mode=0;/0为目录 node_temp-di_userID=i;/用户id 第一个用户 node_

19、temp-di_size=0;/目录无size node_temp-di_ctime=0; /* 创建时间 */ node_temp-di_mtime=0; /* 修改时间 */ node_temp-di_block=i+1;/所占物理块号.从管理员到user9占用的位置为211. fseek(f_stream,DINODE_START+BLOCK_SIZE*(i+1),SEEK_SET); fwrite(node_temp,sizeof(struct inode), 1,f_stream); /*初始化主目录*/ dir_buf0.name=.; dir_buf0.d_ino=0; dir_

20、buf1.name=.; dir_buf1.d_ino=0; dir_buf2.name=admin; dir_buf2.d_ino=2;/管理员的inode号为2 /user1user9的目录项 for(i=0;iACCOUNT_NUM-1;i+) dir_bufi+3.name=user+i; dir_bufi+3.d_ino=i+3; fseek(f_stream,DATA_START,SEEK_SET); fwrite(dir_buf,BLOCK_SIZE,1,f_stream); /*初始化账户信息*/ struct user account_tempACCOUNT_NUM; /管理

21、员账户 account_temp0.username=admin; account_temp0.password=admin; account_temp0.user_access=1;/1为管理员 account_temp0.user_id=2; /管理员目录的块号 /user1user9 for(i=1;iACCOUNT_NUM;i+) account_tempi.username=user+i; account_tempi.password=user+i; account_tempi.user_access=0; account_tempi.user_id=i+2;/useri的物理块号

22、fseek(f_stream,DATA_START+BLOCK_SIZE,SEEK_SET); fwrite(account_temp,BLOCK_SIZE,1,f_stream); /*初始化admin目录以及user1user9*/ /清空dir_buf for(i=0;iDIRECTORY_NUM;i+) dir_bufi.d_ino=0; dir_bufi.name=0; for(i=0;iACCOUNT_NUM;i+) dir_buf0.d_ino=2; dir_buf0.name=.; dir_buf1.d_ino=0; dir_buf1.name=.; fseek(f_strea

23、m,DATA_START+BLOCK_SIZE*(i+2),SEEK_SET);/管理员在第二块物理空间 return true;/*此函数用于装载虚拟硬盘的数据*/bool install(void) /*函数声明*/ inode * getInode(unsigned int);/获取指定inode号的inode单元 bool getDataBlock(unsigned int);/获取指定数据块号下的目录或文件 int i; coutinstalling.endl; f_stream = fopen (diskName, rb+);/ 只读方式打开硬盘模拟文件 if(f_stream=N

24、ULL) cout文件打开失败endl; return 0; /读超级块 fseek(f_stream,BLOCK_SIZE,SEEK_SET); fread(&superBlock,sizeof(struct super_block),1,f_stream); / cout加载超级块:superBlock.s_blocks_countendl; inode_temp=new inode; if(!inode_temp) coutcur_inode 内存分配失败!endl; return 0; cur_inode=new inode; if(!cur_inode) coutcur_inode

25、内存分配失败!endl; return 0; /读取inode 位示图 fseek(f_stream,BLOCK_SIZE*2,SEEK_SET); fread(di_bitmap,BLOCK_SIZE,1,f_stream); cout加载inode位示图:di_bitmap0endl; /读取block 位示图 fseek(f_stream,BLOCK_SIZE*3,SEEK_SET); fread(bk_bitmap,BLOCK_SIZE,1,f_stream); cout加载block位示图:bk_bitmap0endl; /读取账户信息的inode inode_temp=getInode(1); if(inode_temp=NULL) cout加载账户信息失败!endl; return false; /changeinode();/交换指针后 cur_inode 指向当前目录的 inode /读取账户信息 cout账户信息块号:di_blockdi_block,SEEK_SET); fread(account,BLOCK_SIZE,1,f_stream); /cout加载账户信息:account0.usernametacc

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

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