📄 os.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define get(type) (type *)malloc(sizeof(type))
typedef struct ufd UFD;
struct ufd
{
char filename[10];//文件名
int protect;//文件操作码
int length;//文件长度
struct ufd *next;//指向下一文件
};
typedef struct mfd MFD;
struct mfd
{
char username[10];//用户名
UFD *file;//用户目录下的文件指针
struct mfd *next;//下一个用户
};
typedef struct afd AFD;
struct afd
{
char filename[10];//当前运行的文件名
int protect;//当前运行的文件操作码
int length;//长度
char text[1024];//当前运行的文件内容
struct afd *next;//下一个运行的文件
};
UFD *buffer;
MFD *buffer1;
void displayuseroption();
void displayfileoption();
void creatuser();
void deleteuser();
void selectuser();
void displayuser();
void displayopen();
void displayfile(MFD *pp);
void creatfile(MFD *qq);
void deletefile();
void openfile();
void readfile();
void writefile();
void displayproperty(MFD *pp);//显示属性
void deleteafd();
void closefile();
void renamefile();//改文件名
void renameuser();//改用户名
void copyfile(MFD *pp); //复制文件
void pastefile(MFD *pp); //粘贴文件
void copyuser();//复制用户
void pasteuser();//粘贴用户
MFD *user=NULL,*currentuser = NULL;//记录当前选中的用户
AFD *currentopen = NULL;
void displayuseroption() //显示用户菜单,可以创建,删除,选择用户
{
system("cls");
char s;
printf("\n\n\t\t=========== user menu ============");
printf("\n\t\t 1:create new user \n\t\t 2:delete user \n\t\t");
printf(" 3:select one user to option \n\t\t 4.display user list\n\t\t 5.rename user\n");
printf("\t\t 6.copyuser \n\t\t 7.pasteuser \n\t\t q:exit \n");
printf("\n\t\t================================");
printf("\n\t\tplease select user option:");
scanf("%s",&s);
switch(s)
{
case '1': creatuser();
getchar();
displayuseroption();
break; //创建新用户
case '2': deleteuser(); getchar();
displayuseroption();
break; //删除用户
case '3': selectuser();
getchar();
displayfileoption();
break; //选择一个用户,以便对该用户进行操作
case '4': displayuser();
getchar();
displayuseroption();
break;
case '5': renameuser();
getchar();
displayuseroption();
break;
case '6': copyuser();
getchar();
displayuseroption();
break;
case '7': pasteuser();
break;
case 'q': exit(0);
break; //退出系统
default : displayuseroption();
break; //若输入的是其他的字符,则重返用户菜单
}
}
void displayfileoption() //显示文件操作菜单
{
system("cls");
char s;
displayfile(currentuser);
printf("\n\n\t\t=========== file menu ============");
printf("\n\n\t____________________________________");
printf("\n\t........... %s .............\n",currentuser->username);
printf("\t___________________________________ \n");
printf("\n\t\n\t\t1.create new file \n\t\t2.delete file");
printf("\n\t\t3.open file \n\t\t4.close file \n\t\t5.read file \n\t\t6.write file");
printf(" \n\t\t7.rename file \n\t\t8.display file property \n\t\t");
printf(" \n\t\t9:copy file \n\t\t0.paste file \n\t\tq:exit \n");
printf("\n\n\tplease select file option:");
scanf("%s",&s);
switch(s)
{
case '1':creatfile(currentuser);break; //创建文件
case '2':deletefile();break; //删除文件
case '3':{openfile(); displayfileoption();}break; //打开文件
case '4':{closefile();displayfileoption();}break; //关闭文件
case '5':{readfile();getchar();displayfileoption();}break; //读文件
case '6':{writefile();displayfileoption();}break; //写文件
case '7': renamefile(); break; //重命名文件
case '8': displayproperty(currentuser); break;
case '9': copyfile(currentuser); break;
case '0': pastefile(currentuser); break;
case 'q':{currentuser=NULL;deleteafd();displayuseroption();}break; //退出,返回上一级菜单
default :displayfileoption();break; //非法输入,返回文件菜单
}
}
void creatuser() //创建新用户
{
system("cls");
int i;
char s;
MFD *second,*first=user;
second=get(MFD);//分配MFD的空间给指针second
for(i=1;first!=NULL;i++)// i 指示当前用户个数
first=first->next; //找到链表中的最后一个节点就是最后一个用户的节点
//以便创建的新用户放在此用户的节点后面
first=user;
printf("\n\tcreate a new user......");
printf("\n\t====input NO.%d user: ",i);
scanf("%s",second->username); //输入新用户的名字
second->file=NULL;//新用户没文件
second->next=NULL;//新用户的文件指针为空
if(user==NULL)
{
user=second; //若 user 为空,把P 复给user
}
else //若user 不空,则以有旧用户存在
{
while(first->next!=NULL)
{ //寻找最后一个用户
if(strcmp(second->username,first->username)==0)
{ //比较,若系统中已经存在该用户,
printf("\n\tthe user has exsit ! try again !\n\n"); //报出错
getchar();
displayuseroption();
}
first=first->next;
}
first->next=second; //second指向的为最后一个用户
}
printf("\n\tcreate one more user?(y / n) "); //输入下一个用户
scanf("%s",&s);
switch(s)
{
case 'y':creatuser();break;
case 'n':displayuseroption();break;
default :displayuseroption();break;
}
}
void copyuser()//复制用户
{
displayuser();
char name[10];
MFD *temp=user;
printf("\ncopy user........");
printf("\ninput the user you want to copy:");
scanf("%s",name);
while(temp!=NULL)
{
if(!strcmp(temp->username,name))
{
buffer1=get(MFD);
//buffer1=temp;
strcpy(buffer1->username,temp->username);
buffer1->file=temp->file;
buffer1->next=NULL;
break;
}
temp=temp->next;
}
getchar();
displayuseroption();
}
void pasteuser()//粘贴用户
{
MFD *temp=user;
displayuser();
printf("\npaust user......");
printf("\nbuffer1 content:%s\n",buffer1->username);
if(temp)
{
while(temp->next!=NULL)
temp=temp->next;
temp->next=buffer1;
printf("temp->next1:%s\n",temp->next->username);
}
else
{
user=buffer1;
}
displayuser();
getchar();
}
void deleteuser() //删除用户
{
char n[10];
MFD *p=user,*pre=NULL;
printf("\ndelete user......");
displayuser();
if(!p){
printf("\nTIP : no user! \n\t please create a user first!\n"); //P为空,报错,必须先创建一个用户
getchar();
displayuseroption();
}
printf("\n\t====please input the user name you want to delete:");
scanf("%s",n);
while(p!=NULL)
{
if(strcmp(p->username,n)==0) //寻找所要删除的用户
{
if(p==user)
{
user=user->next; //若是第一个用户,则释放P
free(p);
}
else
{
pre->next=p->next;
free(p);
}
break;
}
else
{
pre=p;
p=p->next;
}
}
if(p==NULL) //找不到用户
{
printf("\n\nTIP:\n\tthe user is not exsit!");
getchar();
}
}
void selectuser() //选择用户 ,以便对他的文件进行操作
{
char n[10];
MFD *p=user;
printf("\nselect user......");
displayuser();
if(!p)
{
printf("\nTIP:\n\tthe user is not exist! \n\t please create a new user first!\n"); //没用户
getchar();
displayuseroption();
}
printf("\n\n\t select one user to option:");
printf("\n\n====input the user name:");
scanf("%s",n); //输入用户名
while(p!=NULL)
{
if(strcmp(p->username,n)==0) //逐个比较寻找用户
{
currentuser=p; //找到对应用户,把currentuser 指向该用户
return;
}
else
{
p=p->next;
}
}
if(p==NULL) //找不到用户
{
printf("\n\nTIP:\n\tthe user is not exist! !");
}
}
void renameuser()//修改用户名
{
char name[10],s;
MFD *p=user;
int flag=0;
displayuser();
printf("\n\tinput the user name you want to modify:");
scanf("%s",name);
while(p!=NULL)
{
if(strcmp(p->username,name)==0)
{
printf("input the new user name:");
scanf("%s",name);
printf("\nDo you really want to chang user<%s>into new user<%s>? <y|n>",p->username,name);
scanf("%s",&s);
switch(s)
{
case 'y': strcpy(p->username,name);
printf("\nmodify name success!\n");
flag=1;
break;
case 'n': break;
default: break;
}
if(flag)
break;
}
else
p=p->next;
}
if(p==NULL)
{
printf("\n\nTIP:\n\tthe user is not exist! !");
}
}
void creatfile(MFD *create) //创建文件
{
char s,name[10];
printf("\ncreate file......");
UFD *temp,*n=create->file;
temp=get(UFD);
if(n!=NULL) //把n指向最后一个文件
{
while(n->next!=NULL)
n=n->next;//查找最后一个文件节点
n->next=temp;//为创建新文件分配UFD空间
}
else //此用户还没创建文件
{
create->file=temp;
}
printf("\n\n\t create a new file!");
printf("\n\t====input the file name : "); //输入文件名
scanf("%s",name);
strcpy(temp->filename,name);
printf("\n\n\tinput the protect type:");
printf("\n\t0 read only \n\t1 read&write"); //设置保护方式
printf("\n\t====select (0 or 1):");
scanf("%d",&temp->protect);
if(temp->protect!=0&&temp->protect!=1)
{
printf("\n\t====please select again(0 or 1): ");
scanf("%d",&temp->protect);
}
printf("\n\n\t====input the file length:"); //设置文件长度
scanf("%d",&temp->length);
temp->next=NULL;//输入完毕,此文件为最后一个文件,故此next指针为空
printf("\n\tDo you want to create one more new file?(y / n) ");
scanf("%s",&s);
switch(s)
{
case 'y':creatfile(currentuser);break; //继续创建文件
case 'n':displayfileoption();break;
default :displayfileoption();break;
}
}
void deletefile() //删除文件
{
char n[10];
UFD *p=currentuser->file,*pre=NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -