操作系统实验三--文件管理.doc
《操作系统实验三--文件管理.doc》由会员分享,可在线阅读,更多相关《操作系统实验三--文件管理.doc(35页珍藏版)》请在冰豆网上搜索。
..
《计算机操作系统》课程实验报告
题目
文件管理
学院:
计算机学院
专业:
计算机科学与技术
姓名
班级
学号
2016年12月22日
实验三文件管理
1.实验目的:
编写一个简单的二级文件系统实现程序,加深对文件系统的内部功能和内部
实现的理解。
要求模拟采用二级目录结构的磁盘文件系统的文件操作能实现相应的命令,用输入命令来模拟用户程序中调用的文件操作。
2.实验内容:
最基本的文件操作
(1)创建文件
在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项。
目录项中应该记录新文件的文件名及其在外存的地址等属性。
(2)删除文件
当已不再需要某文件时,可将它从文件系统中删除。
在删除时,系统应该先从目录中找到要删除的文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。
(3)读文件
在读一个文件时,须在相应的系统调用中给出文件名和应该读入的内存目标地址。
此时,系统同样要查找目录,找到制定的目录项,从中得到被读文件在外存中的位置。
在目录项中,还有一个指针用于对文件的读/写。
(4)写文件
在写一个文件时,须在相应的系统调用中给出该文件名及该文件在内存中的(源)地址。
为此,也同样须先查找目录,找到指定文件的目录项,在利用目录中的写指针进行写操作。
(5)截断文件
如果一个文件的内容已经陈旧而需要全部更新文件的内容时,一种方法是将此文件删除,再重新创建一个新文件。
但如果文件名及其属性均无改变时,则可采取另一种所谓的截断文件的方法,此即将原有文件的长度设置为0,或说放弃原有的文件内容。
(6)设置文件的读/写位置
前述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从文件的始端读或写。
设置文件读/写位置的操作,用于设置文件读/写指针的位置,以便每次读/写文件时,不是从其始端而是从所设置的位置开始操作。
也正因如此,才能改顺序存取为随机存取。
3.设计实现:
1)流程图
2)详细设计
源代码
#include
#include
#include
#include
#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");