该系统包含
login 用户登陆
dir 列目录
create 创建文件
delete 删除文件
open 打开文件
close 关闭文件
read 读文件
write 写文件
2.列目录时要求列出文件名、物理地址、保护码和文件长度
3.源文件可进行读写保护
#include<stdio.h>#include<stdlib.h>
#include <string.h>
#include<iostream>
using namespace std;
#define MaxDisk 512 //一个扇区512字节
char Disk[MaxDisk]; //磁盘空间;
int usertype=0;//全局变量,当前用户类型
char usernowname[10];//全局变量,当前用户名
int nowlevel; //全局变量,当前目录层次
char usernowpath[200] = "root\\\0";
int snum=-1;
int fcount=0; //文件数
//用户类型定义
int ucount=0; //
struct users
{
char name[10];//用户名
int num; //用户编号
char pass[10];//用户密码
}user[10];
struct F_Disk
{
int surplus; //文件剩余空间
int nlength; //文件当前占用
}fdisk[100];
struct UFD
{
string Fname; //文件名
int Start; //文件在磁盘存储空间的起始地址
int num; //文件的上级 -1表示文件删除
int type; //0关闭 1打开
int limit; //文件读写权限 1读 2读写
int M_length; //文件的最大长度
}file[100];
//WENJIAN
void Main_screen();
void index();
int login();
bool createuser();
int digit();
bool createfile();
bool createfile(){
string fname;
int M_length;
int start;
cout<<"请输入要创建的文件名: ";
cin>>fname;
for(int i=0;i<fcount;i++){
if(snum==file[i].num){
if(fname==file[i].Fname)
{
printf("文件已存在!\n");
return false;
}
}
start+=file[i].M_length;
}
cout<<"请输入文件的最大容量:";
cin>>M_length;
if(MaxDisk<=start+M_length){
cout<<"磁盘空间不足!\n"<<endl;
return false;
}
cout<<"文件创建成功!"<<endl;
file[fcount].Fname=fname; //文件名
file[fcount].limit=2;
file[fcount].M_length=M_length; //文件长度
file[fcount].num=snum; //文件节点
file[fcount].Start=start;
file[fcount].type=0; //文件关闭状态
fdisk[fcount].nlength=0;
fdisk[fcount].surplus=M_length;
fcount++;
return true;
}
int login(){
char name[10];
char psw[10];
cout<<"\n\t\t用户名:";
cin>>name;
cout<<"\t\t密 码:";
cin>>psw;
if(strcmp(name,"root")==0&&strcmp(psw,"root")==0){//管理员
usertype=1;
strcat(usernowname,"root");
return 1;
}
int i;
for(i=0;i<ucount;i++){ //普通用户登陆
if(strcmp(user[i].name,name)==0&&strcmp(user[i].pass,psw)==0)
{
printf("登陆成功!\n");
strcat(usernowname,user[i].name);
snum=user[i].num;
strcpy(usernowname,name);//记录当前用户的主路径
nowlevel=-1;//记录当前目录层次
//设置路径
if(strcmp(usernowpath,"root\\")!=0){ //不是根目录就添加斜杠
strcat(usernowpath,"\\");
}
strcat(usernowpath,usernowname);
return 2;
}
}
if(i==ucount+1){
printf("输入错误\n");
return 0;
}
}
bool open(){
string fname;
cout<<"请输入文件名: ";
cin>>fname;
for(int i=0;i<fcount;i++){
if(file[i].Fname==fname){
if(snum==file[i].num){
if(file[i].type==1){
cout<<"该文件已打开!"<<endl;
return false ;
}
else{
int type;
cout<<"请选择文件打开方式<1-只读,2-可读可写>:";
cin>>type;
if(type==1)
file[i].limit=1;
else if(type==2)
file[i].limit=2;
else{
cout<<"输入错误!";
return false;
}
file[i].type=1;
cout<<"文件已打开!"<<endl;
return true;
}
}
}
}
printf("文件不存在!\n");
return false;
}
bool close(){
string fname;
cout<<"请输入文件名:";
cin>>fname;
for(int i=0;i<fcount;i++){
if(file[i].Fname==fname){
if(snum==file[i].num){
if(file[i].type==0){
cout<<"该文件未打开!"<<endl;
return false ;
}
else{
file[i].type=0;
cout<<"文件关闭!"<<endl;
return true;
}
}
}
}
printf("文件不存在!\n");
return false;
}
void logout(){
strcpy(usernowname," ");
nowlevel=-1;
snum=-1;
strcpy(usernowpath,"root\\");
}
bool createuser(){
char name[10];
char psw[10];
cout<<"\n用户名:";
cin>>name;
if(strcmp(name,"root")==0){
printf("Error!用户已存在\n");
return false;
}
else{
for(int i=0;i<ucount;i++){
if(strcmp(user[i].name,name)==0){
cout<<"用户已存在!"<<endl;
return false;
}
}
cout<<"密 码:";
cin>>psw;
cout<<"用户创建成功"<<endl;
user[ucount].num=ucount;
strcpy(user[ucount].name,name);
strcpy(user[ucount].pass,psw);
ucount++;
return true;
}
}
bool Delete(){
string fname;
cout<<"请输入文件名: ";
cin>>fname;
for(int i=0;i<fcount;i++){
if(file[i].Fname==fname){
if(snum==file[i].num){
char s;
cout<<"确认删除该文件<y or n>:";
cin>>s;
if(s=='y'){
file[i].num=-1;
cout<<"该文件已删除!占用资源已释放!"<<endl;
return true ;
}
else
return true;
}
}
}
printf("文件不存在!\n");
return false;
}
bool rename(){
string fname;
cout<<"请输入文件名: ";
cin>>fname;
for(int i=0;i<fcount;i++){
if(file[i].Fname==fname){
if(snum==file[i].num){
string rename;
cout<<"重命名:";
cin>>rename;
file[i].Fname=rename;
return true ;
}
else{
printf("文件不存在!\n");
return false;
}
}
}
printf("文件不存在!\n");
return false;
}
bool ls(){
int c=0;
for(int i=0;i<fcount;i++){
if(snum==file[i].num){
cout<<"文件名\t文件空间\t起始位置\t文件路径\t文件权限"<<endl;
cout<<file[i].Fname<<"\t"<<file[i].M_length<<"\t\t"<<file[i].Start<<"\t\t";
strcat(usernowpath,"\\");
cout<<usernowpath<<file[i].Fname;
if(file[i].limit==2)
cout<<"\t r-w"<<endl;
else
cout<<"\t r-x"<<endl;
c++;
strcpy(usernowpath,"root\\");
strcat(usernowpath,usernowname);
}
if(fcount-1==i&&c!=0)
return true;
}
printf("文件不存在!\n");
return false;
}
bool WriteFile(){
string fname;
int length;
char temp[MaxDisk]={'\0'};
cout<<"请输入文件名:";
cin>>fname;
int n=0;
for(int i=0;i<fcount;i++){
if(file[i].Fname==fname){
if(snum==file[i].num){
if(file[i].type==1){
if(file[i].limit==1){
cout<<"文件:"<<fname<<"不可写"<<endl;
return false;
}
if(file[i].limit==2){
cout<<"请输入要写入的长度:";
cin>>length;
if(length>fdisk[i].surplus){
printf("数据长度超限!\n");
return true;
}
else{
cout<<"请写入指定长度的内容:<以回车作为结束符>"<<endl;
scanf("%s",temp);
if(strlen(temp)<=length){
int j=0;
n=file[i].Start+fdisk[i].nlength;
for(int k=n;k<n+strlen(temp);k++){
Disk[k]=temp[j];
j++;
}
fdisk[i].nlength+=strlen(temp);
fdisk[i].surplus-=strlen(temp);
}
else{
int j=0;
for(int k=n;k<n+length;k++){
Disk[k]=temp[j];
j++;
}
fdisk[i].nlength+=length;
fdisk[i].surplus-=length;
}
cout<<"文件"<<fname<<"写入成功!!!"<<endl;
return true;
}
}
}
if(file[i].type==0){
cout<<"该文件未打开!"<<endl;
return false ;
}
}
}
}
printf("文件不存在!\n");
return false;
}
//读文件
bool ReadFile(){
string fname;
cout<<"请输入文件名:";
cin>>fname;
for(int i=0;i<fcount;i++){
if(file[i].Fname==fname){
if(snum==file[i].num){
if(file[i].type==0){
cout<<"该文件未打开!"<<endl;
return false ;
}
else{
if(fdisk[i].nlength==0){
cout<<"文件为空!"<<endl;
return true;
}
for(int k=file[i].Start;k<file[i].Start+fdisk[i].nlength;k++)
cout<<Disk[k];
cout<<endl;
return true;
}
}
}
}
printf("文件不存在!\n");
return false;
}
void Sdisk(){
int surplus=0;
cout<<"磁盘空间\t占用资源\t剩余资源"<<endl;
cout<< MaxDisk<<"\t\t";
if(fcount!=0){
surplus=file[fcount-1].Start+file[fcount-1].M_length;
surplus=MaxDisk-surplus;
for(int i=0;i<fcount;i++){
if(file[i].num!=-1)
surplus+=file[i].M_length;
}
cout<<surplus<<"\t\t";
cout<<MaxDisk-surplus<<"\t"<<endl;
}
else{
cout<<MaxDisk<<"\t\t";
cout<<MaxDisk-surplus<<"\t"<<endl;
}
return ;
}
void index(){
int t;
int choice;
while(1){
system("cls");
while(1){
system("cls");
printf("\n\n");
printf("\t*************************************\n");
printf("\t* 欢迎来到文件管理系统 *\n");
printf("\t *********用 户 登 录*********\n");
printf("\t*************************************\n");
t=login();
if(t!=0) break;
}
if(t==1){
bool out=false;
system("cls");
printf("\t *************************************\n");
printf("\t * 1.创建用户 2.退出登陆 *\n");
printf("\t * 3.查看磁盘 *\n");
printf("\t ***********欢迎登陆*********\n");
printf("\t 请选择操作:");
printf("\t %d:",ucount);
while(1){
fflush(stdin);
cin>>choice;
switch(choice){
case 1:
createuser();break;
case 2:
out=true;
logout();break;
case 3:
Sdisk();break;
default:
printf("Error:错误命令\n");
break;
}
printf("\t 请选择操作:");printf("\t %d:",ucount);
if(out)
break;
}
}
else if(t==2){
system("cls");
cout<<"****************文件系统**************"<<endl;
cout<<"|\t 指 令 |"<<endl;
cout<<"|\t 1.创建文件 6.写入文件 |"<<endl;
cout<<"|\t 2.删除文件 7.文件目录 |"<<endl;
cout<<"|\t 3.打开文件 8.重命文件 |"<<endl;
cout<<"|\t 4.关闭文件 9.退出系统 |"<<endl;
cout<<"|\t 5.读取文件 0.清 屏 |"<<endl;
cout<<"**************************************"<<endl;
while(1){
cout<<"\t请选择操作:";
int select;
cin>>select;
switch(select){
case 0:
system("cls");
cout<<"****************文件系统**************"<<endl;
cout<<"|\t 指 令 |"<<endl;
cout<<"|\t 1.创建文件 6.写入文件 |"<<endl;
cout<<"|\t 2.删除文件 7.文件目录 |"<<endl;
cout<<"|\t 3.打开文件 8.重命文件 |"<<endl;
cout<<"|\t 4.关闭文件 9.退出系统 |"<<endl;
cout<<"|\t 5.读取文件 0.清 屏 |"<<endl;
cout<<"**************************************"<<endl;break;
case 1:
createfile();
break;
case 2:
Delete();
break;
case 3:
open();
break;
case 4:
close();
break;
case 5:
ReadFile();
break;
case 6:
WriteFile();
break;
case 8:
rename();
break;
case 7:
ls();
break;
case 9:
logout();
index();
break;
}
}
}
}
}
int main(){
index();
}