操作系统实验三文件管理.docx
《操作系统实验三文件管理.docx》由会员分享,可在线阅读,更多相关《操作系统实验三文件管理.docx(34页珍藏版)》请在冰豆网上搜索。
![操作系统实验三文件管理.docx](https://file1.bdocx.com/fileroot1/2023-1/31/a45b9862-e208-475d-b982-2343de7dc7ba/a45b9862-e208-475d-b982-2343de7dc7ba1.gif)
操作系统实验三文件管理
操作系统实验三--文件管理
《计算机操作系统》课程实验报告
题目
文件管理
学院:
计算机学院
专业:
计算机科学与技术
姓名
班级
学号
2016年12月22日
#include
#defineMaxUser100//定义最多有100个用户
#defineMaxDisk512*1024//定义磁盘空间大小
#definecommandAmount//对文件操作的指令数
//存储空间管理有关结构体和变量
chardisk[MaxDisk];//模拟512K的磁盘存储空间
typedefstructdistTable//磁盘块结构体
{
intmaxlength;
intstart;
intuseFlag;
distTable*next;
}diskNode;
diskNode*diskHead;
typedefstructfileTable//文件快结构体
{
charfileName[10];
intstart;//文件在磁盘存储空间的起始地址
intlength;//文件内容长度
intmaxlength;//文件的最大长度
charfileKind[3];//文件的属性--读写方式
structtm*timeinfo;
boolopenFlag;//判断是否有进程打开了文件
};
intused=0;//定义MFD目录中用已有的用户数
//两级目录结构体
typedefstructuser_file_directory//用户文件目录文件UFD
{
fileTable*file;
user_file_directory*next;
}UFD;
typedefstructmaster_file_directory//主目录文件
{
charuserName[10];
charpassword[10];
UFD*user;
}MFD;
MFDuserTable[MaxUser];
intuserID=-1;//用户登录的ID号,值为-1时表示没有用户登录
//文件管理
voidfileCreate();//创建文件
voidfileDelet();//删除文件
voidfileWrite();//写文件
voidfileRead();//读文件
voidfileRename();//重命名文件
voidfileFind();//查询文件
voidfileDir();//显示某一用户所有文件
voidfileClose();//关闭已打开的文件
voidfileChange();//修改文件的读写方式
intrequestDist(int&stratPostion,intmaxlength);//磁盘分配查询
voidinitDisk();//初始化磁盘
voidfreeDisk(intstartPostion);//磁盘空间释放
voiddiskShow();//显示磁盘使用情况
voidinitFile();
//用户管理
voiduserCreate();
intlogin();
voiduserDelet();
voiduserFind();
//用户登陆主界面
voidwebUser();
//用户内部界面
voidwebFile();
intmain()
{
initDisk();
initFile();
webUser();
return0;
}
voidwebUser()
{
inti;
while
(1)
{
printf("************************************************************\n");
printf("1.创建用户2.登陆用户\n");
printf("3.删除用户4.查看用户\n");
printf("0.退出系统\n");
printf("************************************************************\n");
printf("请输入操作号\n");
scanf("%d",&i);
switch(i)
{
case0:
exit(0);break;
case1:
userCreate();break;
case2:
userID=login();
if(userID!
=-1)
{
webFile();
}
break;
case3:
userDelet();break;
case4:
userFind();break;
default:
printf("您输入的命令有误,请重新选择\n");
system("pause");
system("cls");
break;
}
}
}
voiduserCreate()
{
charc;
charuserName[10];
inti;
if(used{
printf("请输入用户名:
");
for(i=0;c=_getch();i++)
{
if(c==13)break;
else
userName[i]=c;
printf("%c",c);
}
userName[i]='\0';
for(i=0;i{
if(!
strcmp(userTable[i].userName,userName))
{
printf("\n");
printf("该用户名已存在,创建用户失败\n");
system("pause");
system("cls");
return;
}
}
strcpy(userTable[used].userName,userName);
printf("\n");
printf("请输入密码:
");
for(i=0;c=_getch();i++)
{
if(c==13)break;
else
userTable[used].password[i]=c;
printf("*");
}
userTable[userID].password[i]='\0';
printf("\n");
printf("创建用户成功\n");
used++;
system("pause");
system("cls");
}
else
{
printf("创建用户失败,用户已达到上限\n");
system("pause");
system("cls");
}
fflush(stdin);
}
intlogin()
{
charname[10],psw[10];
charc;
inti,times;
printf("请输入用户名:
");
for(i=0;c=_getch();i++)
{
if(c==13)break;
else
name[i]=c;
printf("%c",c);
}
name[i]='\0';
for(i=0;i{
if(!
strcmp(userTable[i].userName,name))
break;
}
if(i==used)
{
printf("\n您输入的用户名不存在\n");
system("pause");
system("cls");
return-1;
}
for(times=0;times<3;times++)
{
memset(psw,'\0',sizeof(psw));
printf("\n请输入密码:
");
for(i=0;c=_getch();i++)
{
if(c==13)break;
else
psw[i]=c;
printf("*");
}
printf("\n");
for(i=0;i{
if(!
strcmp(psw,userTable[i].password))
{
printf("用户登录成功\n");
system("pause");
system("cls");
break;
}
}
if(i==used)
{
printf("您输入的密码错误,您还有%d次输入机会\n",2-times);
if(times==2)exit(0);
}
elsebreak;
}
fflush(stdin);
returni;
}
voiduserDelet()
{
intstatePos;
UFD*q;
charname[10],psw[10];
charc;
inti,times,j;
printf("请输入用户名:
");
for(i=0;c=_getch();i++)
{
if(c==13)break;
else
name[i]=c;
printf("%c",c);
}
name[i]='\0';
for(i=0;i{
if(!
strcmp(userTable[i].userName,name))
break;
}
if(i==used)
{
printf("\n您输入的用户名不存在\n");
system("pause");
system("cls");
}
else
{
q=userTable[i].user->next;
while(q)
{
if(q->file!
=NULL)
{
statePos=q->file->start;
}
freeDisk(statePos);
q=q->next;
}
for(i,j=i+1;i<=used;j++,i++)
{
userTable[i]=userTable[j];
}
printf("\n用户删除成功\n");
system("pause");
system("cls");
used--;
}
}
voiduserFind()
{
inti;
printf("用户列表:
\n");
for(i=0;i{
printf("%s\n",userTable[i].userName);
}
system("pause");
system("cls");
}
voidwebFile()
{
inti;
charname[10],kind[3];
printf("********************************************************\n");
printf("1.创建2.删除\n");
printf("3.写入文件4.查看文件内容\n");
printf("5.重命名6.查看文件属性\n");
printf("7.查看用户文件8.关闭文件\n");
printf("9.修改文件权限10.查看磁盘使用情况\n");
printf("11.返回上级目录12.退出系统\n");
printf("*********************************************************\n");
printf("请输入操作号:
");
scanf("%d",&i);
while
(1)
{
switch(i)
{
case1:
fileCreate();
break;
case2:
fileDelet();
break;
case3:
fileWrite();
break;
case4:
fileRead();
break;
case5:
fileRename();
break;
case6:
fileFind();
break;
case7:
fileDir();
break;
case8:
fileClose();
break;
case9:
fileChange();
break;
case10:
diskShow();
break;
case11:
system("cls");
webUser();
break;
case12:
exit(0);
break;
default:
printf("输入错误请重新输入:
");
break;
}
scanf("%d",&i);
}
}
voidfileCreate()
{
time_trawtime;
intstartPos;
charc;
charfileName[10],fileKind[10],fileLength[10];
charcommand[50];
intlength;
//inti,k,j;
printf("创建文件格式为名称长度权限(r、w、rw):
");
fflush(stdin);
gets(command);
inti,k,j;
for(i=0,k=0;command[i]!
='';i++,k++)
fileName[k]=command[i];
fileName[k]='\0';
k=i;
for(i=k+1,k=0;command[i]!
='';i++,k++)
fileLength[k]=command[i];
fileLength[k]='\0';
k=i;
j=1;
length=0;//初始化文件长度
for(i=strlen(fileLength)-1;i>=0;i--)//把字符串转换为十进制
{
length+=(fileLength[i]-48)*j;
j*=10;
}
for(i=k+1,k=0;command[i]!
=''&&command[i]!
='\0';i++,k++)
fileKind[k]=command[i];
fileKind[k]='\0';
UFD*fileNode,*p;
for(p=userTable[userID].user->next;p!
=NULL;p=p->next)
{
if(!
strcmp(p->file->fileName,fileName))
{
printf("文件重名,创建文件失败\n");
system("pause");
return;
}
}
if(requestDist(startPos,length))
{
fileNode=(UFD*)malloc(sizeof(UFD));
fileNode->file=(fileTable*)malloc(sizeof(fileTable));
strcpy(fileNode->file->fileName,fileName);
strcpy(fileNode->file->fileKind,fileKind);
fileNode->file->maxlength=length;
fileNode->file->start=startPos;
fileNode->file->openFlag=false;
time(&rawtime);
fileNode->file->timeinfo=localtime(&rawtime);
fileNode->next=NULL;
if(userTable[userID].user->next==NULL)
userTable[userID].user->next=fileNode;
else
{
p=userTable[userID].user->next;
while(p->next)p=p->next;
p->next=fileNode;
}
printf("创建文件成功\n");
system("pause");
}
else
{
printf("磁盘空间已满或所创建文件超出磁盘空闲容量,磁盘空间分配失败\n");
system("pause");
}
}
voidinitDisk()
{
diskHead=(diskNode*)malloc(sizeof(diskNode));
diskHead->maxlength=MaxDisk;
diskHead->useFlag=0;
diskHead->start=0;
diskHead->next=NULL;
}
voidinitFile()
{
inti;
for(i=0;i{
userTable[i].user=(UFD*)malloc(sizeof(UFD));
userTable[i].user->next=NULL;
}
}
intrequestDist(int&startPostion,intmaxLength)
{
intflag=0;//标记是否分配成功
diskNode*p,*q,*temp;
p=diskHead;
while(p)
{
if(p->useFlag==0&&p->maxlength>maxLength)
{
startPostion=p->start;
q=(diskNode*)malloc(sizeof(diskNode));
q->start=p->start;
q->maxlength=maxLength;
q->useFlag=1;
q->next=NULL;
diskHead->start=p->start+maxLength;
diskHead->maxlength=p->maxlength-maxLength;
flag=1;
temp=p;
if(diskHead->next==NULL)diskHead->next=q;
else
{
while(temp->next)temp=temp->next;
temp->next=q;
}
break;
}
p=p->next;
}
returnflag;
}
voidfreeDisk(intstartPostion)
{
diskNode*p;
for(p=diskHead;p!
=NULL;p=p->next)
{
if(p->start==startPostion)
break;
}
p->useFlag=false;
}
voidfileDelet()
{
charfileName[10],command[50];
inti,k;
fflush(stdin);
printf("输入文件名称:
");
gets(command);
for(i=0,k=0;command[i]!
='\0';i++,k++)
fileName[k]=command[i];
fileName[k]='\0';
UFD*p,*q,*temp;
q=userTable[userID].user;
p=q->next;
while(p)
{
if(!
strcmp(p->file->fileName,fileName))break;
else
{
p=p->next;
q=q->next;
}
}
if(p)
{
if(p->file->openFlag!
=true)//先判断是否有进程打开该文件
{
temp=p;
q->next=p->next;
freeDisk(temp->file->start);//磁盘空间回收
free(temp);
printf("文件删除成功\n");
system("pause");
}
else
{
printf("该文件正在被占用,删除失败\n");
system("pause");
}
}
else
{
printf("没有找到该文件,请检查输入的文件名是否正确\n");
system("pause");
}
}
voidfileRead()
{
intstartPos,l