多用户多目录文件系统(实验报告、完整源代码版)
文件管理系统实验报告
一、实验目的本次实验旨在通过设计和实现一个简单的文件管理系统,加深对文件管理原理的理解,掌握文件系统的基本操作,包括文件的创建、删除、修改、查询等,并了解文件系统的目录结构和管理机制。
二、实验环境1. 操作系统:Windows 102. 开发工具:Visual Studio 20193. 编程语言:C++4. 实验时间:2023年10月25日三、实验内容1. 文件系统的目录结构设计2. 文件的基本操作实现3. 文件系统的存储管理4. 文件系统的安全机制四、实验步骤1. 目录结构设计根据文件系统的需求,设计以下目录结构:```根目录│├── 文件夹A│ ├── 文件1.txt│ └── 文件2.txt│├── 文件夹B│ └── 文件3.txt│└── 文件夹C```2. 文件的基本操作实现(1)文件创建```cppvoid CreateFile(const std::string& filePath, const std::string& content) {// 检查文件是否存在if (CheckFileExist(filePath)) {std::cout << "文件已存在!" << std::endl;return;}// 创建文件std::ofstream file(filePath);if (file.is_open()) {file << content;file.close();std::cout << "文件创建成功!" << std::endl;} else {std::cout << "文件创建失败!" << std::endl;}}```(2)文件删除```cppvoid DeleteFile(const std::string& filePath) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl;return;}// 删除文件if (remove(filePath) == 0) {std::cout << "文件删除成功!" << std::endl;} else {std::cout << "文件删除失败!" << std::endl;}}```(3)文件修改```cppvoid ModifyFile(const std::string& filePath, const std::string& newContent) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl; return;}// 修改文件内容std::ofstream file(filePath, std::ios::trunc); if (file.is_open()) {file << newContent;file.close();std::cout << "文件修改成功!" << std::endl; } else {std::cout << "文件修改失败!" << std::endl; }}```(4)文件查询```cppvoid QueryFile(const std::string& filePath) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl; return;}// 读取文件内容std::ifstream file(filePath);if (file.is_open()) {std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());std::cout << "文件内容:" << content << std::endl;file.close();} else {std::cout << "文件读取失败!" << std::endl;}}```3. 文件系统的存储管理文件系统采用磁盘文件作为存储介质,通过文件操作实现对文件的读写。
文件系统课程设计源代码
文件系统课程设计源代码一、教学目标本课程的教学目标是使学生掌握文件系统的基本概念、原理和操作方法。
具体包括:1.知识目标:学生能够理解文件系统的定义、作用和基本组成;掌握文件、目录和磁盘空间的管理方法;了解文件系统的性能优化和安全性措施。
2.技能目标:学生能够熟练使用文件系统进行文件操作,如创建、删除、移动和权限设置;能够运用文件系统进行数据管理和备份;能够分析和解决文件系统在使用过程中遇到的问题。
3.情感态度价值观目标:培养学生对文件系统的安全意识,使其能够正确处理文件隐私和数据安全问题;培养学生珍惜资源、节约空间的意识,提高其信息技术素养。
二、教学内容教学内容主要包括以下几个部分:1.文件系统概述:介绍文件系统的基本概念、作用和组成,使学生了解文件系统在操作系统中的重要性。
2.文件和目录管理:讲解文件和目录的定义、操作方法和形式,培养学生熟练使用文件系统进行文件管理的能力。
3.磁盘空间管理:介绍磁盘空间分配策略、回收方法和优化手段,使学生掌握磁盘空间的有效利用技巧。
4.文件系统性能优化:讲解文件系统的性能指标、优化策略和调整方法,培养学生提高文件系统性能的能力。
5.文件系统安全性:介绍文件系统的安全特性、权限管理和加密方法,使学生具备较强的文件安全意识。
6.实践操作:通过实际操作演练,使学生熟练掌握文件系统的使用方法,提高实际应用能力。
三、教学方法本课程采用多种教学方法相结合的方式,以激发学生的学习兴趣和主动性:1.讲授法:教师讲解文件系统的基本概念、原理和操作方法,使学生掌握文件系统的理论知识。
2.案例分析法:分析实际案例,使学生了解文件系统在实际应用中的问题和解决方法。
3.实验法:安排上机实验,让学生亲自动手操作,提高实际应用能力。
4.讨论法:学生进行小组讨论,分享学习心得和经验,培养学生的合作精神。
四、教学资源本课程所需教学资源包括:1.教材:选用权威、实用的教材,为学生提供系统的理论知识。
模拟文件系统(多级,含源代码)
内含源代码,不懂可以百度消息给我多级文件目录管理实训报告--FileManager院别:计算机学院姓名:LDY学号:20110040xxxxxx班级:计Y11x广西科技大学大学计算机学院Creation time:2013-1-8 17:44:25目录1实验目的 (2)2实验内容 (2)2.1实验题目:树状多级文件目录管理系统 (2)2.2实验要求:功能实现 (2)3设计分析 (3)3.1数据结构分析:树形目录的存储、删除及树的显示 (3)3.2 数据结构定义 (7)3.3 功能分析和函数定义 (10)4 功能总览 (15)4.1 功能总览 (15)4.2主要功能 (15)5 实训总结 (19)5.1 所遇困难 (19)5.2 心得体会 (20)1实验目的本次实训的总体目的在于通过系统的编程训练,培养学生编写一个具有一定难度的小型系统的能力,培养学生从编写单个程序,实现单个程序功能到进行系统开发,整体调试的能力。
从知识点的角度来说,目的在于通过本实训项目,让学生对链表或二叉树这一重要数据结构的运用更加熟练。
2实验内容2.1实验题目:树状多级文件目录管理系统本次实训的题目是树状多级文件目录管理系统。
要求利用数据结构的知识,采用链表的形式或通过将树转换为二叉树的概念,采用孩子兄弟二叉树的方式实现文件目录系统。
不容许采用数据库实现文件管理。
每个树结点表示一个文件(包括目录文件),成员基本信息可包含,文件名、文件属性、文件大小、文件创建时间,文件最后修改时间、文件最后访问时间等信息。
具体属性自行确定(注意:成员基本信息尽量与Window系统中文件具有的属性信息相同,以便对文件进行磁盘存取时保证文件的属性信息不丢失)。
2.2实验要求:功能实现要求实现的总体基本功能包括:文件的创建和删除;文件夹的创建和删除;文件的读写和执行;文件的层次化显示;打开和关闭文件;显示目录下的文件;查找给定文件和目录;根据给定属性对文件进行排序;选做功能包括:将内存中的多级文件系统存储到磁盘中,将磁盘中某目录下的文件系统读入系统并回购多级目录系统。
文件管理实验报告
文件管理一、实验目的:1.了解os中文件的组织和管理。
2.熟悉文件中所用的数据结构。
二、实验要求:1. 设计一个N个用户的文件系统,每个用户最多保存m个文件。
2. 限制用户在一次使用中只能打开L个文件。
3. 系统应能检查输入命令的正确性,出错能显示出原因。
4. 对文件必须设置保护措施,如只读、写、执行等。
在每次打开时再次设置保护级别,即可有二级保护。
5. 对文件的操作至少有以下几条命令create:建文件delete:删文件open:打开文件close:关闭文件read:读文件write:写文件举例:主文件目录mfd=recordusername :string[maxlen];files :array[1..L] of ufd;ofiles :arrau[1..S] of uodend;用户打开文件目录表:uod=recordfilename:string[maxlen];attrib:attrib;len:integer;status:(open,create);rp,up:integer;end;用户文件目录:ufd=recordfielname:string[maxlen];attrib ro,rw);len:integer;addr:integer;end;二、主要数据结构界面采用VC6 MFC环境开发#define MAXFILE 20 //每个用户最多保存20个文件#define MAXUSER 10 //假想文件系统最多支持的人数#define BLOCKSIZE 32 //虚拟磁盘中物理块为每块32字节#define DISKSIZE BLOCKSIZE*1000 //虚拟磁盘容量为1000*32=32Kstruct UFD //说明文件项的结构数组{char FileName[15];char Time[16]; //文件建立或修改时间如2003/5/6 12:00bool IsExist; //文件是否存在,删除时标为0bool IsShared; //共享标记,共享文件可被其它用户所访问bool AttrRead; //文件是否可读bool AttrWrite; //文件是否可写bool AttrExecute; //文件是否可执行HTREEITEM treeNode; //用于树控件显示的结点句柄USHORT FileLen; //文件占用字节数USHORT BlockNum; //文件占用的物理块数USHORT FileLink[100];//文件物理块地址数组,每块32字节,限定一个文件最大100*32=3200字};struct MFD{char UserName[10]; //主目录用户名bool IsExist; //该用户否存在UFD ufd[MAXFILE]; //用户文件数组USHORT nItem;//UFD个数};struct HEADBLOCK{BYTE pStack; //堆栈指针SHORT pBlock[10]; //块号 pBlock[10]是下一个盘块号逻辑地址};struct BLOCK //虚拟磁盘的物理块数据结构{union{BYTE block[32]; //一块为32字节HEADBLOCK HeadInfo;};};struct FAT{BLOCK SuperBlock; //超级块,指示第一个空闲块逻辑号USHORT MaxOpen; //该用户同时可打开的最大文件数USHORT UserNum; //最户数MFD Mfd[MAXUSER]; //最多可支持10个用户};//空闲块成组链接法bool OpenList[MAXUSER][MAXFILE]; //描述文件是否打开的布尔型数组FAT FileFAT; //描述文件记录项的FAT结构CFile FATIO; //负责和VDISK.DAT打交道的文件句柄CString CurrentUser; //当前登录的用户名Int CurrentID; //前前登录的用户标识号说明:本实验采用模拟文件结构的方法,把记录用户帐号,用户文件和磁盘块的信息用当前目录下的VDISK.DAT来记录,可以把VDISK.DAT看成是一个虚拟的磁盘,其头部是FAT结构,用来记录各个用户和文件信息,紧接着是空闲块成组链接法的数据结构,每块32字节,每组10块,共1000块,也就是说,用户文件数据的总容量是32*1000字节,如果程序当前目录下找不到用于做实验用的VDISK.DAT,在登录时程序会提示是否“格式化虚拟磁盘”也就是新建一个VDISK.DAT文件,接着,程序会显示“用户管理”的窗口,此时应新建几个帐号用于登录做实验。
操作系统文件系统实验报告后附源代码
目录1 课程设计简介 (1)1.1 课程设计的目的 (1)1.2 课程设计内容 (1)2 数据结构的设计 (2)2.1 预定义 (2)2.2 结构体 (2)2.3 全局变量和函数 (2)3 功能模块(或算法)描述 (5)3.1 模块划分 (4)3.2 模块流程图 (6)4 程序运行结果 (8)5心得体会 (9)参考文献 (10)附源代码 (11)1 课程设计简介1.1 课程设计的目的课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
1.2 课程设计内容课程设计内容设计一个简单的多用户文件系统。
即①在系统中用一个文件来模拟一个磁盘;②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。
③实现这个文件系统。
④能实际演示这个文件系统。
基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。
1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。
另外,为打开文件设置了运行文件目录(AFD)。
3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4)因系统小,文件目录的检索使用了简单的线性搜索。
5)文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录,如图5.1所示。
2 数据结构的设计2.1 预定义#define BLOCKSIZ 512 //磁盘块的大小#define DA TABLKNUM 512 //数据块的数目#define BLKGRUPNUM 50 //数据块组包含多少数据块#define P_N_BLOCKS 15 //inode节点中指向数据块的指针个数#define GROUPNUM DATABLKNUM/BLKGRUPNUM+1 //数据块组组数#define DINODESIZ 512 //磁盘i结点区的大小(空间32×512)#define DINODENUM 32 //磁盘i结点区的块数#define SYSOPENFILE 40#define DIRNUM 32 //一个目录下的最多目录和文件的总和数#define DIRSIZ 14 //文件、目录名的长度(字节)#define UPWDSIZ 15 //密码的长度#define UNAMSIZ 15 //用户名的长度#define PWDSIZ sizeof(struct pwd) //密码结构的长度#define PWDNUM BLOCKSIZ/PWDSIZ //密码数据空间的大小(pwd为单位)#define NOFILE 20 //一个用户最多可以打开的文件数目#define DINODESTART 4*BLOCKSIZ//i结点区的开始地址-inodes table ,1引导2超块3block bitmap 4inode bitmap#define DA TASTART (2+DINODENUM)*BLOCKSIZ //数据区的开始地址#define DATASTARTNO 36 //数据区开始指针#define DIMODE_EMPTY 00000/*可以用的空间*/#define DIMODE_FILE 00001#define DIMODE_DIR 00002#define DIMODE_PASSWD 00004#define GRUP_0 0 //管理员组#define GRUP_1 1#define GRUP_2 2#define GRUP_4 42.2 结构体//磁盘i结点结构,struct inode{// char di_name[DIRSIZ];unsigned __int16 di_ino; /*磁盘i节点标识*/unsigned __int16 di_number; /*关联文件数,当为0时表示删除文件*/unsigned __int16 di_mode; /*存取权限*/unsigned __int16 di_uid; /*磁盘i节点用户id*/unsigned __int16 di_gid; /*磁盘i节点权限组id*/ //1管理员组2用户组unsigned __int32 di_size; /*文件大小*/unsigned __int32 di_ctime; /* Creation time */unsigned __int32 di_mtime; /* Modification time */unsigned __int16 di_block[P_N_BLOCKS]; /* 一组block 指针*/};// 目录项结构struct direct{char d_name[DIRSIZ]; /*目录名(14字节)*/__int16 d_ino; /*目录号*/};//超级快结构struct super_block{unsigned __int16 s_inodes_count; /* inodes 计数*/unsigned __int16 s_blocks_count; /* blocks 计数*/unsigned __int16 s_r_blocks_count; /* 保留的blocks 计数*/unsigned __int16 s_free_blocks_count; // 空闲的blocks 计数unsigned __int16 s_free_inodes_count; /* 空闲的inodes 计数*/unsigned __int16 s_free_blocks_group[GROUPNUM];//新增一个数组来记录每个数据块组中的空闲数据块计数unsigned __int16 s_first_data_block; /* 第一个数据block */unsigned __int16 s_log_block_size; /* block 的大小*/unsigned __int16 s_blocks_per_group; /* 每block group 的block 数量*/unsigned __int16 s_inodes_per_group; /* 每block group 的inode 数量*/};// 用户密码struct pwd{unsigned __int8 p_uid;unsigned __int8 p_gid;char username[UNAMSIZ];/*用户名新加的*/char password[UPWDSIZ];};// 目录结构struct dir{struct direct direct[DIRNUM];__int16 size;};2.3 全局变量和函数// 全局变量unsigned __int8 di_bitmap[DINODENUM]; // 硬盘inode节点位图1表示已使用0表示未使用unsigned __int8 bk_bitmap[DA TABLKNUM]; // 数据块block位图struct super_block filsys; //超级块struct pwd pwd[PWDNUM];FILE *fd; //文件指针struct inode *cur_inode; //i节点当前目录指针struct inode *inodetemp; //i节点指针const char fsystemname[20]="Linux.EXT2"; //模拟硬盘的文件名struct direct dir_buf[BLOCKSIZ / sizeof(struct direct)]; //目录数组char cmdhead[20];//cmd 的头表示所在哪个文件夹、int i_lock=0;//inode位图锁可能会多线程int b_lock=0;//block位图锁struct pwd *cur_user;/* 全局函数*/extern int Format();//格式化磁盘extern int Install();//启动,安装文件系统struct inode * read_inode(int);//install里面读取文件dinodestruct direct * read_dir_data(int);//读取存储文件夹的物理块extern void showdir();//命令dirint Enterdir(char[]);//进入某个文件夹命令-- cd 文件名int Fd_dirfile(char[]);//查找当前目录里的文件没找到返回-1 找到返回inode号int Iscmd(char[]);//判断是否两个字符串的命令void two_cmd(char[],char[]);//两个字符串的命令int creat(char[]);//创建文件void changeinode();//交换指针char * ReadFile(char[]);//读取文件int mkdir(char[]);//创建文件夹void showbitmap();//显示位图int deletefd(char[]);//删除文件int editfile(char[]);//编辑文件int rename(char[]);//重命名void showhelp();//命令帮助void login();void logout();int access();//权限判断/*磁盘i节点的分配与释放(当一个新文件被建立的时候,在给该文件分配磁盘存储区之前,应为该文件分配存放该文件说明信息的磁盘i节点,当从文件系统中删除某个文件时,应首先删除它的磁盘i节点项。
操作系统 文件系统的多级目录管理实验
实验五文件系统的多级目录管理(4课时)一、实验目的通过实验了解文件系统管理的基本原理和方法。
掌握在在文件系统中进行多级目录的管理。
了解文件和目录的基本操作。
二、实验内容在系统中进行目录的建立、改变当前目录、对目录进行删除;建立一个文件,显示文件内容,删除文件等。
三、实验提示1、目录的存储结构的设置。
2、文件的建立方式,文件内容的管理。
3、如何进行文件的按名管理,文件在内存中的如何存储。
4、必要的提示信息。
程序://本程序模拟文件系统的多级目录管理,实现按名存取//#include<iostream.h>#include<iomanip.h>#include<stdlib.h>#include<stdio.h>#include<string.h>//文件类class file{private:int size;char filename[9];char *text;public:file *next;file();voideditfile();char *getfilename() {return filename;} //返回文件名void show_text() {cout<<endl;cout<<text;cout<<endl;} //显示文本内容intgetsize() { return size;}~file() {delete text;};};//目录类class directory{private:chardirname[9];public:file *pfile;directory *nextdir,*subdir,*fatherdir;directory(char *dname) { strcpy(dirname,dname);pfile=NULL;} directory() { pfile=NULL;cin>>dirname; }void creatfile(); //新建文件void deletefile(); //删除文件void showfile(); //显示文件char *getdname() {return dirname;} //返回目录名~directory() {delete pfile;};};//文件目录管理类classdirmanager{public:void manager(); //文件和目录管理的主控函数void addnew(); //新增目录void cdsubdir(); //进入子目录void showdir(); //提示当前所在目录路径void showdirinfor(); //显示当前目录所包含子目录和文件信息~dirmanager() {delete root;}private:directory *root,*p,*p1,*p2;directory *dir[10]; //存放目录指针};//文件类构造函数,询问是否编辑文件file::file(){char edit;cin>>filename;cout<<"是否编辑文件?(y/n):";cin>>edit;if(edit=='y'||edit=='Y')editfile();else size=0;}//编辑文件函数的实现void file::editfile(){text=new char[1024];cout<<"请输入文件内容:"<<endl;gets(text);size=strlen(text);}//新建文件函数的实现void directory::creatfile(){file *pf,*p1;if(pfile==NULL) {pf=new file; pfile=pf;pf->next=NULL;}else { p1=pfile;while(p1->next!=NULL) p1=p1->next;pf=new file;p1->next=pf; pf->next=NULL;}}//处理目录下是否有文件显示命令void directory::showfile(){char name[9],ch1;intfindfile=-1;file *pt;if(pfile!=NULL){ pt=pfile;cin>>name;while(pt!=NULL){ findfile=strcmp(name,pt->getfilename());if(findfile==0){ if(pt->getsize()!=0) pt->show_text();else {cout<<"文件中无内容!"<<endl;cout<<"是否编辑该文件(y/n):";cin>>ch1;if(ch1=='y'||ch1=='Y') pt->editfile();}break;}pt=pt->next;}if(findfile!=0) cout<<"文件名错误,无此文件!"<<endl;}else cout<<"当前目录无文件!"<<endl;}//删除文件函数的实现void directory::deletefile(){char filename[9],choice;file *p1,*p2;intfindfile=-1;if(pfile!=NULL){ p1=pfile;cin>>filename;while(p1!=NULL){findfile=strcmp(filename,p1->getfilename());if(findfile==0){ cout<<"真的要删除文件吗?(y/n):";cin>>choice;if(choice=='y'||choice=='Y') {if(p1==pfile) pfile=p1->next; else p2->next=p1->next;/*delete p1;*/break;} }p2=p1;p1=p1->next;}if(findfile!=0) cout<<"文件名错误!"<<endl;}else cout<<"当前目录下无文件!"<<endl;}//新建目录函数的实现voiddirmanager::addnew(){p1=new directory;p1->fatherdir=p;p1->subdir=NULL;p1->nextdir=NULL;if(p->subdir==NULL) p->subdir=p1;else {p2=p->subdir;while(p2->nextdir!=NULL) p2=p2->nextdir;p2->nextdir=p1;}}//进入子目录函数的实现voiddirmanager::cdsubdir(){chardname[9];int find;directory *p3=p;//cout<<"请输入你要进入的目录名:";cin>>dname;if(p->subdir!=NULL){ p3=p3->subdir;while(p3!=NULL) {find=strcmp(dname,p3->getdname());if(find==0) {p=p3;break;}p3=p3->nextdir;}if(find!=0) cout<<"目录名错误!"<<endl;}else cout<<"当前目录为空目录!"<<endl;}//显示所在目录路径函数的实现voiddirmanager::showdir(){ int i=0,j;directory *pd;dir[i++]=p; pd=p->fatherdir;while(pd!=NULL){ dir[i]=pd;pd=pd->fatherdir;i++;}for(j=i-1;j>=0;j--){cout<<dir[j]->getdname();if(j!=0||i==1)cout<<"\\";}cout<<">";}//显示当前目录的文件和目录信息函数的实现voiddirmanager::showdirinfor(){int length;file *pfi;directory *pdi;if(p->pfile!=NULL){ pfi=p->pfile;while(pfi!=NULL){ length=strlen(pfi->getfilename());cout<<pfi->getfilename()<<setw(30-length)<<"<文件>"<<endl;pfi=pfi->next;}}if(p->subdir!=NULL){pdi=p->subdir;while(pdi!=NULL){ length=strlen(pdi->getdname());cout<<pdi->getdname()<<setw(30-length)<<"<目录>"<<endl;pdi=pdi->nextdir;}}if(p->pfile==NULL&&p->subdir==NULL)cout<<"空目录!"<<endl;}//文件和目录管理的主控函数的实现voiddirmanager::manager(){charch;int i;cout<<"新建、进入命令其后都必须加上文件或目录名,显示文件内容也必须加上文件名"<<endl;cout<<"<1>新建目录<2>返回上级目录<3>进入子目录"<<endl;cout<<"<4>新建文件<5>删除文件<6>显示文件内容"<<endl;cout<<"<7>显示当前目录信息<8>退出"<<endl;root=new directory("c:"); root->fatherdir=NULL;root->subdir=NULL;root->nextdir=NULL;p=root;for(i=0;i<200;i++){ cout<<"\n";showdir();cin>>ch;switch(ch){case '1': addnew();break;case '2': {if(p->fatherdir!=NULL) p=p->fatherdir;break;}case '3': cdsubdir();break; //进入子目录case '4': p->creatfile();break;//新建文件case '5' :p->deletefile();break; //删除目录下的文件case '6': p->showfile();break; //显示文件内容case '7': showdirinfor();break; //显示目录信息case '8': exit(1);default: cout<<"无效命令"<<endl;break;}}}void main(){dirmanager admin;admin.manager();}。
(完整word版)多用户多级目录文件系统(第二组)
滁州学院课程设计报告课程名称:计算机操作系统设计题目:多用户多级目录文件系统系别:计算机科学与技术系专业:计算机科学与技术专业组别:第二组起止日期: 2010年6月26日~ 2010年6月27日****:***教研室主任:杨传健计算机科学与技术系2010年制课程设计任务书目录1.设计思想说明 (1)2.系统结构说明 (1)3.数据结构说明 (1)3.1开发环境 (1)3.2数据存储 (2)3.3数据结构 (2)3.3.1数据块在内存中的物理结构 (2)3.3.2文件索引结构 (2)3.3.3文件系统中文件元素的结构(含文件夹和文件) (2)3.3.4文件系统结构 (3)3.3.5文件系统的当前运行状态 (3)3.3.6用户结构 (4)4.各主要模块的算法流程图 (4)4.1整体思路概述 (4)4.1.1login (用户登录) (4)4.1.2系统初始化 (5)4.1.3文件的创建:create (5)4.1.4文件的打开:open (6)4.1.5文件的读:read (6)4.1.6文件的写:write (8)4.1.7文件关闭:close (9)4.1.8删除文件:delete (10)4.1.9创建目录(建立子目录):mkdir (12)4.1.10改变当前目录:cd (12)4.1.11列出文件目录:dir (14)4.1.12退出:logout (15)4.2算法流程图 (16)5.使用说明书 (17)5.1登录 (17)5.2新建目录和列出文件目录 (17)5.3改变当前目录 (17)5.4文件的创建 (18)5.5文件的打开 (18)5.6文件的写 (18)5.7文件的读 (18)5.8文件的关闭 (18)5.9文件的删除 (19)5.10返回根目录 (19)5.11退出 (19)6.心得体会 (19)参考文献 (19)1.设计思想说明本课程设计要求设计一个模拟的多用户多级目录的文件系统。
(完整word版)一个多用户多级目录结构文件系统设计与实
操作系统课程设计姓名:学号:班级:电话:邮箱:课程设计题目:一个多用户多级目录结构文件系统设计与实现编译环境: Linux运行环境: Linux一、设计思想说明1 设计环境课程设计的环境是Linux 操作系统。
设计时可利用Linux 提供的文件管理的功能调用,建立一个模拟的文件系统。
基本思想是,在Linux 系统中创建一个较大容量的文件,作为所设计的文件系统的“文件卷”,并利用Linux 系统的功能调用,编写各程序模块。
2、文件卷的组织以 1M 的存储器空间作为文件空间,空间“分块”,编号为 0#~(BLKMAX-1)# 。
“分块”就是规定对文件卷的读/写以块为单位,每次读/写的起点为块大小的整倍数。
分块主要体现在文件卷的读/写模块上。
# define BSIZE 512 /* 512bytes/块 */# define BLKMAX 2048 /* 共2048 块 */0#块的作用: 0# 块是专用块(超级块)。
前半部用于存放文件卷空间的位示图(bitmap),位状态='0'表示对应块空闲,状态='1'表示已分配。
后半部的最后32 个字节用于存放根目录的目录结构。
0#块不参与文件空间的动态分配。
1#~(BLKMAX-1)#块用于存放文件(普通文件和子目录文件)的信息。
二、系统结构的说明本文件管理系统分为五层,上层调用下层,下层为上层服务。
以下为各层(由低到高)的简要说明:1、块管理层,通过TBlock类实现设下列主要函数:balloc()--块分配函数brelse()--块释放函数bread()—读一块函数bwrite()—写一块函数2、FCB管理层,通过TFcb类实现功能涉及到FCB结构的操作,定义了一些与FCB操作相关的函数3、打开文件管理层,通过TOFile类实现功能为涉及ofile结构的操作。
4、命令解释层,通过TEnter类和TOrder类实现功能为接受来自用户的命令,并解释、执行用户提出的文件访问操作。
文件系统设计实验报告
文件系统设计试验报告班级:10网工三班学生姓名:谢昊天学号:1215134046实验目的和要求:通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
实验内容与分析设计:为linux系统设计一个简单的二级文件系统。
要求做到以下几点:(1)可以实现下列几条命令(至少4条);login 用户登陆dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件(2)列目录时要列出文件名、物理地址、保护码和文件长度;(3)源文件可以进行读写保护。
实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建的文件,可以编号存储于磁盘上。
如file0,file1,file2...并以编号作为物理地址,在目录中进行登记。
实验步骤与调试过程:用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
主要数据结构:1.I节点 2.磁盘i结点 3.目录项结构 4.超级块 5.用户密码 6.目录 7.查找i 内存节点的hash表 8.系统打开表 9.用户打开表设置:主要函数1.i节点内容获取函数iget()(详细描述略)。
2.节点内容释放函数iput()(详细描述略)。
3.目录创建函数mkdir()(详细描述略)。
4.目录搜索函数namei()(详细描述略)。
5.磁盘块分配函数balloc()(详细描述略)。
6.磁盘块释放函数bfree()(详细描述略)。
7.分配i节点区函数ialloc()(详细描述略)。
8.解释结点区函数ifree()(详(详细描述略)。
10.访问控制函数access 细描述略)。
9.搜索当前目录下文件的函数iname()()(详细描述略)。
多用户多目录文件系统(实验报告、完整源代码版)
//……//代码省略
//……
}2.5管理用户的类,管理员是其的对象
class Cdisk{ public:
Cuse user[5]; char code[10]; int dis_disk();〃
//用户类
//用户个数最多为5
//管理员密码
显示磁盘的使用情况
int first_dele_user();〃删除用户的准备工作
5.设计一个较实用的用户界面,方便用户使用。要求提供以下相关文件操作:
(1)具有login(用户登录)
(2)系统初始化(建文件卷、提供登录模块)
(3)文件的创建:create
(4)文件的打开:ope n
(5)文件的读:read
(6)文件的写:write
(7)文件关闭:close
(8)删除文件:delete
此为只馍文件,占用硬盘块号如下’
3123456789L011
6.2目录的创建与查看
3.8查看当前目录:int Cuse::dis_dir(DIR *d)〃
int Cuse::dis_now()//显示当前目录
DIR *Cuse::get_ no w() //
3.9删除目录:int Cuse::first_dele_dir()
int Cuse::dele_dir(DIR *p)
3.10返平台:Microsoft Visual C++ 6.0企业版
d)运行平台:PC机,WindowsXP
1.2设计思想
文件系统是操作系统中负责管理和存取文件信息的机构, 它具有“按名存取” 的功能。文件系统主要实现对具体的文件存取空间的管理、文件的物理结构、 目 录结构管理和文件操作。
多级文件目录实验报告
一、实验目的1. 理解文件目录的概念及其在文件系统中的作用。
2. 掌握多级文件目录的结构和实现方法。
3. 熟悉文件目录的创建、删除、查询等操作。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验原理文件目录是文件系统中用于组织和管理文件的目录结构。
多级文件目录是一种树形结构,其中每个节点代表一个目录,叶子节点代表一个文件。
目录节点包含其子目录和文件的列表,而文件节点则包含文件的相关信息,如文件名、大小、创建时间等。
在多级文件目录中,每个目录可以包含多个子目录和文件,目录与目录之间通过父子关系相互连接。
用户可以通过目录路径来访问文件,路径中的每个目录名通过“/”分隔。
四、实验步骤1. 创建多级文件目录```pythondef create_directory(path):directories = path.split('/')current_path = ''for directory in directories:if directory:current_path += '/' + directoryif not os.path.exists(current_path): os.makedirs(current_path)```2. 删除文件目录```pythondef delete_directory(path):directories = path.split('/')current_path = ''for directory in directories:if directory:current_path += '/' + directoryif os.path.exists(current_path):os.rmdir(current_path)```3. 查询文件目录```pythondef list_directory(path):directories = path.split('/')current_path = ''for directory in directories:if directory:current_path += '/' + directorytry:files = os.listdir(current_path)print(f"目录:{current_path}")for file in files:print(f"文件:{file}")except FileNotFoundError:print(f"目录:{current_path} 不存在")```4. 主函数```pythonif __name__ == '__main__':path = input("请输入文件目录路径:")option = input("请选择操作(创建c、删除d、查询l):") if option == 'c':create_directory(path)elif option == 'd':delete_directory(path)elif option == 'l':list_directory(path)else:print("无效的操作")```五、实验结果与分析1. 创建多级文件目录输入路径:/home/user/project 执行结果:```目录:/home目录:/home/user目录:/home/user/project```2. 删除文件目录输入路径:/home/user/project 执行结果:```目录:/home/user目录:/home```3. 查询文件目录输入路径:/home/user执行结果:```目录:/home/user文件:readme.txt文件:test.py```六、实验总结通过本次实验,我们学习了多级文件目录的概念、结构和实现方法。
一个多用户多级目录结构文件系统设计与实现
操作系统课程设计姓名:学号:班级:电话:邮箱:课程设计题目:一个多用户多级目录结构文件系统设计与实现编译环境: Linux运行环境: Linux一、设计思想说明1 设计环境课程设计的环境是Linux 操作系统。
设计时可利用Linux 提供的文件管理的功能调用,建立一个模拟的文件系统。
基本思想是,在Linux 系统中创建一个较大容量的文件,作为所设计的文件系统的“文件卷”,并利用Linux 系统的功能调用,编写各程序模块。
2、文件卷的组织以 1M 的存储器空间作为文件空间,空间“分块”,编号为 0#~(BLKMAX-1)# 。
“分块”就是规定对文件卷的读/写以块为单位,每次读/写的起点为块大小的整倍数。
分块主要体现在文件卷的读/写模块上。
# define BSIZE 512 /* 512bytes/块 */# define BLKMAX 2048 /* 共2048 块 */0#块的作用: 0# 块是专用块(超级块)。
前半部用于存放文件卷空间的位示图(bitmap),位状态='0'表示对应块空闲,状态='1'表示已分配。
后半部的最后32 个字节用于存放根目录的目录结构。
0#块不参与文件空间的动态分配。
1#~(BLKMAX-1)#块用于存放文件(普通文件和子目录文件)的信息。
二、系统结构的说明本文件管理系统分为五层,上层调用下层,下层为上层服务。
以下为各层(由低到高)的简要说明:1、块管理层,通过TBlock类实现设下列主要函数:balloc()--块分配函数brelse()--块释放函数bread()—读一块函数bwrite()—写一块函数2、FCB管理层,通过TFcb类实现功能涉及到FCB结构的操作,定义了一些与FCB操作相关的函数3、打开文件管理层,通过TOFile类实现功能为涉及ofile结构的操作。
4、命令解释层,通过TEnter类和TOrder类实现功能为接受来自用户的命令,并解释、执行用户提出的文件访问操作。
多用户多级目录文件系统的实现_课程设计 推荐
课程设计课程名称_____操作系统____题目名称_多用户多级目录文件系统的实现_ 学生学院_____计算机学院_________文件管理系统一.设计目的:编写并调试一个树型目录结构的文件系统,模拟文件管理工作流程。
二.设计要求:①.设计多用户文件系统,采用多级文件目录。
②.至少要有十个以上的实用命令,应设置文件保护措施。
③.设计一个较实用的用户界面,方便用户使用,界面要为用户提供足够的选择信息,不需用户打入冗长的命令。
三.设计内容本程序设计了一个树形目录结构的文件管理系统,初始化系统默认根目录为root,根目录下为11个用户的注册目录,包括一个超级用户su和十个普通用户stud01~stud10,初始化的树形分支结构如下:rootsu stud01 stud02 stud03 stud04 stud05 stud06 stud07 stud08 stud09stud10初始化后各个用户注册目录下均为空,用户可进行创建编辑文件,显示文件内容,删除文件,复制文件,粘贴文件,创建目录,删除目录,更改工作目录,显示当前工作目录的全路径,显示当前目录下的全部内容,寻求帮助及用户切换等操作,当只有目录可以为分支节点创建其目录下的子目录或者文件(这里指的文件为除目录外的终端文件),也可以为叶子节点以待必要的时候在其目录下创建子目录或者文件使其成为分支节点,而文件只能是叶子节点。
程序运行时要求输入用户名及其密码,初始化时su和stud01~stud10相应的密码分别为su,01stud,02stud,03stud,04stud,05stud,06stud,07stud,08stud,09stud,10stud,系统将验证输入的用户名及其密码,并提示是否输入正确,错误要求重新输入。
用户密码只有超级用户su才能更改,普通用户没有权限进行此操作。
登录后系统在每个命令提示符前加【用户名】,表示当前的登录用户,若登录用户为su时,命令提示符为#符号,若为普通用户,命令提示符为$符号,而且工作目录也指向当前登录用户的注册目录下。
多文件编程实验报告
实验名称:多文件编程实践实验目的:1. 理解并掌握多文件编程的基本概念和原理。
2. 学习如何使用多个文件组织代码,提高代码的可读性和可维护性。
3. 掌握模块化编程的方法,提高代码的复用性和扩展性。
实验环境:1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm实验内容:本次实验以一个简单的计算器程序为例,通过创建多个文件来实现模块化编程。
一、项目结构设计项目目录结构如下:```calculator/│├── main.py├── calculator.py├── math.py└── __init__.py```其中:- `main.py` 为程序的主入口文件,负责调用其他模块的功能。
- `calculator.py` 定义了计算器的功能模块。
- `math.py` 定义了数学运算的函数。
- `__init__.py` 是一个空文件,用于标识当前目录是一个Python包。
二、代码实现1. `math.py` 文件```pythondef add(x, y):return x + ydef subtract(x, y):return x - ydef multiply(x, y):return x ydef divide(x, y):if y == 0:raise ValueError("除数不能为0")return x / y```2. `calculator.py` 文件```pythonfrom math import add, subtract, multiply, divideclass Calculator:def __init__(self):passdef add(self, x, y):return add(x, y)def subtract(self, x, y):return subtract(x, y)def multiply(self, x, y):return multiply(x, y)def divide(self, x, y):return divide(x, y)```3. `main.py` 文件```pythonfrom calculator import Calculatordef main():calc = Calculator()while True:print("请选择运算类型:")print("1. 加法")print("2. 减法")print("3. 乘法")print("4. 除法")print("5. 退出")choice = input("请输入选项:") if choice == '5':breakif choice not in ['1', '2', '3', '4']: print("无效选项,请重新输入!")continuenum1 = float(input("请输入第一个数:")) num2 = float(input("请输入第二个数:")) if choice == '1':result = calc.add(num1, num2)elif choice == '2':result = calc.subtract(num1, num2) elif choice == '3':result = calc.multiply(num1, num2) elif choice == '4':try:result = calc.divide(num1, num2) except ValueError as e:print(e)continueprint("运算结果:", result)if __name__ == '__main__':main()```三、实验总结通过本次实验,我们学习了多文件编程的基本概念和原理,了解了模块化编程的重要性。
文件系统实验3-另一份参考源码
实习四:文件系统实习一 . 目的要求1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二 . 例题:1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。
另外,为打开文件设置了运行文件目录(AFD)。
3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4、算法与框图:①因系统小,文件目录的检索使用了简单的线性搜索。
②文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。
③程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD)打开文件目录( AFD)(即运行文件目录)文件系统算法的流程图如下:实习总结:通过这次实习,更清楚的理解了文件系统的操作,同时也对C语言编程进行了巩固。
实习代码:#include "string.h"#include "stdio.h"#include "conio.h"#include "stdlib.h"#define L 6 /* 用户最多保存的文件数 */#define N 5 /* 系统可同时管理的用户数*/int U;typedef int SX;/*文件属性 1为只读,2为写,3为可读可写*/typedef int ZT;/*文件状态 1为建立,2为打开,3为关闭*/typedef int FLAG;/*是否空表目,0为空,1为非空*/static intmemo[128]={10,20,30,40,50,60,70,80,90,100,110,120,130,140,150};/*用户文件目录*/struct FCB{char filename[20];/*文件名*/SX access;/*文件属性*/int length;/*记录长度*/int address[5];/*文件地址*/FLAG flag;/*是否空表目,0为空*/};/*用户已打开文件表*/struct UOF1{char filename[20];/*文件名*/SX access;/*文件属性*/int length;/*记录长度*/ZT flag1;/*状态*/int write;/*写指针*/int read;/*读指针*/FLAG flag;int address[5];/*文件地址*/};struct FCB UFD[N][L]={{{"abc",2,3,{10,20,30},1},{"def",1,3,{40,50,60},1},{"wj",3,3,{70,80 ,90},1}},{{"xyz",1,1,{100},1},{"aaa",2,1,{110},1}},{{"yyx",1,1,{100},1},{"ccb",1,1,{120},1}},{{"ddd",1,3,{40,50,60},1}}};struct UOF1UOF[N][L]={{"abc",2,3,2,0,0,1,{10,20,30}},{"ccb",1,1,2,0,0,1,{120}}}; struct MFD1{char username[10];int count;int opencont;struct FCB *userfaddr;struct UOF1 *openfaddr;};struct MFD1MFD[N]={"A",3,0,UFD[0],UOF[0],"B",2,0,UFD[1],UOF[1],"C",2,0,UFD[2],UO F[2],"D",1,0,UFD[3],UOF[3]};/*在UFD中找空白表项*/selectUFD(){ int i;struct FCB *P=MFD[U].userfaddr;for(i=0;i<L;i++)if(P[i].flag==0) break;if(i<L) return i;else printf("没有空登记项,文件已满!\n");}/*在UOF中找空白表项*/selectUOF(){ int j;struct UOF1 *P=MFD[U].openfaddr;for(j=0;j<L;j++)if(P[j].flag==0) break;if(j<L) return j;else printf("没有空登记项,用户已打开文件列表已满!\n");}/*建立文件函数*/void creat(/*char filename[],int L,SX access*/){struct FCB *P=MFD[U].userfaddr;int I,J;int j,le,address;char s[20];char ac;printf("请输入文件名\n");scanf("%s",s);for(j=0;j<L;j++)if(strcmp(P[j].filename,s)==0){printf("有同名文件,不能创建!\n");break;}if(j==L){printf("文件长度:\n");scanf("%d",&le); getchar();printf("文件属性:\n");scanf("%d",&ac); getchar();I=selectUFD();J=selectUOF();/*找空登记项,*/strcpy(UFD[U][I].filename,s);UFD[U][I].length=le;UFD[U][I].access=ac;UFD[U][I].flag=1;strcpy(UOF[U][J].filename,s);UOF[U][J].length=le;UOF[U][J].access=ac;UOF[U][J].flag=1;printf("请输入第一个地址\n");scanf("%d",&address);for(j=0;j<128;j++){if(memo[j]==0){memo[j]=address;break;}}UFD[U][I].address[0]=address;UOF[U][J].flag1=1;UOF[U][J].write=address;MFD[U].count++;MFD[U].opencont++;printf("\n文件创建成功!\n");}} /*以上已调试完成!20101115*//*关闭文件函数*/void close(){ int i;char name[20];char noname[20]="00000000";printf("请输入文件名:\n");scanf("%s",name);for(i=0;i<L;i++)if(strcmp(UOF[i]->filename,name)==0)if(UOF[i]->flag1==1){UOF[i]->flag1=3;}else if(UOF[i]->flag1==2){strcpy(noname,UOF[i]->filename); UOF[i]->access=0;UOF[i]->length=0;UOF[i]->write=0;UOF[i]->flag=0;printf("文件成功关闭\n");break;}else printf("文件已经关闭!\n") ;}/*CLOSE 已经调试完成!*//*打开文件函数*/void open(){char na[20];int c;int x,m,j,i;printf("请输入要打开的文件名 \n");getchar(); gets(na) ;printf("你想对文件进行写还是读操作?\n");scanf("%d",&c); getchar();for(i=0;i<L;i++){if(strcmp(UFD[U][i].filename,na)==0){m=i;for(j=0;j<5;j++){if(strcmp(UOF[U][j].filename,na)==0){if(UOF[U][j].flag1==1){printf("文件正在被创建,不能打开!\n");break;}else{printf("文件已经打开\n");break;}}}if(j==5) /*UOF中没有该文件,即:该文件尚未打开*/ {if(UFD[U][m].access==c){for(x=0;x<5;x++)if(UOF[U][x].flag==0){strcpy(UOF[U][x].filename,UFD[U][m].filename);UOF[U][x].length=UFD[U][m].length;UOF[U][x].access=UFD[U][m].access;UOF[U][x].flag1=2;UOF[U][x].flag=1;UOF[U][x].read=UFD[U][m].address[0]; UOF[U][x].write=UFD[U][m].address[0]; printf("文件打开成功\n"); break;}}else printf("操作不合法,不能打开!\n"); break; }}if(i==L)printf("文件不存在,不能打开!\n");}}/*OPEN()已调试完!*//*写文件函数*/void write(){char nam[20];int i,j,n,b,e,k;int m=-1;static int ad[5];printf("请输入要进行写操作的文件名 \n");getchar();gets(nam);for(i=0;i<5;i++){if(strcmp(UOF[U][i].filename,nam)==0){if(UOF[U][i].flag1==1)/*文件为建立状态*/{m=i;for(e=1;e<UOF[U][m].length;e++){printf("输入地址%d\n",e);scanf("%d",&ad[e]);for(k=0;k<20;k++)if(ad[e]==memo[k]){printf("the address%d is wrong and input another one\n",e);scanf("%d",&ad[e]); break;}for(j=0;j<128;j++){if(memo[j]==0){memo[j]=ad[e];break;}}UOF[U][m].address[e]=ad[e];UOF[m]->write=ad[e];}printf("写文件成功!\n");break;}else /*不是建立状态*/if(UOF[U][i].access==1){printf("操作不合法,不能写!\n");break;}else{printf("是顺序修改吗?1为顺序,0为非顺序 1/0?\n");scanf("%d",&n);if(n==1){for(e=0;e<UOF[U][m].length;e++){UOF[U][m].write=UOF[U][m].address[e] ;printf("本记录%d修改完成!,UOF[m].address[e]\n");}printf("写文件成功!\n");break;}else{printf("想修改哪条记录?\n");scanf("%d",&b);printf("the %d record is %d",b,UOF[U][m].address[b]);UOF[U][m].write=UOF[U][m].address[b] ;printf("本记录%d修改完成!,UOF[m].address[e]\n");printf("写文件成功!\n");break;}}}}if(i==5) printf("文件尚未建立或打开,不能写! \n"); }void read(){char nam[20];int i,le,m=-1;static int ad[5];int ipaddress;printf("请输入要进行读操作的文件名 \n");getchar();gets(nam);printf("请输入读长度\n");scanf("%d",&le);for(i=0;i<5;i++)/*检查文件是否已经打开*/if(strcmp(UOF[U][i].filename,nam)==0)m=i;if(i==5) printf("文件尚未打开,不能读!\n");else{ipaddress=UOF[U][m].read;for(i=0;i<le;i++)printf("%d",ipaddress++);UOF[U][m].read=ipaddress;printf("读文件成功!\n");}}delet(){ char noname[20]="00";struct FCB *P=MFD[U].userfaddr;int I;int j,i;char s[20];printf("请输入文件名\n");scanf("%s",s);for(j=0;j<L;j++)if(strcmp(P[j].filename,s)==0){printf("有该文件!\n");I=j;for(i=0;i<20;i++)/*检查文件是否已经打开*/ if(strcmp(UOF[i]->filename,s)==0){strcpy(noname,UOF[i]->filename);UOF[i]->access=0;UOF[i]->length =0;UOF[i]->write =0;UOF[i]->flag=0;}strcpy(noname,UFD[I]->filename);UFD[I]->access=0;UFD[I]->length=0;UFD[I]->address[0]=0;UFD[I]->flag=0;}printf("文件不存在,或文件已经撤销!\n");}/*显示函数*/void print_UFD(){int i ;printf("num filename access length flag ad1 ad2 ad3 ad4 ad5 \n ");for(i=0;i<5;i++)printf("\n%d\t%s\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\n",i,UFD [U][i].filename,UFD[U][i].access,UFD[U][i].length,UFD[U][i].flag,UFD[ U][i].address[0],UFD[U][i].address[1],UFD[U][i].address[2],UFD[U][i]. address[3],UFD[U][i].address[4]);}void print_UOF(){int i;printf("num filename access length flag write read flag1 \n ");for(i=0;i<5;i++)printf("\n%1d\t%s\t%d\t%d\t%d\t%d\t%d\t%dn",i,UOF[U][i].filename,UOF[ U][i].access,UOF[U][i].length,UOF[U][i].flag,UOF[U][i].write,UOF[U][i ].read,UOF[U][i].flag);}void main(){char name[20];int i,a;printf("欢迎使用文件管理系统 .\n");printf("\n请输入用户名\n") ;LL:scanf("%s",name); getchar();for(i=0;i<N;i++){if(strcmp(MFD[i].username,name)==0){U=i;while(1){printf("\n***************欢迎***************\n");printf("1:——————建立文件操作——————.\n");printf("2:——————打开文件操作——————.\n");printf("3:——————关闭文件操作——————.\n") ;printf("4:——————读文件操作——————.\n");printf("5:——————写文件操作——————。
操作系统-文件系统课程设计报告(附源码)
操作系统课程设计题目文件系统学院计算机学院专业计算机科学与技术年级班别 10级7 班学号 3110006154 学生姓名指导教师刘老师20年月日文件系统一、课程设计的内容:模拟文件系统实现的基本功能,了解文件系统的基本结构和管理方法,加深理解文件系统的内部功能及内部实现。
通过用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
二、可行性分析:可行性分析是通过对项目的主要内容和配套条件,并通过对各方面进行调查研究和分析比较,并对项目建成以后所带来的影响,从而提出该项目是否值得投资和如何进行建设的咨询意见,是一种综合性的系统分析方法。
可行性分析应具有预见性、公正性、可靠性、科学性的特点。
这里以三个方面来分析此次设计:经济可行性、技术可行性、法律可行性。
1、经济可行性:编写该文件系统,只需要用到PC机和VC++6.0编程软件,不需要花费金钱,所以,在经济方面,这个课程设计适合做。
2、技术可行性:在做这个课程设计,事先需要掌握的知识有C/C++语言,数据结构,操作系统,PC机的基本操作和VC++6.0软件的使用方法等。
目前,这些知识都已经学习并掌握了,所以在技术方面,这个课程设计也适合做。
3、法律可行性:做这个课程设计,只是为了掌握文件系统的基本内容,提升自己的编程能力,没有违反法律法规,所以,在法律方面,这个课程设计也适合做。
三、需求分析1.设计一个多用户多级目录文件管理系统。
2.要设计多个实用命令并设置文件保护措施。
3.设计一个较实用的用户界面,方便用户使用,界面要为用户提供足够的选择信息,不需用户打入冗长的命令4. 功能简介:①多用户管理,多级目录形式。
②基本的文件操作功能,如新建文件、打开文件、写入文件、关闭文件、读取文件等。
③用户间文件的共享功能四、概要设计(逻辑图)1.系统结构图:2、界面简单说明该系统主要分为两个界面,用户操作界面及文件操作管理界面。
文件管理系统源代码
文件管理系统一、实验目的通过设计一个多用户文件系统, 了解操作系统中文件的组织与管理, 熟悉文件管理所用 的数据结构,加深对文件系统内部功能实现过程的理解。
二、实验内容1.用 C 语言或 C++ 语言设计一个最多包括 N 个用户的多用户文件系统, 约定每个用户 最多保存 M 个文件。
同时限制一个用户在进入系统后,最多打开 L 个文件。
2.系统应具备一定的健壮性。
即能够检查用户所输入命令的正确性,出错时显示出必 要的信息。
另外,对文件需设置必要的保护措施。
3.文件目录结构采用两级目录结构 : 主文件目录和用户文件目录#include"io.h" #include"conio.h" #include"stdio.h" #include"stdlib.h"#include"malloc.h" #include"string.h" #include"ctype.h" #define N 30 #define M 20 #define L 5 typedef struct MFD {char username[100];char password[100];FILE fp;/*文件指针 */}MFD;/////////// typedef struct UFD /* 用户文件目录 */ { char filename[256];char protect; /* 保护码 */int length; /* 文件长度 */ }UFD;////////// typedef struct OFD{charfilename[256]; char opencode; /* 打开保护码 */ int fp; /* 读写指针 */}OFD;/* 用户数 *//* 一个用户可保存 M 个文件*/ /*用户只能一次打开 L 个文件 */ /* 主文件目录 */ /* 打开文件目录 */////////// typedef struct COMM /* 命令串 */{char string[256]; /* 命令 */struct COMM *next;/* 后继指针 */ }COMM;////////////MFD mainfd[N];UFD userfd[M];OFD openfd[L];////////COMM*command; charusername[10];int usernum,savenum,opennum; int workfile;void init();void init_ufd(char*username);/* voidmesg(char *str);char *getpass();char *getuser();COMM *readcommand();void login();void logout();void setpass();void create();void mydelete();void myread();void myopen();void myclose();void mywrite();void help();void dir();void mycopy();void myrename();/////////////初始化用户文件目录 */ /*消息 */ /* 设置口令函数声明 */ /* 设置用户函数声明 */ /* 读命令串函数声明 */ /* 用户登录 */ /* 用户注销 */ /* 设置口令 */ /* 创建文件 */ /* 删除文件 */ /* 读文件 */ /* 打开文件 */ /* 关闭文件 */ /* 写文件 */ /*帮助 */ /* 列文件目录 */ /* 复制文件 */ /* 重命名文件名 */void main(){init();for(;;)readcommand();if(strcmp(command->string,"create")==0)create();else if(strcmp(command->string,"delete")==0)/* 主文件目录数组 */ /* 用户文件目录数组 */ /* 打开文件目录数组 */mydelete();else if(strcmp(command->string,"open")==0)myopen();else if(strcmp(command->string,"close")==0)myclose();else if(strcmp(command->string,"read")==0)myread();else if(strcmp(command->string,"write")==0)mywrite();else if(strcmp(command->string,"copy")==0)mycopy();else if(strcmp(command->string,"rename")==0)myrename();else if(strcmp(command->string,"login")==0)login();else if(strcmp(command->string,"setpass")==0)setpass();else if(strcmp(command->string,"logout")==0)logout();else if(strcmp(command->string,"help")==0)help();else if(strcmp(command->string,"dir")==0) dir();else if(strcmp(command->string,"exit")==0)break;elsemesg("Bad command!");}}///////////////////void init(){FILE *fp;char tempname[20],temppass[20];int i=0;usernum=0;savenum=0;opennum=0;strcpy(username,"");if((fp=fopen("mainfile.txt","r"))!=NULL) {while(!feof(fp))strcpy(tempname,"");fgets(tempname,20,fp);if(strcmp(tempname,"")!=0){{fgets(temppass,20,fp);tempname[strlen(tempname)-1]='\0';temppass[strlen(tempname)-1]='\0';strcpy(mainfd[usernum].username,tempname);strcpy(mainfd[usernum].password,tempname); usernum++;}}fclose(fp);}}///////////////////////void init_ufd(char *username)/* 初始化用户文件目录*/ {FILE *fp;char tempfile[100],tempprot;int templength;savenum=0;opennum=0;workfile=-1;if((fp=fopen(username,"w+"))!=NULL){while(!feof(fp)){strcpy(tempfile,"");fgets(tempfile,50,fp);if(strcmp(tempfile,"")!=0){fscanf(fp,"%c",&tempprot);fscanf(fp,"%d",&templength);tempfile[strlen(tempfile)-1]='\0';strcpy(userfd[savenum].filename,tempfile); userfd[savenum].protect=tempprot;userfd[savenum].length=templength;savenum++;fgets(tempfile,50,fp);}fclose(fp);}////////////////////void mesg(char *str){printf("\n %s\n",str);}////////////////////////////char *getuser(){char username[20];char temp;int i;username[0]='\0';for(i=0;i<10;){while(!kbhit());temp=getch();if(isalnum(temp)||temp=='_'||temp==13) {username[i]=temp; if(username[i]==13){username[i]='\0'; break;}putchar(temp);i++;username[i]='\0';}}return(username);}///////////////////char *getpass(){char password[20];char temp;int i;password[0]='\0';for(i=0;i<10;)while(!kbhit());temp=getch();{if(isalnum(temp)||temp=='_'||temp==13){password[i]=temp;if(password[i]==13){password[i]='\0';break;}putchar('*');i++;password[i]='\0';}}return(password);}///////////////COMM *readcommand(){char temp[256];char line[256];int i,end;COMM *newp,*p;command=NULL;strcpy(line,""); while(strcmp(line,"")==0){printf("\nc:\\>");gets(line);}for(i=0;i<=strlen(line);i++){if(line[i]==' ')i++;end=0;while(line[i]!='\0'&&line[i]!=' '){temp[end]=line[i];end++;i++;}if(end>0)temp[end]='\0';newp=(COMM *)malloc(sizeof(COMM *));{strcpy(newp->string,temp);newp->next=NULL;if(command==NULL) command=newp;else{p=command;while(p->next!=NULL) p=p->next;p->next=newp;}}} p=command;return(command);}/////////////////////////////void login() /* 用户注册*/{FILE *fp;int i;char password[20],confirm[20],tempname[20]; if(command->next==NULL){printf("\n User Name:"); strcpy(tempname,getuser());}else if(command->next->next!=NULL){mesg("Too many parameters!");return;}else strcpy(tempname,command->next->string);for(i=0;i<usernum;i++) if(strcmp(mainfd[i].username,tempname)==0)break; /* 从mainfd 表中查找要注册的用户*/ if(i>=usernum) /* 新用户*/{printf("\n new user account,enter your password twice!"); printf("\nPassword:");strcpy(password,getpass());/* 输入口令且返回之*/ printf("\nPassword:");strcpy(confirm,getpass()); /* 第二次输入口令*/if(strcmp(password,confirm)==0)/* 用户数不能超过N*/ {if(usernum>=N)mesg("Create new account false!number of user asscount limited.\n login fasle!");else{strcpy(mainfd[usernum].username,tempname);/* 把新用户和口令填入mainfd 中*/strcpy(mainfd[usernum].password,password); usernum++;strcpy(username,tempname);mesg("Create a new user!\n login success!");init_ufd(username); /* 初始化用户文件目录*/fp=fopen("mainfile.txt","w+"); /* 把新用户填入mainfile.txt 文件中*/for(i=0;i<usernum;i++){fputs(mainfd[i].username,fp); fputs("\n",fp);fputs(mainfd[i].password,fp);fputs("\n",fp);}fclose(fp);}}else{mesg("Create new account false! Error password.");mesg("login false!");}}else{printf("\n Password:"); strcpy(password,getpass());if(strcmp(mainfd[i].password,password)!=0)mesg("Login false! Error password.");else{mesg("Login success!");strcpy(username,tempname);init_ufd(username);}}}/////////////////////////void logout() /* 用户注销*/{ if(command->next!=NULL)mesg("Too many parameters!");else if(strcmp(username,"")==0)mesg("No user login!");else { strcpy(username,""); opennum=0; savenum=0; workfile=-1; mesg("Userlogout!");}}////////////////////void setpass() /* 修改口令*/{int i=0;FILE *fp;char oldpass[20],newpass[20],confirm[20]; if(strcmp(username,"")==0) mesg("No user login!");else {printf("\n Old password:"); strcpy(oldpass,getpass()); for(inti=0;i<usernum;i++) {if(strcmp(mainfd[i].username,username)==0) break;} if(strcmp(mainfd[i].password,oldpass)!=0) mesg("Old password error!");else{printf("\n New password:"); strcpy(newpass,getpass()); printf("\nConfirm password:");文件管理系统源代码{strcpy(confirm,getpass()); if(strcmp(newpass,confirm)!=0) mesg("Password not change! confirm different.");else{ strcpy(mainfd[i].password,newpass); mesg(" Password change !");fp=fopen("mainfile.txt","w+"); for(i=0;i<usernum;i++) {fputs(mainfd[i].username,fp); fputs("\n",fp);fputs(mainfd[i].password,fp);fputs("\n",fp);}fclose(fp);}}}}////////////////void create(){int i=0;FILE *fp;if(strcmp(username,"")==0)mesg("No user lgoin!");else if(command->next==NULL) mesg("Too few parametets!");else if(command->next->next!=NULL)mesg("Too many parameters!");else{for(i=0;i<savenum;i++){if(strcmp(userfd[i].filename,command->next->string)==0) break;}if(i<savenum)mesg("Error! the file already existed!");else if(savenum>=M)mesg("Error! connot create file! number of files limited!"); elsestrcpy(userfd[savenum].filename,command->next->string);userfd[i].protect='r';userfd[i].length=rand();savenum++; mesg("Create file success!"); fp=fopen(username,"w+");for(i=0;i<savenum;i++){ fputs(userfd[i].filename,fp); fputs("\n",fp);fprintf(fp,"%c\n%d\n",userfd[i].protect,userfd[i].length);} fclose(fp);}}}/////////////////void mydelete() /* 删除*/{int i=0;int tempsave=0;FILE *fp; if(strcmp(username,"")==0) mesg("No user lgoin!");else if(command->next==NULL)mesg("Too few parametets!");else if(command->next->next!=NULL) mesg("Too many parameters!");else { for(i=0;i<savenum;i++) {if(strcmp(userfd[i].filename,command->next->string)==0) break;}if(i>=savenum)mesg("Error! the file not existed!"); else{ tempsave=i; for(i=0;i<opennum;i++) {if(strcmp(command->next->string,openfd[i].filename)==0) break;} if(i>=opennum) mesg("File not open");////////////////////////////////////////////else{ if(tempsave==savenum-1) savenum--;else{ for(;tempsave<savenum-1;tempsave++){ strcpy(userfd[tempsave].filename,userfd[tempsave+1].filename);userfd[tempsave].protect=userfd[tempsave+1].protect;userfd[tempsave].length=userfd[tempsave+1].length;}savenum--;} mesg("Delete file success!"); fp=fopen(username,"w+");for(i=0;i<savenum;i++){ fputs(userfd[i].filename,fp); fputs("\n",fp);fprintf(fp,"%c\n%d\n",userfd[i].protect,userfd[i].length);} fclose(fp);}}}}//////////////////void myread() /*读*/{int i=0;int tempsave=0;char tempfile[100]; if(strcmp(username,"")==0) mesg("No user lgoin!");else if(command->next==NULL)mesg("Too few parametets!");else if(command->next->next!=NULL)mesg("Too many parameters!");else{strcpy(tempfile,command->next->string); for(i=0;i<savenum;i++){ if(strcmp(tempfile,userfd[i].filename)==0) break;} if(i>=savenum) mesg("File not existed!");else{tempsave=i;for(i=0;i<opennum;i++){ if(strcmp(tempfile,openfd[i].filename)==0) break;} if(i>=opennum) mesg("File not opened");else{ if(userfd[tempsave].length<1000) printf("\n The file size is %dKB",userfd[tempsave].length);else if(userfd[tempsave].length==1000) printf("\n The file size is1000 KB");elseprintf("\n The file size is%d,%d KB",userfd[tempsave].length/1000,userfd[tempsave].length%1000);mesg("File read");}}}}/////////////////void myopen()/* 打开*/{int i=0;int type=0;char tempcode;char tempfile[100];if(strcmp(username,"")==0)mesg("No user login!");else if(command->next==NULL)mesg("Too few parameters!");else{strcpy(tempfile,"");文件管理系统源代码tempcode='r';if(strcmp(command->next->string,"/r")==0){tempcode='r';type=1;}else if(strcmp(command->next->string,"/w")==0){tempcode='w';type=1;}else if(strcmp(command->next->string,"/d")==0){tempcode='d';type=1;}else if(command->next->string[0]=='/')mesg("Error! /r/w/d request!");else if(command->next->next!=NULL)mesg("Too many parameters!");elsestrcpy(tempfile,command->next->string);if(type==1){if(command->next->next!=NULL){if(command->next->next->next!=NULL) mesg("Too many parameters!");else strcpy(tempfile,command->next->next->string);}elsemesg("Too few parameters!");}if(strcmp(tempfile,"")){for(i=0;i<savenum;i++){if(strcmp(tempfile,userfd[i].filename)==0) break;if(i>=savenum)mesg("File not existed!");else{for(i=0;i<opennum;i++){if(strcmp(tempfile,openfd[i].filename)==0)break;}if(i<opennum){mesg("File already opened!");if(openfd[i].opencode!=tempcode){openfd[i].opencode=tempcode;mesg("File permission changed!");}}else if(opennum>=L){mesg("Error! connot open file! number of opened fileslimited!");}else{ strcpy(openfd[opennum].filename,tempfile);openfd[opennum].opencode=tempcode; workfile=opennum;opennum++;mesg("File open success!");}}}}}///////////////////////void myclose()/* 关闭*/{int i=0;int tempsave=0;char tempfile[100];if(strcmp(username,"")==0)mesg("No user lgoin!");else if(command->next==NULL)mesg("Too few parametets!");else if(command->next->next!=NULL)mesg("Too many parameters!");else{ strcpy(tempfile,command->next->string); for(i=0;i<savenum;i++){ if(strcmp(tempfile,userfd[i].filename)==0) break;} if(i>=savenum) mesg("File not existed!");else{for(i=0;i<opennum;i++){ if(strcmp(tempfile,openfd[i].filename)==0) break;}if(i>=opennum) mesg("File not opened");else{if(i==opennum-1) opennum--;else{ for(;i<opennum-1;i++) {strcpy(openfd[i].filename,openfd[i+1].filename);openfd[i].opencode=openfd[i+1].opencode;} opennum--;} mesg("Close file success!");}}}}/////////////////////////void mywrite()/* 写*/{int i=0;文件管理系统源代码int tempsave=0;char tempfile[100]; if(strcmp(username,"")==0)mesg("No user lgoin!");else if(command->next==NULL) mesg("Too few parametets!");else if(command->next->next!=NULL) mesg("Too many parameters!");else{ strcpy(tempfile,command->next->string);for(i=0;i<savenum;i++){if(strcmp(tempfile,userfd[i].filename)==0)break;}if(i>=savenum) mesg("File not existed!");else{tempsave=i;for(i=0;i<opennum;i++){if(strcmp(tempfile,openfd[i].filename)==0)break;}if(i>=opennum) mesg("File not opened");else{mesg("File write");int tt=rand();if(userfd[tempsave].length<=1000)printf("\n The file size from %d KB to %dKB",userfd[tempsave].length,userfd[tempsave].length+tt);/* else if(userfd[tempsave].lenght=1000)printf("\n The file size from 1000 KB");*/ elseprintf("\n The file size form %d,%d KB to %d,%dKB",userfd[tempsave].length/1000,userfd[tempsave].length%1000,userfd[tempsave].lengt h+tt/10 00,userfd[tempsave].length+tt%1000);userfd[tempsave].length=userfd[tempsave].length+tt;}}}///////////////////void help()/* 帮助*/{static char *cmd[]={"login","setpass","logout","create","open","read","write","close","delete","dir","help","exit","copy","rename"};static char *cmdhlp[]={"aommand format: login [<username>]","command format:setpass","command format:logout","command format:create <filename>","command format:open [/r/w/d] <filename>","command format:read <filename>","command format:write <filename>","command format:close <filename>","command format:delete <filename>","command format:dir [/u/o/f]","command format:help [<command>]","command format:exit","command format:copy <source filename> <destination filename>","command format:rename <old filename> <new filename>"};static char *detail[]={"explain:user login in the file system.","explain:modify the user password.","explain:user logout the file system.","explain:creat a new file.","explain:/r -- read only [deflaut]\n\t /w -- listopened files \n\t/d --read,modify and delete.","explain:read the file.","explain:modify the file.","explain:close the file.","explain:delete the file.","explain:/u -- list the user account\n\t /0 -- listopened files\n\t/f --list user file[deflaut].","explain:<command> -- list the command detail format and explain.\n\t [deflaut] list the command.","explain:exit from the file sysytem.","explain:copy from one file to another file.","explain:modify the file name."};int helpnum=14;int i=0;if(command->next==NULL){mesg(cmdhlp[10]);mesg(detail[10]);mesg("step 1: login");printf("\t if old user then login,if user not exist then create new user");mesg("step 2: open the file for read(/r),write(/w)or delete(/d)");printf("\t you can open one or more files.one command can open one file");mesg("step 3: read,write or delete some one file");printf("\t you can operate one of the opened files.one command can open onefile"); mesg("step 4: close the open file");printf("\t you can close one of the opened files.one command can open onefile"); mesg("step 5: user logout.close all the user opened files");printf("\n command list:");for(i=0;i<helpnum;i++){if(i%4==0) printf("\n");printf(" %-10s",cmd[i]);}}else if(command->next->next!=NULL)mesg("Too many parameters!");else{for(i=0;i<helpnum;i++){ if(strcmp(command->next->string,cmd[i])==0) break;}if(i>=helpnum)mesg("the command not existed!");else{mesg(cmdhlp[i]); mesg(detail[i]);}}}//////////////////////void dir()/* 列目录文件*/{int i=0;int type=0;char tempcode;if(strcmp(username,"")==0)mesg("No user login!");else{if(command->next==NULL){tempcode='f';else{ if(strcmp(command->next->string,"/u")==0) {tempcode='u';}else if(strcmp(command->next->string,"/o")==0){tempcode='o';}else if(strcmp(command->next->string,"/f")==0){tempcode='f';}else if(command->next->string[0]=='/') mesg("Error! /u/o/f request!");elseif(command->next->next!=NULL)mesg("Too many parameters!");}if('u'==tempcode){printf("list the user account\n"); printf("usename\n");for(i=0;i<usernum;i++){ printf("%s\n",mainfd[i].username);}}else if('f'==tempcode){printf("list opened files\n"); printf("filename length protect\n");for(i=0;i<savenum;i++){ printf("%s%s%d%s%s%c\n",userfd[i].filename," ",userfd[i].length,"KB"," ",userfd[i].protect);}else if('o'==tempcode){printf("list user files\n");printf("filename opencode\n"); for(i=0;i<opennum;i++){ printf("%s%s%c\n",openfd[i].filename,"}",openfd[i].opencode);}}}/////////////////////////void mycopy()/* 复制*/{char sourfile[256],destfile[256];int i=0,j=0,temp=0;FILE *fp;char tempchar;if(strcmp(username,"")==0)mesg("No user lgoin!");else if(command->next==NULL)mesg("Too few parametets!");else if(command->next->next==NULL)mesg("Too few parametets!");else if(command->next->next->next!=NULL)mesg("Too many parameters!");else{strcpy(sourfile,command->next->string);strcpy(destfile,command->next->next->string); for(i=0;i<savenum;i++){if(strcmp(sourfile,userfd[i].filename)==0) break;}temp=i;if(i>=savenum)printf("\n the source file not eixsted!");else{ for(i=0;i<opennum;i++) {if(strcmp(sourfile,openfd[i].filename)==0) break;}if(i>=opennum)printf("\n the source file not opened!");else{for(j=0;j<opennum;j++){if(strcmp(destfile,openfd[i].filename)==0)break;}if(j<opennum)文件管理系统源代码mesg("Error! the destination file opened,you must close it first."); else{for(j=0;j<savenum;j++){if(strcmp(destfile,userfd[i].filename)==0)break;}if(j<savenum){mesg("Warning! the destination file exist!");printf("\n Are you sure to recover if ? [Y/N]");while(!kbhit());tempchar=getch();if(tempchar=='N'||tempchar=='n')mesg("Cancel! file not copy.");else if(tempchar=='Y'||tempchar=='y'){mesg("File copy success!file recovered!");userfd[j].length=userfd[i].length;userfd[j].protect=userfd[i].protect;fp=fopen(username,"w+");for(i=0;i<savenum;i++){fputs(userfd[i].filename,fp);fputs("\n",fp);fprintf(fp,"%C\n%d\n",userfd[i].protect,userfd[i].length);}fclose(fp);}}else if(savenum>=M)mesg("copy false! file total limited.");else{strcpy(userfd[savenum].filename,destfile);userfd[savenum].length=userfd[temp].length;userfd[savenum].protect=userfd[temp].protect;savenum++;fp=fopen(username,"w+");for(i=0;i<savenum;i++){fputs(userfd[i].filename,fp);fputs("\n",fp);fprintf(fp,"%c\n%d\n",userfd[i].protect,userfd[i].length);}fclose(fp);mesg("File copy success!");}}}}}}///////////////////////void myrename()/* 文件重命名*/{char oldfile[256],newfile[256];int i=0,temp=0;if(strcmp(username,"")==0)mesg("No user lgoin!");else if(command->next==NULL)mesg("Too few parametets!");else if(command->next->next==NULL)mesg("Too few parametets!");else if(command->next->next->next!=NULL)mesg("Too many parameters!");else{strcpy(oldfile,command->next->string);strcpy(newfile,command->next->next->string);for(i=0;i<savenum;i++){if(strcmp(oldfile,userfd[i].filename)==0)break;}} }temp=i;if(temp>=savenum)printf("\n the source file not eixsted!");else if(temp!=i&&i<savenum){printf("\n newfile and the existing files is the same name, please re-naming!"); } else{for(i=0;i<opennum;i++){if(strcmp(oldfile,openfd[i].filename)==0) break;}if(i>=opennum)printf("\n the source file not opened!");else if(strcmp(oldfile,newfile)==0){printf("Rename false! oldfile and newfile can not be the same.");}else{ strcpy(openfd[i].filename,newfile);strcpy(userfd[temp].filename,newfile); mesg("Rename filesuccess!\n");}。
文件系统实验报告
文件系统实验报告实验四文件系统实验一.目的要求1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个n个用户的文件系统,每次用户可保存m 个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二.例题:1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2、程序采用二级文件目录和用户文件目录。
另外,为打开文件设置了运行文件目录。
3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4、算法与框图:①因系统小,文件目录的检索使用了简单的线性搜索。
②文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
③程序中使用的主要设计结构如下:主文件目录和用户文件目录打开文件目录文件系统算法的流程图如下:三. 实验题:1、增加2~3个文件操作命令,并加以实现。
#include#include#include#include#define MAXSIZE 100#define ADDSIZE 50#define PT elem+l-> length#define N 4typedef struct term{/*班级和学期的结构体*/char class1[10];char term1[10];}term;typedef struct student{/*学生成绩信息的结构体*/ term st;/*班级和学期结构体放于此结构体中*/ char num[10];char name[12];float course[4];float total;float average;int bit;}lnode,*stu;typedef struct{lnode *elem;/*指向上个结构体的指针*/int size;/*最大能放lnode结构体成员的个数*/ int length;/*当前长度*/}sqack,*sq;sqack *l;void init/*动态分配存储空间*/{l-> elem=malloc);l-> length =0;l-> size=MAXSIZE;}void input/*输入学生的信息*/{lnode *newbase,*p;char cla[10],ter[10],ch;int n,i;if{newbase=realloc*sizeof);/*追加存储空间*/ l-> elem =newbase;l-> size +=ADDSIZE;}p=l-> elem;do{printf;gets;gets;printf;scanf;printf;for{scanf;strcpy;strcpy;++l-> length ;}printf “);ch=getchar;}while;}void change/*修改学生的信息*/{lnode *p;lnode e;int flag=1,i;char s1[10],num1[10];printf:\n “);gets;gets;p=l-> elem ;while && flag==1)/*查找要修改的学生的信息*/ {if==0&&strcmp==0)flag=0;/*找到了*/p++;}p--;if printf;printf;forprintf;printf;printf;scanf;forscanf;*p=e;}void same /*把学期和班级相同的学生信息放在结构体数组tt 中*/ {int i=0;lnode *p,*q;q=t;p=l-> elem ;while{if==0&&strcmp==0){*q=*p;q++;i++;}p++;*k=i;}void sort/*按学生成绩从高到低排序函数*/ {int i;lnode *q,temp;for{q-> total =0;forq-> total =q-> total +q-> course [i];q-> average =q-> total /N;}forforif-> total){temp=*q;*q=*;*=temp;}}void print/*输出学生的成绩*/lnode *p;p=q;for{printf;forprintf;printf;printf;}}void stat/*统计学生的成绩*/ {lnode tt[50];char ter[10],clas[10];int i,k;printf:\n “);forter[i]=getchar;forclas[i]=getchar;same;/*把学期和班级相同的学生信息放在结构体数组tt中*/ sort;/*按学生成绩从高到低排序函数*/print;/*输出学生的成绩*/}void search1/*按学号查*/{lnode *p;char ter1[10];int i,flag=1;p=l-> elem;printf;gets;for{if==0){flag=0;printf;printf;forprintf;printf;printf;}}if printf;}void search2/*按姓名查*/ {lnode *p;char ter1[10];int i,flag=1;p=l-> elem;printf;gets;for{if==0){flag=0;printf;printf;forprintf;printf;}}if printf ;}void search/*查找学生的成绩*/ {char ch;do{printf;ch=getchar;switch{case ‘1 ‘:search1;break;case ‘2 ‘:search2;break;default:}printf “);ch=getchar;} while;}void fail/*查找不及格及学生名单*/ {int i;lnode *p;for{forif{printf;forprintf;printf;printf;}}}void output/*按班级输出学生的成绩单*/{lnode tt[50];int k;char clas[10],ter1[10];printf; gets;gets;same;/*把学期和班级相同的学生信息放在结构体数组tt中*/ print;/*输出学生的成绩*/}试验四文件系统一、实验目的1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
文件系统实验报告
char name[12];
curuser = getspace(MFD);
while(1)
{
cout<<"\n ;<endl;
cout<<"用户名:";
cin>>name; //输入用户注册名
}
}
void DisplayUFD()//打印用户信息,包括用户的各个文件
//名称、长度和操作权限的设置信息
{
if(curuser->filepoint == false)//当前用户目录下没有任何文件存在
cout<<"\n用户 "<<curuser->username<<" 文件夹是空的"<<endl;
二、实验题目:
采用二级目录结构实现磁盘文件操作。
要求:
1.普通文件的目录项包括文件名,文件类型,文件长度,指向文件内容的指针内容。
2.目录文件的目录项包括目录名,指向下一级目录块的指针内容。假定每个目录文件最多只能占用一个块;
3.程序功能方面的要求: 需要实现一个命令行操作界面,包含如下命令:
4.程序实现方面的要求:
{
cout<<"\n保存错误。";//fclose(infile);
return;
}
else
{
if((outfile=fopen(out,"wb+"))==NULL)//申请一个缓冲区管理模块
操作系统实验---文件系统
实验报告实验题目:文件系统姓名:学号:课程名称:操作系统所在学院:信息科学与工程学院专业班级:计算机任课教师:实验项目名称文件系统一、实验目的与要求:1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及其内部实现。
2、熟悉文件管理系统的设计方法,加深对所学各种文件操作的了解及其操作方法的特点。
3、通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
4、通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
二、实验设备及软件:一台PC(Linux系统)三、实验方法(原理、流程图)试验方法(1)首先应当确定文件系统的数据结构:主目录、子目录以及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建文件,可以编号存储于磁盘上。
如file0,file1,file2…并以编号作为物理地址,在目录中登记。
文件系统功能流程图图1.文件系统总体命令分析图 2.登录流程图图 3. ialloc流程图图4.balloc流程图图5.密码修改流程图图6.初始化磁盘图 7.显示所有子目录 dir/ls 操作流程图图8.创建文件 creatfile 、创建目录 mkdir 流程图图9.改变当前路径 cd 操作流程图实验原理1.文件操作◆mkdir 创建目录文件模块,输入 mkdir 命令,回车,输入文件名,回车,即会在当前目录文件下创建一个名为刚刚输入的文件名的目录文件。
在该创建过程中首先要判断该目录中有没有同名的文件,如果有的话就创建失败,还要判断在该目录下有没有创建文件的权限,有权限才可以创建。
具体流程图查看第二节,系统流程图设计部分。
◆del 删除文件模块,输入 del命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。
在该删除过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有删除文件的权限,有权限才可以删除。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广东工业大学课程设计任务书(源代码在附录)题目名称多用户多级目录文件系统的实现学生学院计算机学院专业班级2008级软件工程2班姓名锟学号6900一、课程设计的内容本课程设计要求设计一个模拟的多用户多级目录的文件系统。
通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
二、课程设计的要求与数据1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2.文件物理结构可采用显式链接或其他方法。
3.磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。
5.设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:(1)具有login (用户登录)(2)系统初始化(建文件卷、提供登录模块)(3)文件的创建: create(4)文件的打开:open(5)文件的读:read(6)文件的写:write(7)文件关闭:close(8)删除文件:delete(9)创建目录(建立子目录):mkdir(10)改变当前目录:cd(11)列出文件目录:dir(12)退出:logout6.系统必须可实际演示,选用程序设计语言:C++、C等。
目录一、设计思想说明 (2)1.1设计环境 (2)1.2设计思想 (2)1.3存储空间管理 (2)1.4目录结构 (2)二、数据结构 (3)2.1虚拟磁盘 (3)2.2用户的数据文件 (3)2.3目录文件 (3)2.4管理目录文件的类 (3)2.5管理用户的类 (4)三、功能实现 (4)3.1登陆系统 (4)3.2系统初始化 (4)3.3文件的创建 (5)3.4文件的打开 (5)3.5文件删除 (5)3.6文件的读 (5)3.7创建目录 (5)3.8查看当前目录 (5)3.9删除目录 (5)3.10返回上一级目录 (5)3.11退出 (5)四、操作思想 (5)五、界面演示 (6)5.1登陆界面 (6)5.2管理员登陆成功后的界面 (6)5.3用户登陆成功后的界面 (6)六、系统具体运行演示 (7)6.1文件的创建与查看(读文件) (7)6.2目录的创建与查看 (7)6.3文件系统空间的查看 (7)七、实验体会 (8)八、收集的资料及主要参考文献 (8)一、设计思想说明1.1设计环境a)程序设计语言:C++语言b)计算机及操作系统:PC机,WindowsXPc)开发平台:Microsoft Visual C++ 6.0企业版d)运行平台:PC机,WindowsXP1.2设计思想文件系统是操作系统中负责管理和存取文件信息的机构,它具有“按名存取”的功能。
文件系统主要实现对具体的文件存取空间的管理、文件的物理结构、目录结构管理和文件操作。
本实验中的文件系统是多用户多级目录的文件系统。
实验中定义用户的上限为5个,目录结构采用多级目录结构。
1.3存储空间管理系统中的数据文件,需要为之分配磁盘空间。
采用模拟方法,虚拟磁盘为一个10000大小的一维数组:disk_block[10000],0表示空闲,1表示已分配出去。
使用混合索引分配方式来为存储文件分配所在外存的块号:当文件大小较小时,采用直接地址,索引结点的每项存放文件数据的盘块的盘块号;当文件大小较大时,采用一次间接地址,即一级索引;当文件非常大时,采用多次间接地址,即二级索引。
1.4目录结构目录结构的组织,关系到文件系统的存取速度、安全性、共享性。
为了提高目录的检索速度和文件系统的性能,采用了多目录结构来组织目录,即树形目录结构,主目录称为根目录,数据文件为树叶,其他的目录为树的结点。
如下图所示。
二、数据结构2.1虚拟磁盘,初始化时所有盘块置0for(i=0;i<10000;i++) //初始化所有磁盘块为空闲disk_block[i]=0;disk_empty=10000;2.2用户的数据文件,即树叶typedef struct UFD //存储文件信息{char name[10]; //文件名int attribute; //属性int length; //长度int a[10]; //为文件本身分配10个空间int *p1; //一级索引,100个空间int (*p2)[100]; //二级索引,100*100个空间struct UFD *next; //文件链的下一结点}UFD;2.3目录文件,即树结构中树的结点typedef struct DIR //存储目录信息{DIR* above; //上一结点char name[10]; //目录名int length; //目录的大小DIR *next; //下一结点UFD *File_head; //此目录下的文件指针DIR *Dir_head; //此目录下目录链表指针}DIR;2.4管理目录文件的类,每个用户都是其的对象class Cuse //定义管理用户目录的类{DIR *now; //当前目录UFD *Fhead; //文件的头结点DIR *Dhead; //根目录的目录链头结点char code[10]; //密码char name[10]; //用户名int length; //用户空间大小int status; //是否获得空间public://……//代码省略//……}2.5管理用户的类,管理员是其的对象class Cdisk{ //用户类public:Cuse user[5]; //用户个数最多为5char code[10]; //管理员密码int dis_disk();//显示磁盘的使用情况int first_dele_user();//删除用户的准备工作int dele_user(int);//具体实现删除用户int new_user();//查看当前用户与外存空间使用情况,后创建新用户int set_code(); //设置新密码int login(char); //登陆Cdisk(); //构造函数virtual~Cdisk(); //虚函数,析构};三、功能实现3.1登陆系统系统中设置了管理员和用户两种登陆模式。
管理员的用户名为“管理员”,默认密码为123,可以后期修改密码。
用户初始化时不存在,在登陆时系统发现不存在任何用户则自动要求用户先注册一用户,并在注册成功后为用户登陆。
3.2系统初始化(建文件卷、提供登录模块)for(i=0;i<10000;i++) //初始化所有磁盘块为空闲disk_block[i]=0;disk_empty=10000;int Cdisk::login(char b) //登陆{……}3.3文件的创建:int Cuse::new_file() //建立新文件3.4文件的打开:openint Cuse::open_file() //打开文件3.5文件删除:int Cuse::first_dele_file() //删除文件的前面工作int Cuse::dele_file(UFD *f) //具体实现删除文件3.6文件的读:int Cuse::dis_file()//查看文件3.7创建目录(建立子目录):int Cuse::new_dir() //建立新目录3.8查看当前目录:int Cuse::dis_dir(DIR *d)//显示目录int Cuse::dis_now() //显示当前目录DIR *Cuse::get_now() //得到当前目录路径3.9删除目录:int Cuse::first_dele_dir() //删除目录的前奏int Cuse::dele_dir(DIR *p) //具体实现删除目录的工作3.10返回上一级目录:int Cuse::goback() //向上返回3.11退出:在主菜单中用flag标记实现四、操作思想各个用户的名字不能相同。
在每个用户注册(创建)后,将自动获得一个根目录(root),在此目录中,可以创建多个目录(同一父目录下,不能同名)和多个数据文件。
在root目录里,进入一个新建的子目录,则又可以在此子目录里创建多个目录和数据文件。
依次类推,实现树形结构。
但同一父目录下,目录项和数据文件都不能重名。
五、界面演示5.1登陆界面5.2管理员登陆成功后的界面5.3用户登陆成功后的界面在该界面中,功能选择菜单正面显示了用户名为“user",并同时显示了当前所处的目录为根目录“root”。
此处,如当前处在多级目录里,将把目录路径详细列出,用到的实现函数为er[n].dis_dir(er[n].get_now());如下图所示。
六、系统具体运行演示6.1文件的创建与查看(读文件)6.2目录的创建与查看6.3文件系统空间的查看七、实验体会本次课程设计是利用C++程序语言编写的,由于对C++的自学不够深,导致在调试与编译时出现了很大的困难,但在有关C++实践指导书的帮助下,许多问题都逐步得到了解决。
文件系统的要求的功能很多,程序很长。
但此次实验无疑是对我C++知识的一次磨练,使得我深深体会到它在实现对象操作和相关数据封闭操作的好处。
在设计此系统时,方发觉自己对文件系统理解得不够透彻。
例如在考虑如何实现多用户多目录时,差点就走进了如何在二级目录里实现的死胡同。
后来,耐心回到这学期学习的课本内容上,才醒悟要利用树形结构。
不然,是无法实现多用户情况下的多目录多文件层层嵌套。
如何保证在子目录里进行文件操作(数据文件的创建、删除)时造成的当前目录空间大小变化同步更新到先辈目录的空间大小,这困扰了我很久。
在参考了《操作系统实验教程后》,利用了目录类中的above(指向上一目录结点),当前目录空间变化时,即循环向上同步变化先辈目录的大小,直到根目录为止。
另外,实验中用到了now(目录指针)来指向当前所处的目录。
在同一目录下,如何实现多目录或多数据文件的保存,实验时我先是用数组结构,但后来发觉用指针链表更为方便,因为这样就不必限制数据文件和子目录的个数,虽然指针对内存的申请、释放掌握要求更为严格。
总而言之,操作系统的课程设计,不仅提升了自己的程序设计及编写技巧,更大大地加深了对操作系统的文件管理的了解。
八、收集的资料及主要参考文献[1]计算机操作系统,汤小丹等,西安电子科技大学出版社[2]操作系统实验指导书,傅秀芬,广东工业大学(自编)[3] 操作系统实验教程,袁宝华,清华大学出版社[4] C++上机实践指导教程(第三版),Nell Dale 著,马树奇译,电子工业出版社附录://此程序包含三个源代码文件!(disk.h, disk.cpp, menu.cpp)!//调试与编译环境:VC++6.0//C++//主源代码文件为disk.cpp////*************************disk.h******************************************//disk.h,磁盘头文件,虚拟//以下的是对VC编译器的检查#if !defined(AFX_DISK_H_1FAB24AE_C718_49FF_A915_94211192B8BC_INCLUDED_)#define AFX_DISK_H_1FAB24AE_C718_49FF_A915_94211192B8BC_INCLUDED_//VC++ 6.0=1200#if _MSC_VER>1000#pragma once#endif //_MSC_VER>1000extern int disk_block[10000];extern int disk_empty;typedef struct UFD //存储文件信息{char name[10]; //文件名int attribute; //属性int length; //长度int a[10]; //为文件本身分配10个空间int *p1; //一级索引,100个空间int (*p2)[100]; //二级索引,100*100个空间struct UFD *next;}UFD;typedef struct DIR //存储目录信息{DIR* above; //上一结点char name[10];int length;DIR *next; //下一结点UFD *File_head; //此目录下的文件指针DIR *Dir_head; //此目录下目录链表指针}DIR;class Cuse //定义管理用户目录的类{DIR *now; //当前目录UFD *Fhead; //文件的头结点DIR *Dhead; //根目录的目录链头结点char code[10]; //密码char name[10]; //用户名int length; //用户空间大小int status; //是否获得空间public:void set_status(int);int dele_user();int dis_file(); //显示文件所占外存块号int dis_dir(DIR *d);//当前路径int get_length();char const *get_name();char const *get_code();int get_status();int set_user(char *,char *);//设置用户名与密码DIR *get_now();int dele_file(UFD *f); //删除文件int dele_dir(DIR*); //删除目录Cuse(); //构造~Cuse(); //析构int goback(); //返回上级int dis_now(); //显示当前目录int new_file();int new_dir();int open_dir();int open_file();int first_dele_file(); //删除文件的前部分工作int first_dele_dir(); //删除目录的前部分工作int set_code();};class Cdisk{ //用户类public:Cuse user[5]; //用户个数最多为5char code[10];int dis_disk();int first_dele_user();int dele_user(int);int new_user(); //查看当前用户与外存空间使用情况,后创建新用户int set_code(); //设置新密码int login(char); //登陆Cdisk();virtual~Cdisk(); //虚函数,析构};#endif //!defined(AFX_DISK_H_1FAB24AE_C718_49FF_A915_94211192B8BC_INCLUDED_) //************************disk.cpp********************************#include"disk.h"#include"menu.cpp"#include<string.h>#include<stdlib.h>#include<iostream.h>#include<iomanip.h>int disk_block[10000];int disk_empty;Cdisk::Cdisk() //管理磁盘的类,构造函数{int i=0;char code[10]="123456";for(i=0;i<10000;i++) //初始化所有磁盘块为空闲disk_block[i]=0;//this->user[0].set_user("student","123");//默认一个用户disk_empty=10000;cout.setf(ios::left); //设置输出方式}Cdisk::~Cdisk() //析构{}int Cdisk::dele_user(int i) //Cdisk类dele_user的构造{Cuse C;C=user[i];user[i].dele_user(); //调用Cuse类的成员函数 int dele_user()return 1;}int Cdisk::dis_disk() //检查磁盘信息{int i=0;cout<<setw(14)<<"用户名"<<setw(14)<<"占用空间大小"<<endl;for(i=0;i<5;i++)if(user[i].get_status()==1) //存在的用户的信息cout<<setw(14)<<user[i].get_name()<<setw(14)<<user[i].get_length()<<en dl;cout<<"已用空间:"<<10000-disk_empty<<endl<<"剩余空间:"<<disk_empty<<endl;return 1;}int Cdisk::login(char b) //登陆{char n[10],c[10];int i;if(b=='1'){cout<<"用户:管理员"<<endl;cout<<"密码:默认\n"<<endl;system("pause");return 1;}else{if(!user[0].get_status()) //当前不存在用户{i=0;cout<<"当前用户为空,欢迎注册!"<<endl;user[i].set_status(1); //为新用户分配权利cout<<"请输入用户名:"<<endl;cin>>n;cout<<"请输入密码:"<<endl;cin>>c;user[i].set_user(n,c); //调用Cuse的成员函数,传递用户名与密码cout<<"恭喜,创建用户成功!"<<endl;return i;}else{cout<<"用户名:";cin>>n;cout<<"密码:";cin>>c;cout<<endl;for(i=0;i<5;i++) //查找是否存在此用户{if(user[i].get_status()) //存在方比较if(!strcmp(n,user[i].get_name())) //相等时为0,此判断为匹配if(!strcmp(c,user[i].get_code())) //密码匹配{cout<<"登陆成功!"<<endl;cout<<"欢迎"<<user[i].get_name()<<"登陆"<<endl;return i;}else{cout<<"密码错误"<<endl;return -1;}}cout<<"此用户不存在!"<<endl;return -1;}}}int Cdisk::set_code() //设置新密码{char temp1[10],temp2[10];cout<<"请输入原密码"<<endl;cin>>temp1;if(strcmp(temp1,code)) //无疑是针对当前用户进行操作,故直接code{cout<<"原密码错误!"<<endl;return 0;}while(1){cout<<"请输入新密码:"<<endl;cin>>temp1;cout<<"请再次输入新密码:"<<endl;cin>>temp2;if(strcmp(temp1,temp2)){cout<<"两次密码不相同,请重输!"<<endl;break;}cout<<"密码设置成功!"<<endl;strcpy(code,temp1); //保存新密码break;}return 1;}int Cdisk::new_user() //准备创建新用户{char n[10],c[10];int i=0,j;for(i=0;i<5;i++)if(user[i].get_status()==0) //是否有此用户,此尚未存在break;if(i==5){cout<<"已经达到最大用户5个,不能再创建!"<<endl;return 0;}user[i].set_status(1); //为新用户分配权利cout<<"请输入用户名:"<<endl;cin>>n;if(i>0) //已有其它用户存在{for(j=0;j<i-1;j++)if(!strcmp(user[j].get_name(),n)){cout<<"此用户名已存在!"<<endl;return 0;}}cout<<"请输入密码:"<<endl;cin>>c;user[i].set_user(n,c); //调用Cuse的成员函数,传递用户名与密码cout<<"恭喜,创建用户成功!"<<endl;return 1;}int Cdisk::first_dele_user() //删除用户{char n[10],c;int i;cout<<"请输入你要删除的用户名"<<endl;cin>>n;for(i=0;i<5;i++) //在查找用户的同时,得到用户序号iif(!strcmp(user[i].get_name(),n)&&user[i].get_status())break; //找到,跳出if(i==5){cout<<"出错啦,此用户不存在!"<<endl;return 0;}cout<<"确认删除此用户?确认Y,取消任意键"<<endl;cin>>c;if(c!='Y'&&c!='y'){cout<<"已经取消删除!"<<endl;return 0;}this->dele_user(i);cout<<"用户删除成功"<<endl;return 1;}Cuse::Cuse() //构造函数,初始化成员{status=0; //用户权利,即是否被创建标记length=0; //空间now=0; //当前目录Fhead=0; //文件Dhead=0; //目录}Cuse::~Cuse() //析构,清除程序占用的内存{disk_empty+=length;length=0;UFD *f=Fhead;DIR *d=Dhead;while(f!=0) //文件{if(f->next==0){this->dele_file(f);f=0;break;}while(f->next->next!=0)f=f->next;this->dele_file(f->next);f->next=0;f=Fhead;}while(d!=0) //目录{if(d->next==0){this->dele_dir(d);d=0;break;}while(d->next->next!=0)d=d->next;this->dele_dir(d->next);d->next=0;d=Dhead;}}int Cuse::new_file() //建立新文件{int i=0,j=0;UFD *f,*p=0;DIR *D;p=new UFD; //开辟一个新的文件结构体if(p==0){cout<<"无可用内存空间,创建文件失败!"<<endl;return 1;}cout<<"请输入建立的文件名:";cin>>p->name;if(now==0) //根目录下的文件链f=Fhead;else //当前目录下的文件链f=now->File_head;while(f!=0) //检查是否文件重名{if(!strcmp(p->name,f->name)){cout<<"此文件已存在!"<<endl;return 0; //退出}f=f->next;}cout<<"\n"<<"长度:";cin>>p->length;cout<<"\n"<<"属性(0:只读,1:读写):";cin>>p->attribute;cout<<endl;if(p->length>disk_empty) //空间不足{cout<<"文件太大,空间不足,当前空间为:"<<disk_empty<<endl;delete p;return 0;}disk_empty=disk_empty-p->length; //剩余空闲盘块//for(i=0;i<p->length&&i<10;i++) //文件较小时,直接地址,文件数据盘块号for(j;j<10000;j++) //位示图法if(disk_block[j]==0) //空闲{p->a[i]=j; //得到此空间disk_block[j]=1; //标记为已分配出去j++;break; //跳出寻找,为文件分配下一空间}p->p1=0; //一级索引p->p2=0; //二级索引if(p->length>10) //超过10,用一级索引{p->p1=new int[100]; //为一级索引分配100个空间for(i=10;i<p->length&&i<110;i++)for(j;j<10000;j++) //j,继续前面的值if(disk_block[j]==0){(p->p1)[i-10]=j;disk_block[j]=1;j++;break;}if(p->length>110) //超过110,得用二级索引{p->p2=new int[100][100]; //在一级索引的基础上,2维for(i=110;i<p->length;i++)for(j;j<10000;j++) //j,继续前面的值if(disk_block[j]==0){int m=(i-110)/100; //行int k=(i-110)%100; //列p->p2[m][k]=j;disk_block[j]=1;j++;break;}}}if(now==0) //根目录下的文件{p->next=Fhead; //后继结点指向头,即新指点在前Fhead=p; //新结点在头}else{p->next=now->File_head;now->File_head=p;}length+=p->length; //用户总空间大小增加if(now!=0) //子目录下空间大小增加{now->length+=p->length;D=now->above; //上一级目录while(D!=0) //上级目录(根目录已实现)空间增加{D->length+=p->length;D=D->above; //逐级向上}}}int Cuse::new_dir() //建立新目录{DIR *p,*h;cout<<"请输入新目录的名字:"<<endl;p=new DIR;cin>>p->name; //目录名p->Dir_head=0; //目录下的目录链为空p->length=0; //p->File_head=0; //目录下的文件为空if(now==0) //当前为主目录h=Dhead; //第一次时,h=0;指向目录链elseh=now->Dir_head;//当前的目录链while(h!=0) //此目录下存在其它子目录{if(!strcmp(h->name,p->name)){cout<<"此目录已存在!"<<endl;return 0;}h=h->next;}if(now==0) //当前为主目录{p->above=0; //主目录里目录的上一结点为0p->next=Dhead; //把原目录接入新目录后面(Dhead初始为0)Dhead=p; //Dhead始终指向最新目录结点}else{p->above=now; //当前目录为新目录的上一结点p->next=now->Dir_head; //反序插入新目录now->Dir_head=p; //更新目录链}cout<<"目录创建成功"<<endl;return 1;}int Cuse::goback() //向上返回{if(now==0){cout<<"已是主目录,不能向上!"<<endl;return 0;}now=now->above; //上一结点return 1;}int Cuse::open_dir() //打开目录{char name[10];DIR *p;if(now==0) //当前主目录p=Dhead;elsep=now->Dir_head; //p指向目录链cout<<"请输入你要打开的目录名:"<<endl;cin>>name;//int flag=0;while(p!=0){if(strcmp(p->name,name)==0){now=p; //找到目录,now标记return 1;}p=p->next;}cout<<"当前没此目录"<<endl;return 0;}int Cuse::first_dele_file() //删除文件的前面工作{char temp[10],a[5];cout<<"你要删除的文件名:"<<endl;cin>>temp;UFD *f=Fhead; //数据文件头指针UFD *above=0;if(now!=0)f=now->File_head; //当前目录下的数据文件while(f!=0){if(!strcmp(f->name,temp))break; //找到,跳出above=f; //标记第一个文件f=f->next;}if(f==0){cout<<"此文件不存在"<<endl;return 0;}cout<<"确定删除"<<f->name<<"文件吗?按0确定,其他键取消"<<endl;cin>>a;if(a[0]!='0'){cout<<"已取消删除文件。