C++虚拟二级文件管理系统

来源:互联网 发布:java ee 6 源码 编辑:程序博客网 时间:2024/06/03 23:02
#include <iostream>#include <fstream>#include <cmath>#include <cstdlib>#include <cstdio>#include <string>#include <ctime>using namespace std;const int MAX_NAME_SIZE=256;const int MAX_PATH_SIZE=1024;const int MAX_LINE_SIZE=256;const int MAX_USERNAME=18;const int MAX_TEXT_LINE_SIZE=1024;const int MAX_TIME_SIZE=32;struct Fold;//声明结构体struct File;struct user;fstream control_file_users;//控制文件,账户fstream data_file_folders;//数据文件,文件夹fstream data_file_files;///数据文件,文件char user_access_file[MAX_NAME_SIZE];//用户存储磁盘文件名char user_access_fold[MAX_NAME_SIZE];//用户存储磁盘文件夹Fold *currentFold;//当前目录Fold *rootFlod;//根目录char currentPath[MAX_PATH_SIZE];//当前路径char currentUser[MAX_USERNAME];//当前用户名char currentUserPassWord[MAX_USERNAME];//用户密码char curTime[MAX_TIME_SIZE];void init();//初始化Fold *mkdir(Fold *,char *);//新建文件夹void rd(Fold *,char *);//删除文件夹void cd(char *);//打开文件夹void showList(char *);//显示列表void createFile(Fold *,char *);//新建文件void readFile(char *);//读文件内容void saveToDisk();//退出时,存盘void readFromDisk();//初始化,读盘void saveFile(Fold *);//保存所有文件到磁盘void saveFold(Fold *);//保存所有目录信息磁盘void formatString(char *);//去掉字符串两端的空格Fold *findFoldByPoint(Fold *,char *);//查找当前文件夹下的文件夹Fold *findFoldByUrl(char *);//通过路径,往下找到指定文件夹File *findFileByPoint(Fold *,char *);//查找当前文件夹下的文件Fold *createNewFold(Fold *);//在文件夹下新建文件夹File *createNewFile(Fold *);//在当前文件夹下新建文件char *stringToCharArray(string);//把字符串转换成字符数组void returnParentFold();//返回上级目录bool isNameLegal(char *);//判断文件名是否合法void delFile(Fold *,File *);//通过指针删除文件void delFold(Fold *);//通过指针删除文件夹void updataFoldPath(Fold *);//更新文件下的所有文件夹的路径属性void updataFilePath(Fold *);//更新文件下的所有文件的路径属性string strSplit(char * source,char c);//依据[参数2],对[参数1]进行分割void getTime(char *);//获取当前时间;void showUserInfo();//显示当前用户@/路径void showHelpInfo();//帮助void showAboutInfo();//一些说明user *userHead;void createNewUser(char *name,char *password);//用户user *findUser(char *name,char *password);void delUser(user *);void saveUser();void alert();struct Fold { char name[MAX_NAME_SIZE]; char path[MAX_PATH_SIZE]; char time[MAX_TIME_SIZE]; Fold *father;//指向父文件夹 Fold *fold_head;//指向子目录的目录链表的头节点 File *file_head;//指向子目录的文件链表的头节点 Fold *next;//指向下一个 Fold();};struct File { char name[MAX_NAME_SIZE];//文件名 char path[MAX_PATH_SIZE];//路径 char text[MAX_TEXT_LINE_SIZE];//文件内容 char time[MAX_TIME_SIZE]; File *next;//指向下一个 Fold *father;//指向父目录 File();};struct user { char name[MAX_USERNAME]; char password[MAX_USERNAME]; user *next; user() {  strcpy(name,"");  strcpy(password,"");  next=NULL; }};void main(){ alert(); int i=0,j=0; getTime(curTime); init(); char temp_array[MAX_LINE_SIZE]; string comd;//读取一个流 while (true) {  cin>>comd;  if (comd=="mkdir")  {// mkdir /data/ddd   cin.getline(temp_array,MAX_LINE_SIZE,'\n');   formatString(temp_array);   Fold *mkdir_fo=mkdir(currentFold,temp_array);   if (mkdir_fo!=NULL)   {    cout<<"文件夹创建成功"<<endl;   }     }  else if (comd=="rd")  {// rd data   cin.getline(temp_array,MAX_LINE_SIZE,'\n');   formatString(temp_array);   rd(currentFold,temp_array);  }  else if (comd=="dir")  {// dir 或者 dir /data/ddd   cin.getline(temp_array,MAX_LINE_SIZE,'\n');   formatString(temp_array);   showList(temp_array);  }  else if (comd=="cd")  {// cd data 或者 cd /data   cin.getline(temp_array,MAX_LINE_SIZE,'\n');   formatString(temp_array);   if (strcmp(temp_array,"..")==0)   {    returnParentFold();   }   else   {    cd(temp_array);   }  }  else if (comd=="create")  {//create filename   cin.getline(temp_array,MAX_LINE_SIZE,'\n');   formatString(temp_array);   if (strlen(temp_array)>0)   {    createFile(currentFold,temp_array);   }   else   {    cout<<"文件名不能为空!"<<endl;   }     }  else if (comd=="read")  {//read filename   cin.getline(temp_array,MAX_LINE_SIZE,'\n');   formatString(temp_array);   readFile(temp_array);  }  else if (comd=="del" || comd=="delete")  {   cin.getline(temp_array,MAX_LINE_SIZE,'\n');   formatString(temp_array);   File *fi=findFileByPoint(currentFold,temp_array);   if (fi!=NULL)   {//找到了    delFile(currentFold,fi);   }   else   {    cout<<"未找到文件"<<endl;   }  }  else if (comd=="ren" || comd=="rename")  {   cin.getline(temp_array,MAX_LINE_SIZE,'\n');   formatString(temp_array);   File *renamefi=findFileByPoint(currentFold,temp_array);   if (renamefi!=NULL)   {//找到了文件    cout<<"请输入新文件名:";    cin.getline(temp_array,MAX_LINE_SIZE,'\n');    formatString(temp_array);    strcpy(renamefi->name,temp_array);    cout<<"文件重命名完成"<<endl;   }   else   {    cout<<"未找到指定文件,操作撤销"<<endl;   }  }  else if (comd=="renfold" || comd=="renamefold")  {   cin.getline(temp_array,MAX_LINE_SIZE,'\n');   formatString(temp_array);   Fold *renamefold=findFoldByUrl(temp_array);   if (renamefold==NULL)   {//路径或者文件名无效    cout<<"未找到指定文件夹,操作撤销"<<endl;   }   else   {    cout<<"请输入新文件夹名:";    cin.getline(temp_array,MAX_LINE_SIZE,'\n');    formatString(temp_array);    strcpy(renamefold->name,temp_array);    strcpy(renamefold->path,renamefold->father->path);//把父路径拿来    if (strcmp(renamefold->father->path,"/")!=0)    {//若父路径不是根目录     strcat(renamefold->path,"/");    }    strcat(renamefold->path,renamefold->name);    updataFoldPath(renamefold);//更新文件下的所有[文件夹]的路径属性    updataFilePath(renamefold);//更新文件下的所有[文件]的路径属性   }  }  else if (comd=="cls")  {//清屏   system("cls");  }  else if (comd=="save")  {//保存   saveToDisk();  }  else if (comd=="exit" || comd=="quit")  {//退出   break;  }  else if (comd=="help")  {   showHelpInfo();  }  else if (comd=="info" ||comd=="about" ||comd=="version")  {   showAboutInfo();  }  else if (comd=="alter")  {   char input_user[MAX_USERNAME];   char input_password[MAX_USERNAME];   string action;   cout<<"输入操作:";   cin>>action;   if (action=="delete" || action=="del")   {    cout<<"输入用户名:";    cin>>input_user;    cout<<"输入密码:";    cin>>input_password;    user *findResult=findUser(input_user,input_password);    if (findResult!=NULL)    {     delUser(findResult);     cout<<"用户["<<input_user<<"]已删除"<<endl;    }    else    {     cout<<"未找到指定用户\n";    }    saveUser();   }   if (action=="new")   {    cout<<"输入用户名:";    cin>>input_user;    cout<<"输入密码:";    cin>>input_password;    user *r=findUser(input_user,input_password);    if (r!=NULL)    {     cout<<"用户已存在"<<endl;    }    else    {     createNewUser(input_user,input_password);     cout<<"用户创建成功\n";    }    saveUser();   }   if (action=="show")   {    cout<<"所有用户:"<<endl;    user*p=userHead->next;    while(p!=NULL)    {     cout<<p->name<<endl;     p=p->next;    }   }  }  else  {   cout<<"无法识别的命令!"<<endl;  }  showUserInfo();//提示信息 } system("pause");}Fold::Fold(){//构造函数 father=NULL; fold_head=NULL; file_head=NULL; next=NULL; strcpy(name,""); strcpy(path,""); getTime(curTime); strcpy(time,curTime);}File::File(){//构造函数 strcpy(text,""); next=NULL; father=NULL; strcpy(name,""); strcpy(path,""); getTime(curTime); strcpy(time,curTime);}Fold *mkdir(Fold *currentFold,char *name){//新建文件夹cout<<"name="<<name<<endl; if (strcmp(name,"")==0) {  cout<<"文件夹名不能为空!"<<endl;  return NULL; } if (isNameLegal(name)==false) {  cout<<"文件夹名不合法!"<<endl;  return NULL; } if (findFoldByPoint(currentFold,name)!=NULL) {  cout<<"文件夹已存在!"<<endl;  return NULL; } Fold *fo=createNewFold(currentFold); strcpy(fo->name,name); //下面,用于产生路径 strcpy(fo->path,currentFold->path); if (strcmp(currentFold->path,"/")!=0) {//若当前不是根目录  strcat(fo->path,"/"); } strcat(fo->path,name); return fo;}void rd(Fold *currentFold,char *url){//删除文件夹 if (!isNameLegal(url)) {  cout<<"参数不合法"<<endl;  return ; } Fold *fo=findFoldByUrl(url); if (fo==NULL) {//没找到  cout<<"未找到文件夹! 操作终止"<<endl;  return; } if (fo->file_head->next!=NULL || fo->fold_head->next!=NULL) {//文件夹不空  string judge;  cout<<"文件夹不为空!\n确定要删除该文件夹下的所有文件和文件夹吗?[Y/N]"<<endl;   cin>>judge;  if (judge!="Y" && judge!="y")  {   cout<<"操作终止"<<endl;   return;  } } Fold *pre=currentFold->fold_head; Fold *p=pre->next; while (p!=NULL) {  if (p==fo)  {//调整前后节点   pre->next=p->next;   delFold(fo);   break;  }  pre=pre->next;  p=p->next; }}void cd(char *url){//打开文件夹,url可以是绝对路径,或者文件夹名 Fold *fo=findFoldByUrl(url); if (fo==NULL) {  cout<<"无法打开指定目录"<<endl;  return; } else {  currentFold=fo; }}void createFile(Fold *currentFold,char *name){//创建文件,并输入内容 if (isNameLegal(name)==false) {  cout<<"文件名不合法!"<<endl;  return; } File *f=NULL; char input[MAX_TEXT_LINE_SIZE]; f=findFileByPoint(currentFold,name); if (f!=NULL) {//已存在文件  cout<<"文件已存在,是否覆盖[Y/N]?"<<endl;  cin.getline(input,MAX_TEXT_LINE_SIZE,'\n');  if (strcmp(input,"Y")==0 || strcmp(input,"y")==0)  {   strcpy(f->text,"");//清空   cout<<"请输入文件新内容"<<endl;   cin.getline(input,MAX_TEXT_LINE_SIZE,'\n');   strcpy(f->text,input);  }  else  {   cout<<"操作取消!"<<endl;   return;  } } else {//新建文件  f=createNewFile(currentFold);  strcpy(f->name,name);  strcpy(f->path,currentFold->path);  cout<<"请输入文件内容"<<endl;  cin.getline(input,MAX_TEXT_LINE_SIZE,'\n');  strcpy(f->text,input);  f->father=currentFold; } cout<<"文件已保存"<<endl;}void delFile(Fold *fo,File *f){//通过指针删除文件 File * pre=fo->file_head; File * p=pre->next; while (p!=NULL) {  if (p==f)  {   pre->next=p->next;   delete f;   cout<<"成功删除文件"<<endl;   return ;  }  pre=p;  p=p->next; } cout<<"删除过程中出现错误!"<<endl;}void delFold(Fold *fo)//通过指针删除文件夹{//cout<<"递归"<<endl; if (fo->fold_head->next!=NULL) {//有子文件夹//cout<<"有子文件夹"<<endl;  Fold *fopre=fo->fold_head;  Fold *fop=fopre->next;  while (fop!=NULL)  {//cout<<"#2"<<endl;   fopre->next=fop->next;   delFold(fop);   fop=fopre->next;  } } if (fo->file_head->next!=NULL) {//有子文件cout<<"有子文件"<<endl;  File *fipre=fo->file_head;  File *fip=fo->file_head->next;  while (fip!=NULL)  {   fipre->next=fip->next;   delete fip;   fip=fipre->next;  } } delete fo->fold_head; delete fo->file_head; delete fo;//删除自己}void returnParentFold(){//返回上级目录 currentFold=currentFold->father;}void showList(char *url)//显示列表{//[参数可选] Fold *dirfold=NULL;//需要显示的目录 if (strcmp(url,"")==0) {//若无参数  dirfold=currentFold; } else {//绝对路径  dirfold=findFoldByUrl(url);  if (dirfold==NULL)  {//路径无效   cout<<"路径无效!"<<endl;   return ;  } } Fold * fo=dirfold->fold_head->next; while (fo!=NULL) {//输出文件夹  cout<<"<DIR>\t"<<fo->name<<"\t["<<fo->time<<"]"<<endl;  fo=fo->next; } File *fi=dirfold->file_head->next; while (fi!=NULL) {//输出文件  cout<<"<FILE>\t"<<fi->name<<"\t["<<fi->time<<"]"<<endl;  fi=fi->next; }}void readFile(char *name){//读取当前目录下的文件内容 File *f=NULL; f=findFileByPoint(currentFold,name); if (f==NULL) {  cout<<"当前文件夹下,未找到指定文件!"<<endl; } else {  cout<<"文件内容如下:"<<endl;  cout<<f->text<<endl; }}void updataFoldPath(Fold *fo){//更新[参数指定文件夹]下的所有文件夹的path属性 if (fo==NULL) {//递归结束的条件之一  return ; } strcpy(fo->path,fo->father->path);//把父路径拿来 if (strcmp(fo->father->path,"/")!=0) {//若父路径不是根目录  strcat(fo->path,"/"); } strcat(fo->path,fo->name); updataFoldPath(fo->next); updataFoldPath(fo->fold_head->next);}void updataFilePath(Fold *p){//更新[参数指定文件夹]下的path属性,因为上级目录可能更改了路径 if (p->file_head->next!=NULL) {//有子文件cout<<"有子文件"<<endl;  File *pf=p->file_head->next;  while (pf!=NULL)  {//更新文件的path信息   strcpy(pf->path,pf->father->path);   pf=pf->next;  } } if (p->fold_head->next!=NULL) {//有子文件夹cout<<"有子文件夹"<<endl;  p=p->fold_head->next;  while (p!=NULL)  {//子文件夹的兄弟节点   updataFilePath(p);//递归   p=p->next;  } }}void saveToDisk(){//存盘[trunc] data_file_folders.open(user_access_fold,ios::binary|ios::out|ios::trunc); data_file_folders.seekg(0,ios::beg); saveFold(rootFlod); data_file_folders.close(); data_file_files.open(user_access_file,ios::binary|ios::out|ios::trunc); data_file_files.seekg(0,ios::beg); saveFile(rootFlod); data_file_files.close(); cout<<"已保存"<<endl;}void readFromDisk(){//从磁盘全部读取 control_file_users.open("control_file_users.dat",ios::binary|ios::in); char tempUser[MAX_USERNAME],tempUserPassWord[MAX_USERNAME]; bool flag=false; control_file_users.seekg(ios::beg); while (control_file_users.peek()!=EOF) {  control_file_users.read(currentUser,MAX_USERNAME);  control_file_users.read(currentUserPassWord,MAX_USERNAME);  createNewUser(currentUser,currentUserPassWord); } while (!flag) {  cout<<"请登录,输入[用户名] [密码]"<<endl;  cin>>tempUser>>tempUserPassWord;  user *findUserResult=findUser(tempUser,tempUserPassWord);  if (findUserResult!=NULL)   //(   //strcmp(currentUser,tempUser)==0 && strcmp(currentUserPassWord,tempUserPassWord)==0   //)  {   strcpy(currentUser,tempUser);   strcpy(currentUserPassWord,tempUserPassWord);   flag=true;   cout<<"登录成功"<<endl;   strcpy(user_access_file,currentUser);   strcat(user_access_file,"_data_file_files.dat");   strcpy(user_access_fold,currentUser);   strcat(user_access_fold,"_data_file_folders.dat");   break;  }  control_file_users.clear(); } control_file_users.close(); //接下来,读取文件夹路径并创建文件夹 ifstream infold(user_access_fold,ios::binary|ios::in); if (infold) {  string s;  //infold.seekg(MAX_PATH_SIZE,ios::beg);//第一个路径是/,不读  char inpath[MAX_PATH_SIZE];  char temp_time[MAX_TIME_SIZE];  infold.seekg(0,ios::beg);  Fold *fo;  while(infold.peek()!=EOF)  {   infold.read(inpath,MAX_PATH_SIZE);   infold.read(temp_time,MAX_TIME_SIZE);//读取时间   //接下来,根据读取的url,创建文件夹,以及其链表   s=strSplit(inpath,'/');//把第一个'/'剔除   currentFold=rootFlod;//因为是绝对路径,借用全局变量   while (strlen(inpath)>0)   {//该级目录    s=strSplit(inpath,'/');//取一个文件名    fo=findFoldByPoint (currentFold,stringToCharArray(s));    if(fo!=NULL)    {//文件夹已存在     currentFold=fo;    }    else    {     currentFold=mkdir(currentFold,stringToCharArray(s));     strcpy(currentFold->time,temp_time);    }   }  }  currentFold=rootFlod; } infold.close(); //接下来,读取文件属性,并创建文件; ifstream infile(user_access_file,ios::binary|ios::in); if (infile) {//输入文件存在  char temp_path[MAX_PATH_SIZE];  char temp_name[MAX_NAME_SIZE];  char temp_time[MAX_TIME_SIZE];  char temp_text[MAX_TEXT_LINE_SIZE];  infile.seekg(0,ios::beg);  Fold *fo=NULL;  while (infile.peek()!=EOF)  {//开始读了   infile.read(temp_path,MAX_PATH_SIZE);   infile.read(temp_name,MAX_NAME_SIZE);   infile.read(temp_time,MAX_TIME_SIZE);   infile.read(temp_text,MAX_TEXT_LINE_SIZE);   fo=findFoldByUrl(temp_path);   File *f=createNewFile(fo);//文件建好了   strcpy(f->name,temp_name);   strcpy(f->path,fo->path);   strcpy(f->time,temp_time);   strcpy(f->text,temp_text);   //cout<<"初始化文件:"<<f->name<<endl;  } } infile.close(); showUserInfo();}void saveFile(Fold *p){//保存所有文件信息->到磁盘cout<<"path="<<p->path <<endl; if (p->file_head->next!=NULL) {//有子文件cout<<"有子文件"<<endl;  File *pf=p->file_head->next;  int i=0;  while (pf!=NULL)  {//写入文件的各种信息cout<<"写入文件:"<<pf->name<<endl;   data_file_files.write(pf->path,MAX_PATH_SIZE);//文件所在路径   data_file_files.write(pf->name,MAX_NAME_SIZE);//文件名   data_file_files.write(pf->time,MAX_TIME_SIZE);//时间戳   data_file_files.write(pf->text,MAX_TEXT_LINE_SIZE);//文件内容   pf=pf->next;  } } if (p->fold_head->next!=NULL) {//有子文件夹cout<<"有子文件夹"<<endl;  p=p->fold_head->next;  while (p!=NULL)  {//子文件夹的兄弟节点   saveFile(p);//递归   p=p->next;  } }}void saveFold(Fold *p){//保存所有目录信息->到磁盘 if (p==NULL) {  return ; } data_file_folders.write(p->path,MAX_PATH_SIZE);//先写当前路径 data_file_folders.write(p->time,MAX_TIME_SIZE);//时间戳 //cout<<"写当前路径: "<<p->path<<endl; saveFold(p->next);//递归 saveFold(p->fold_head->next);}void showUserInfo(){//格式 [userName@/path]> cout<<endl; if (strcmp(currentUser,"")!=0 && currentFold!=NULL) {  cout<<"["<<currentUser<<"@"<<currentFold->path<<">]"; }}Fold *findFoldByPoint(Fold *pp,char *name){//查找[参数指定文件夹]下的文件夹 if (pp->fold_head->next==NULL) {//当前为空文件夹  return NULL; } else {  Fold *p=pp->fold_head->next;  while (p!=NULL)  {   if (strcmp(p->name,name)==0)   {//找到了    return p;   }   p=p->next;  }  return NULL; }}Fold *findFoldByUrl(char *url){//依据[绝对||相对]路径找到指定文件夹 if (strcmp(url,"")==0) {//若参数为空  return NULL; } Fold *p=NULL; string s; if (url[0]=='/') {// cd /path1/path2/path3  p=rootFlod;  s=strSplit(url,'/');//把第一个'/'剔除  for (;p!=NULL && strlen(url)>0;)  {//该级目录已找到 && 文件名不空   s=strSplit(url,'/');//取一个文件名   p=findFoldByPoint(p,stringToCharArray(s));  }  return p; } else {// cd path2/path3  p=currentFold;  for (;p!=NULL && strlen(url)>0;)  {//cout<<"s="<<s<<endl;   s=strSplit(url,'/');//取一个文件名   p=findFoldByPoint(p,stringToCharArray(s));  }  return p; }}File *findFileByPoint(Fold * pp,char *name){//查找[指定参数文件夹]下的文件 if (pp->file_head->next==NULL) {  return NULL; } else {  File *p=pp->file_head->next;  while (p!=NULL)  {   if (strcmp(p->name,name)==0)   {//找到了    return p;   }   p=p->next;  }  return NULL; }}Fold * createNewFold(Fold *fatherFold){//在文件夹下新建文件夹 Fold *fo=new Fold();//new 一个文件夹 fo->father=fatherFold; fo->next=fatherFold->fold_head->next; fatherFold->fold_head->next=fo;//插入 Fold *foo=new Fold();//new 一个文件夹头结点 foo->father=fo;//头结点不带数据 fo->fold_head=foo; File *fii=new File();//new 一个文件头结点 fii->father=fo; fo->file_head=fii; return fo;}File * createNewFile(Fold *fatherFold){//在参数指定文件夹下新建文件 File *fi=new File(); fi->father=fatherFold; strcpy(fi->path,fatherFold->path); fi->next=fatherFold->file_head->next; fatherFold->file_head->next=fi;//插入 return fi;}string strSplit(char * source,char c){//字符数组分割,每次返回一个String,被分割字符串也变化了 int i=0,j=0; string result; for (i=0;source[i]!='\0';i++) {  if (source[i]==c)  {//cout<<"标记 1"<<endl;   break;  }  else  {//cout<<"标记 2"<<" source[i]="<<source[i]<<" result="<<result<<endl;   result=result+source[i];  } }//cout<<"标记3 "<<" i="<<i<<" j="<<j<<endl; if (i==0) {//第一个就是目标字符  for (j=1;source[j]!='\0';j++)  {//前移一位   source[j-1]=source[j];  }  source[j-1]='\0';  result=result+c;  return result; } if (i==strlen(source)) {//剩余都是  source[0]='\0';//置空  return result; } for (j=0,i++;source[i]!='\0';i++) {//cout<<"循环次数"<<" i="<<i<<" j="<<j<<endl;  source[j]=source[i];//前移,覆盖  j++; } source[j]='\0'; return result;//cout<<"result="<<result<<endl;}void formatString(char *name){//去掉字符串两端的空格 int i=0,j=0,k=0,s=0; s=strlen(name); if (s<=0) {  return; } for (i=0;i<s;i++) {  if (name[i]!=' ')  {   break;  } } for (j=s-1;j>=0;j--) {  if (name[j]!=' ')  {   name[j+1]='\0';   break;  } }//cout<<"s="<<s<<";i="<<i<<";j="<<j<<endl; for (k=0;i<=j;i++,k++) {//i,j的值,不确定  name[k]=name[i]; } name[k]='\0';}char * stringToCharArray(string s){//把string转换为字符数组 char *c=new char[s.length()+1]; for (int i=0;i<s.length();i++) {  c[i]=s[i]; } c[i]='\0'; return c;}bool isNameLegal(char * name){//判断参数是否合法(合法参数中没有'/') for (int i=0;name[i]!='\0';i++) {  if (name[i]=='/')  {   return false;  } } return true;}void getTime(char *t){//获取当前时间,返回char[] tm *timeinfo; time_t nowtime; time(&nowtime); timeinfo=localtime(&nowtime); strftime(t,MAX_TIME_SIZE,"%Y-%m-%d %H:%M:%S",timeinfo);}void showHelpInfo(){ cout<<"温馨提示:所有操作都在内存中进行,如需存入磁盘,请用save命令!"<<endl; cout<<"命令说明:"<<endl; cout<<"新建文件夹:\tmkdir [\"文件夹名\"]"<<endl; cout<<"删除文件夹:\trd [\"文件夹名\"]"<<endl; cout<<"显示文件列表:\tdir [可选参数:\"绝对路径\"]"<<endl; cout<<"打开文件夹:\tcd [\"文件夹名\"或\"绝对路径\"]"<<endl; cout<<"返回上级目录:\tcd .."<<endl; cout<<"新建文件:\tcreate [\"文件名\"]"<<endl; cout<<"读取文件:\tread [\"文件名\"]"<<endl; cout<<"删除文件:\tdel或delete [\"文件名\"]"<<endl; cout<<"重命名文件:\tren或rename [\"当前目录下原文件名\"]"<<endl; cout<<"重命名文件夹:\trenfold或renamefold [\"当前目录下的目录文件名\"]"<<endl;  cout<<"显示所有用户:\talter show"<<endl; cout<<"删除用户:\talter del或delete [userName] [userPassWord]"<<endl; cout<<"增加用户:\talter new [userName] [userPassWord]"<<endl; cout<<"清屏:\t\tcls"<<endl; cout<<"保存:\t\tsave"<<endl; cout<<"退出不保存:\texit或quit"<<endl; cout<<"关于/说明:\tinfo或about或version"<<endl; cout<<"帮助:\t\thelp"<<endl;}void alert(){ cout<<"2014 操作系统课程设计 FileSystem "; cout<<"[version 5.0 beta]"<<endl; cout<<"Designed by zhang_xiao_bai"<<endl<<endl;}void showAboutInfo(){ cout<<"\nversion 5.0 beta\n"; cout<<"1.支持 新建 文件/文件夹.\n"; cout<<"2.支持 重命名 文件/文件夹.\n"; cout<<"3.支持 删除 文件/文件夹.\n"; cout<<"4.文件/文件夹 名,支持空格等字符,不支持'/'.\n"; cout<<"5.由于CMD的局限性,不支持文件编辑,只能替换文件内容.\n"; cout<<"6.鉴于输入密码为*的效果不好(无法回退).并不是重点,所以输入密码为明文.\n"; cout<<"7.内置3组用户,分别是:root admin guest\n"; cout<<"8.默认[用户名=密码].每个用户之间 文件系统相互独立.\n\n"; cout<<"修复/更新:\n"; cout<<"1.修复删除文件夹错误的情况.\n"; cout<<"2.新增时间戳功能.\n"; cout<<"3.优化细节,优化保存和退出功能.\n"; cout<<"4.修复文件名可能为空的情况.\n"; cout<<"version 5.0 新增:\n"; cout<<"1.增加 删除用户 增加用户的功能\n";}void init(){//cout<<"init...\n"<<endl;//初始化 userHead=new user(); Fold *rootDirFold =new Fold(); rootDirFold->fold_head=new Fold(); rootDirFold->fold_head->father=rootDirFold; rootDirFold->file_head=new File(); rootDirFold->file_head->father=rootDirFold; strcpy(rootDirFold->name,"/"); strcpy(rootDirFold->path,"/"); rootDirFold->father=rootDirFold;//根目录的父目录还是根目录. rootFlod=currentFold=rootDirFold;//cout<<"根目录是"<<rootDirFold->name<<endl; control_file_users.open("control_file_users.dat",ios::binary|ios::in); control_file_users.seekg(0,ios::end);//指针移到源文件尾,经过测试>必须2个参数 int data_length=control_file_users.tellg();//得到源文件长度 control_file_users.close(); //cout<<"文件长度是"<<data_length<<endl; if (data_length<=0) {//初始化根目录cout<<"标记\n";  control_file_users.open("control_file_users.dat",ios::binary|ios::out|ios::trunc);  strcpy(currentUser,"root");  strcpy(currentUserPassWord,"root");  control_file_users.write(currentUser,MAX_USERNAME);  control_file_users.write(currentUserPassWord,MAX_USERNAME);  strcpy(currentUser,"admin");  strcpy(currentUserPassWord,"admin");  control_file_users.write(currentUser,MAX_USERNAME);  control_file_users.write(currentUserPassWord,MAX_USERNAME);  strcpy(currentUser,"guest");  strcpy(currentUserPassWord,"guest");  control_file_users.write(currentUser,MAX_USERNAME);  control_file_users.write(currentUserPassWord,MAX_USERNAME);  control_file_users.close();  readFromDisk(); } else//读取控制文件以及data {//cout<<"002"<<endl;  readFromDisk(); } cout<<"如需帮助,请用命令help"<<endl; cout<<"温馨提示:所有操作都在内存中进行,如需存入磁盘,请用save命令!"<<endl; showUserInfo();}void createNewUser(char *name,char *password){ user *newUser=new user(); strcpy(newUser->name,name); strcpy(newUser->password,password); newUser->next=userHead->next; userHead->next=newUser;}user * findUser(char *name,char *password){//cout<<"到了findUser()"; user *pre=userHead; user *p=userHead->next; while(p!=NULL) {  if(strcmp(p->name,name)==0 && strcmp(p->password,password)==0)  {  //strcpy(currentUser,p->name);   //strcpy(currentUserPassWord,p->password);   return p;  }  p=p->next; } return NULL;}void delUser(user *findResult){ user *pre=userHead; user *p=pre->next; while(p!=NULL) {  if (p==findResult)  {   pre->next=p->next;   delete p;   return ;  }  pre=pre->next;  p=p->next; }}void saveUser(){ char temp_user[MAX_USERNAME]; char temp_password[MAX_USERNAME]; fstream userfile; userfile.open("control_file_users.dat",ios::binary|ios::out|ios::trunc); userfile.seekg(0,ios::beg);//指针移到源文件尾,经过测试>必须2个参数 user *p=userHead->next; while(p!=NULL) {//cout<<"--count--"<<endl;  strcpy(temp_user,p->name);  strcpy(temp_password,p->password);  userfile.write(temp_user,MAX_USERNAME);  userfile.write(temp_password,MAX_USERNAME);  p=p->next; } userfile.close(); cout<<"用户账户已保存\n";}

0 0