实验7 文件管理.docx
- 文档编号:24308043
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:14
- 大小:17.11KB
实验7 文件管理.docx
《实验7 文件管理.docx》由会员分享,可在线阅读,更多相关《实验7 文件管理.docx(14页珍藏版)》请在冰豆网上搜索。
实验7文件管理
实验7文件管理(4学时)
一、实验目的
理解文件系统的主要概念及文件系统内部功能和实现过程。
二、实验内容
采用二级文件目录结构,编写程序实现文件系统的文件存储空间的管理、文件的物理结构、目录结构管理和文件操作。
三、实验要求
1、设计一个有m个用户的文件系统,每个用户最多可保存一个文件。
2、规定用户在一次运行中只能打开K个文件。
3、系统能检查键入命令的正确性,出错时应能显示出错原因。
4、对文件应能设置保护措施,如只能执行、允许读、允许写等。
5、对文件的操作设计提供一套文件操作:
CREATE建立文件;
DELETE删除文件;
OPEN打开文件;
CLOSE关闭文件;
READ读文件;
WRITE写文件。
6、二级目录结构如下图所示。
用户名
用户文件目录地址
主文件目录MFD
文件名
状态(打开/建立)
指针
用户文件目录UFD
#include
#include
#include
#include
usingnamespacestd;
//用户数目
#defineMAX_USER_CNT3
//用户在一次运行中最多能打开文件数目
#defineMAX_FILE_OPN3
//每个用户最多可保存文件数目
#defineMAX_FILE_CNT10
//用户目录项.
structUFDItem{
stringfileName;
boolopened,readonly;
stringdata;
UFDItem(stringfn,boolo,boolr){
fileName=fn;
opened=o;
readonly=r;
data="";
}
};
typedefvector
//主文件目录项.
structMFDItem{
stringuserName;
UFDufd;
MFDItem(stringun){
userName=un;
}
};
typedefvector
//主文件目录
MFDmfd;
//当前用户
MFD:
:
iteratorcurrentUser;
//打开的文件数目
intopenedFileCnt;
//检测用户登录状态
boolcheckUser(){
if(currentUser==mfd.end()){
puts("当前没有登录的用户!
");
returnfalse;
}
returntrue;
}
UFD:
:
iteratorgetFile(stringfileName,boolopened=false){
UFD&ufd=currentUser->ufd;
for(UFD:
:
iteratorit=ufd.begin();it!
=ufd.end();it++){
if(it->fileName==fileName&&(!
opened||it->opened))returnit;
}
returnufd.end();
}
//文件列表
voiddir(boolopened){
if(checkUser()){
boolempty=true;
UFD&ufd=currentUser->ufd;
for(UFD:
:
iteratorit=ufd.begin();it!
=ufd.end();it++){
if(!
opened||it->opened){
printf("%s%s%s\n",it->fileName.c_str(),it->readonly?
"readonly":
"readwrite",it->opened?
"opened":
"");
empty=false;
}
}
if(empty)puts("文件列表为空!
");
}
}
//读取文件
boolreadFile(stringfileName){
if(!
checkUser())returnfalse;
UFD&ufd=currentUser->ufd;
UFD:
:
iteratorit=getFile(fileName,true);
if(it==ufd.end()){
printf("文件%s不存在或未被打开!
\n",fileName.c_str());
returnfalse;
}else{
printf("文件%s打开成功!
文件内容为:
%s\n",fileName.c_str(),it->data.c_str());
returntrue;
}
}
//写入文件
boolwriteFile(stringfileName,stringdata){
if(!
checkUser())returnfalse;
UFD&ufd=currentUser->ufd;
UFD:
:
iteratorit=getFile(fileName,true);
if(it==ufd.end()){
printf("文件%s不存在或未被打开!
\n",fileName.c_str());
returnfalse;
}else{
if(it->readonly){
printf("文件%s是只读的,不能写入文件!
",fileName.c_str());
returnfalse;
}else{
it->data=data;
printf("文件%s写入成功!
\n",fileName.c_str());
returntrue;
}
}
}
//关闭文件
boolcloseFile(stringfileName){
if(!
checkUser())returnfalse;
UFD&ufd=currentUser->ufd;
UFD:
:
iteratorit=getFile(fileName,true);
if(it==ufd.end()){
printf("文件%s不存在或未被打开!
\n",fileName.c_str());
returnfalse;
}else{
it->opened=false;
openedFileCnt--;
printf("文件%s关闭成功!
\n",fileName.c_str());
returntrue;
}
}
//打开文件
boolopenFile(stringfileName){
if(!
checkUser())returnfalse;
UFD&ufd=currentUser->ufd;
UFD:
:
iteratorit=getFile(fileName);
if(it==ufd.end()){
printf("找不到文件%s!
\n",fileName.c_str());
returnfalse;
}else{
if(it->opened){
printf("文件%s已经打开。
\n",fileName.c_str());
returnfalse;
}
if(openedFileCnt>=MAX_FILE_OPN){
printf("现在已经打开%d个文件,达到上限。
\n",MAX_FILE_OPN);
returnfalse;
}
it->opened=true;
openedFileCnt++;
printf("文件%s打开成功!
\n",fileName.c_str());
returntrue;
}
}
//删除文件
booldeleteFile(stringfileName){
if(!
checkUser())returnfalse;
UFD&ufd=currentUser->ufd;
UFD:
:
iteratorit=getFile(fileName);
if(it==ufd.end()){
printf("找不到文件%s!
\n",fileName.c_str());
returnfalse;
}else{
if(it->opened){
printf("文件%s正在被使用,不能被删除!
\n",fileName.c_str());
returnfalse;
}
ufd.erase(it);
printf("文件%s删除成功!
\n",fileName.c_str());
returntrue;
}
}
//创建文件
boolcreateFile(stringfileName,boolreadonly){
if(!
checkUser())returnfalse;
UFD&ufd=currentUser->ufd;
if(ufd.size()>=MAX_FILE_CNT){
printf("该用户已创建%d个文件,达到上限。
\n",MAX_FILE_CNT);
returnfalse;
}
UFD:
:
iteratorit=getFile(fileName);
if(it!
=ufd.end()){
printf("文件%s已存在!
\n",fileName.c_str());
returnfalse;
}
ufd.push_back(UFDItem(fileName,false,readonly));
printf("文件%s创建成功!
\n",fileName.c_str());
returntrue;
}
//用户登录
boollogin(stringuserName){
if(currentUser!
=mfd.end()){
if(currentUser->userName==userName)puts("该用户已登录。
");
elseputs("已有用户登录,请使用switch命令切换用户。
");
returnfalse;
}
for(MFD:
:
iteratorit=mfd.begin();it!
=mfd.end();it++){
if(it->userName==userName){
puts("登录成功!
");
currentUser=it;
UFD&ufd=it->ufd;
for(UFD:
:
iteratorit=ufd.begin();it!
=ufd.end();it++){
if(it->opened)it->opened=false;
}
openedFileCnt=0;
returntrue;
}
}
puts("输入的用户名不存在!
");
returnfalse;
}
//从command中获取下一个命令或参数
stringgetCommand(char*&command){
char*&c=command;
stringcmd;
while(*c){
if(*c==''||*c=='\t'){
if(cmd.empty())c++;
elsebreak;
}elsecmd.push_back(*c++);
}
returncmd;
}
//显示帮助
voidhelp(){
puts("可用命令:
");
puts("用户登录:
login用户名");
puts("切换用户:
switch用户名");
puts("创建文件:
create文件名[-r|-rw]");
puts("删除文件:
delete文件名");
puts("打开文件:
open文件名");
puts("关闭文件:
close文件名");
puts("读文件:
read文件名");
puts("写文件:
write文件内容");
puts("文件列表:
dir[-o]");
puts("帮助:
help");
puts("退出:
exit");
}
intmain(){
mfd.push_back(MFDItem("Wang"));
mfd.push_back(MFDItem("Zhang"));
mfd.push_back(MFDItem("Gao"));
currentUser=mfd.end();
charbuffer[100],*command;
stringcmd,para;
while(true){
if(currentUser==mfd.end())printf("login>");
elseprintf("%s>",currentUser->userName.c_str());
gets(buffer);
command=buffer;
if(!
(cmd=getCommand(command)).empty()){
if(cmd=="login"){
if((cmd=getCommand(command)).empty()){
puts("缺少用户名!
");
continue;
}
login(cmd);
}elseif(cmd=="switch"){
if((cmd=getCommand(command)).empty()){
puts("缺少用户名!
");
continue;
}
currentUser=mfd.end();
login(cmd);
}elseif(cmd=="create"){
if((cmd=getCommand(command)).empty()){
puts("缺少文件名!
");
continue;
}
boolreadonly=false;
if(!
(para=getCommand(command)).empty()){
if(para=="-r")readonly=true;
}
createFile(cmd,readonly);
}elseif(cmd=="delete"){
if((cmd=getCommand(command)).empty()){
puts("缺少文件名!
");
continue;
}
deleteFile(cmd);
}elseif(cmd=="open"){
if((cmd=getCommand(command)).empty()){
puts("缺少文件名!
");
continue;
}
openFile(cmd);
}elseif(cmd=="close"){
if((cmd=getCommand(command)).empty()){
puts("缺少文件名!
");
continue;
}
closeFile(cmd);
}elseif(cmd=="read"){
if((cmd=getCommand(command)).empty()){
puts("缺少文件名!
");
continue;
}
readFile(cmd);
}elseif(cmd=="write"){
if((cmd=getCommand(command)).empty()){
puts("缺少文件名!
");
continue;
}
if((para=getCommand(command)).empty()){
puts("缺少文件内容!
");
continue;
}
writeFile(cmd,para);
}elseif(cmd=="dir"){
boolopened=false;
if(!
(para=getCommand(command)).empty()){
if(para=="-o")opened=true;
}
dir(opened);
}elseif(cmd=="help")help();
elseif(cmd=="exit")break;
elseputs("输入的命令有误。
");
}
}
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验7 文件管理 实验 文件 管理