[C++] c++模拟操作系统文件管理(cd create del lsall md rd) →→→→→进入此内容的聊天室

来自 , 2020-09-08, 写在 C++, 查看 162 次.
URL http://www.code666.cn/view/c44799b0
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<iostream.h>
  4. #include<math.h>
  5. #include<stdlib.h>
  6. #include<iomanip.h>
  7.  
  8. // ******************目录和文件的结构定义******
  9. typedef struct node
  10. {
  11.         char name[50]; /*目录或文件的名字*/
  12.         int type; /*0代表目录,1代表普通文件*/
  13.         struct node *next; /*指向下一个兄弟结点的指针*/
  14.         struct node *sub; /*指向第一个子结点的指针*/
  15.         struct node *father; /*指向父结点的指针*/
  16.  
  17.         int size; /*如果是文件则表示文件的大小*/
  18.  
  19. } dirNode;
  20.  
  21. dirNode *workDir; //定义当前工作目录
  22. dirNode root; //定义根目录
  23.  
  24. char path[100]; //定义路径信息
  25.  
  26. //初始化函数
  27. void initial()
  28. {
  29.         strcpy ( root.name,"root" );
  30.         root.type=0;
  31.         root.next=NULL;
  32.         root.sub=NULL;
  33.         root.father=NULL;
  34.         root.size=0;
  35.  
  36.         workDir=&root;
  37.  
  38.         strcpy ( path,"root" );
  39. }
  40.  
  41. //初始化新结点函数
  42. dirNode *init()
  43. {
  44.         dirNode *p;
  45.  
  46.         p=new dirNode;
  47.  
  48.         strcpy ( root.name,"" );
  49.         root.type=0;
  50.         root.next=NULL;
  51.         root.sub=NULL;
  52.         root.father=NULL;
  53.         root.size=0;
  54.  
  55.         return p;
  56. }
  57.  
  58. //1 改变目录
  59. void CD ( char dirName[] )
  60. {
  61.         dirNode *p;
  62.         int flag=0;
  63.  
  64.         p=workDir->sub;
  65.         if ( p==NULL )
  66.         {
  67.                 cout<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
  68.         }
  69.         else
  70.         {
  71.                 while ( p )
  72.                 {
  73.                         if ( p->type==0 )
  74.                         {
  75.                                 if ( !strcmp ( p->name,dirName ) )
  76.                                 {
  77.                                         flag=1;
  78.                                         break;
  79.                                 }
  80.                         }
  81.                         p=p->next;
  82.                 }
  83.                 if ( flag==1 )
  84.                 {
  85.                         workDir=p;
  86.                         strcat ( path,"\\ " );
  87.                         strcat ( path,p->name );
  88.                         cout<<"工作目录已进入\""<<dirName<<"\""<<endl;
  89.                 }
  90.                 else
  91.                 {
  92.                         cout<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
  93.                 }
  94.         }
  95. }
  96.  
  97. //2 创建文件
  98. void CREATE ( char fileName[],int fileSize )
  99. {
  100.         int flag;
  101.         dirNode *p,*q;
  102.  
  103.         q=new dirNode;
  104.         strcpy ( q->name,fileName );
  105.         q->sub=NULL;
  106.         q->type=1;
  107.         q->next=NULL;
  108.         q->father=workDir;
  109.         q->size=fileSize;
  110.  
  111.         p=workDir->sub;
  112.  
  113.         if ( p==NULL )
  114.         {
  115.                 workDir->sub=q;
  116.                 cout<<"\""<<fileName<<"\"文件创建成功"<<endl;
  117.         }
  118.         else
  119.         {
  120.                 flag=0;
  121.                 while ( p )
  122.                 {
  123.                         if ( p->type==1 )
  124.                         {
  125.                                 if ( !strcmp ( p->name,fileName ) )
  126.                                 {
  127.                                         flag=1;
  128.                                         cout<<"错误,\""<<fileName<<"\"文件已存在"<<endl;
  129.                                 }
  130.                         }
  131.                         p=p->next;
  132.                 }
  133.                 if ( flag==0 )
  134.                 {
  135.                         p=workDir->sub;
  136.                         while ( p->next )
  137.                         {
  138.                                 p=p->next;
  139.                         }
  140.                         p->next=q;
  141.                         cout<<"\""<<fileName<<"\"文件创建成功"<<endl;
  142.                 }
  143.         }
  144. }
  145.  
  146. //3 删除文件
  147. void DEL ( char fileName[] )
  148. {
  149.         dirNode *p,*q;
  150.         int flag=0;
  151.  
  152.         p=workDir->sub;
  153.         if ( p==NULL )
  154.         {
  155.                 cout<<"错误,\""<<fileName<<"\"文件不存在"<<endl;
  156.         }
  157.         else
  158.         {
  159.                 while ( p )
  160.                 {
  161.                         if ( p->type==1 )
  162.                         {
  163.                                 if ( !strcmp ( p->name,fileName ) )
  164.                                 {
  165.                                         flag=1;
  166.                                         break;
  167.                                 }
  168.                         }
  169.                         p=p->next;
  170.                 }
  171.                 if ( flag==1 )
  172.                 {
  173.                         if ( p==workDir->sub )
  174.                         {
  175.                                 workDir->sub=p->next;
  176.                         }
  177.                         else
  178.                         {
  179.                                 q=workDir->sub;
  180.                                 while ( q->next!=p )
  181.                                 {
  182.                                         q=q->next;
  183.                                 }
  184.                                 q->next=p->next;
  185.                                 delete p;
  186.                         }
  187.                         cout<<"\""<<fileName<<"\"文件已删除"<<endl;
  188.                 }
  189.                 else
  190.                 {
  191.                         cout<<"错误,\""<<fileName<<"\"文件不存在"<<endl;
  192.                 }
  193.         }
  194.  
  195. }
  196.  
  197. //4 显示所有目录
  198.  
  199. //显示本目录下所有兄弟目录和文件
  200. void dir ( dirNode *p )
  201. {
  202.         while ( p )
  203.         {
  204.                 if ( p->type==0 )
  205.                 {
  206.                         cout.setf ( 2 );
  207.                         cout<<setw ( 14 ) <<p->name<<setw ( 12 ) <<"<DIR>"<<endl;
  208.                 }
  209.                 else
  210.                 {
  211.                         cout.setf ( 2 );
  212.                         cout<<setw ( 14 ) <<p->name<<setw ( 12 ) <<"<FILE>"<<setw ( 10 ) <<p->size<<endl;
  213.                 }
  214.                 p=p->next;
  215.         }
  216. }
  217. //
  218. void dirs ( dirNode *p,char str[] )
  219. {
  220.         char newstr[100];
  221.         dirNode *q;
  222.         cout<<str<<"下子目录及文件:"<<endl;
  223.         dir ( p );
  224.  
  225.         q=p;
  226.         if ( q->sub )
  227.         {
  228.                 strcpy ( newstr,"" );
  229.                 strcat ( newstr,str );
  230.                 strcat ( newstr,"\\" );
  231.                 strcat ( newstr,q->name );
  232.  
  233.                 dirs ( q->sub,newstr );
  234.         }
  235.         q=p;
  236.         while ( q->next )
  237.         {
  238.                 if ( q->next->sub )
  239.                 {
  240.                         strcpy ( newstr,"" );
  241.                         strcat ( newstr,str );
  242.                         strcat ( newstr," \\" );
  243.                         strcat ( newstr,q->next->name );
  244.  
  245.                         dirs ( q->next->sub,newstr );
  246.                 }
  247.                 q=q->next;
  248.         }
  249. }
  250.  
  251. // 显示所有目录
  252. void LSALL()
  253. {
  254.         dirNode *p;
  255.  
  256.         cout<<"显示所有目录结构"<<endl<<"--------------------------------------------"<<endl;
  257.  
  258.         p=root.sub;
  259.  
  260.         dirs ( p,"root" );
  261.  
  262.  
  263. }
  264. //5 创建目录
  265. void MD ( char dirName[] )
  266. {
  267.         int flag;
  268.         dirNode *p,*q;
  269.  
  270.         q=new dirNode;
  271.         strcpy ( q->name,dirName );
  272.         q->sub=NULL;
  273.         q->type=0;
  274.         q->next=NULL;
  275.         q->father=workDir;
  276.         q->size=0;
  277.  
  278.         p=workDir->sub;
  279.  
  280.         if ( p==NULL )
  281.         {
  282.                 workDir->sub=q;
  283.                 cout<<"\""<<dirName<<"\"子目录创建成功"<<endl;
  284.         }
  285.         else
  286.         {
  287.                 flag=0;
  288.                 while ( p )
  289.                 {
  290.                         if ( p->type==0 )
  291.                         {
  292.                                 if ( !strcmp ( p->name,dirName ) )
  293.                                 {
  294.                                         flag=1;
  295.                                         cout<<"错误,\""<<dirName<<"\"子目录已存在"<<endl;
  296.                                 }
  297.                         }
  298.                         p=p->next;
  299.                 }
  300.                 if ( flag==0 )
  301.                 {
  302.                         p=workDir->sub;
  303.                         while ( p->next )
  304.                         {
  305.                                 p=p->next;
  306.                         }
  307.                         p->next=q;
  308.                         cout<<"\""<<dirName<<"\"子目录创建成功"<<endl;
  309.                 }
  310.         }
  311. }
  312.  
  313. //6 删除目录
  314. void RD ( char dirName[] )
  315. {
  316.         /*
  317.         删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否
  318.         作删除,删除操作将该目录下的全部文件和子目录都删除
  319.  
  320.         这题目有点问题,因为CD只要求完成改变到当前目录的某一个子目录
  321.         下的功能,不要求实现相对目录以及绝对目录。所以不进入子目录是不可能在子目录下再建子目录或文件的。
  322.         因此只要实现删除工作目录的子目录就可以了,不要去管“如果该目录为空,则可删除,否则应提示是否
  323.         作删除,删除操作将该目录下的全部文件和子目录都删除”。
  324.         */
  325.         dirNode *p,*q;
  326.         int flag=0;
  327.  
  328.         p=workDir->sub;
  329.         if ( p==NULL )
  330.         {
  331.                 cout<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
  332.         }
  333.         else
  334.         {
  335.                 while ( p )
  336.                 {
  337.                         if ( p->type==0 )
  338.                         {
  339.                                 if ( !strcmp ( p->name,dirName ) )
  340.                                 {
  341.                                         flag=1;
  342.                                         break;
  343.                                 }
  344.                         }
  345.                         p=p->next;
  346.                 }
  347.                 if ( flag==1 )
  348.                 {
  349.                         if ( p==workDir->sub )
  350.                         {
  351.                                 workDir->sub=p->next;
  352.                         }
  353.                         else
  354.                         {
  355.                                 q=workDir->sub;
  356.                                 while ( q->next!=p )
  357.                                 {
  358.                                         q=q->next;
  359.                                 }
  360.                                 q->next=p->next;
  361.                                 delete p;
  362.                         }
  363.                         cout<<"\""<<dirName<<"\"子目录已删除"<<endl;
  364.                 }
  365.                 else
  366.                 {
  367.                         cout<<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
  368.                 }
  369.         }
  370.  
  371.  
  372. }
  373.  
  374. //显示版权信息函数
  375. void version()
  376. {
  377.         cout<<endl<<endl;
  378.  
  379.         cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
  380.         cout<<" ┃     模拟文件管理模拟系统        ┃"<<endl;
  381.         cout<<" ┠───────────────────────┨"<<endl;
  382.         cout<<" ┃   (c)All Right Reserved Neo       ┃"<<endl;
  383.         cout<<" ┃      sony006@163.com          ┃"<<endl;
  384.         cout<<" ┃     version 2004 build 1122      ┃"<<endl;
  385.         cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
  386.  
  387.         cout<<endl<<endl;
  388. }
  389.  
  390. void main()
  391. {
  392.         int len,fileSize,flag,comm;
  393.  
  394.         char string[50];
  395.         char command[10];
  396.         char name[40];
  397.         char *s,*s1;
  398.  
  399.         version();
  400.  
  401.         initial();
  402.  
  403.  
  404.         flag=1;
  405.         while ( flag )
  406.         {
  407.                 cout<<endl<<" 模拟文件管理模拟系统"<<endl;
  408.                 cout<<endl<<"CD 改变目录 CREATE 创建文件 DEL 删除文件 "<<endl<<"LSALL 显示目录 MD 创建目录 RD 删除目录"<<endl<<"exit 退出"<<endl;
  409.                 cout<<endl<<"-----------------------------------------------"<<endl;
  410.                 printf ( "%s:>#",path );
  411.  
  412.                 gets ( string );
  413.                 len=strlen ( string );
  414.  
  415.                 if ( len==0 )
  416.                 {
  417.                         strcpy ( command,"errer" );
  418.                 }
  419.                 else
  420.                 {
  421. //获得命令
  422.                         s=NULL;
  423.                         s=strchr ( string,' ' );
  424.                         if ( s!=NULL )
  425.                         {
  426.                                 *s='\0';
  427.                         }
  428.                         strcpy ( command,string );
  429.  
  430. //测试命令类型
  431.                         if ( ( !strcmp ( command,"CD" ) ) ||!strcmp ( command,"cd" ) )
  432.                         {
  433.                                 comm=1;
  434.                         }
  435.                         else
  436.                         {
  437.                                 if ( ( !strcmp ( command,"CREATE" ) ) ||!strcmp ( command,"create" ) )
  438.                                 {
  439.                                         comm=2;
  440.                                 }
  441.                                 else
  442.                                 {
  443.                                         if ( ( !strcmp ( command,"DEL" ) ) ||!strcmp ( command,"del" ) )
  444.                                         {
  445.                                                 comm=3;
  446.                                         }
  447.                                         else
  448.                                         {
  449.                                                 if ( ( !strcmp ( command,"LSALL" ) ) ||!strcmp ( command,"lsall" ) )
  450.                                                 {
  451.                                                         comm=4;
  452.                                                 }
  453.                                                 else
  454.                                                 {
  455.                                                         if ( ( !strcmp ( command,"MD" ) ) ||!strcmp ( command,"md" ) )
  456.                                                         {
  457.                                                                 comm=5;
  458.                                                         }
  459.                                                         else
  460.                                                         {
  461.                                                                 if ( ( !strcmp ( command,"RD" ) ) ||!strcmp ( command,"rd" ) )
  462.                                                                 {
  463.                                                                         comm=6;
  464.                                                                 }
  465.                                                                 else
  466.                                                                 {
  467.                                                                         if ( ( !strcmp ( command,"EXIT" ) ) ||!strcmp ( command,"exit" ) )
  468.                                                                         {
  469.                                                                                 comm=0;
  470.                                                                         }
  471.                                                                         else
  472.                                                                         {
  473.                                                                                 comm=100;
  474.                                                                         }
  475.                                                                 }
  476.                                                         }
  477.                                                 }
  478.                                         }
  479.                                 }
  480.                         }
  481.                         switch ( comm )
  482.                         {
  483.                         case 1:
  484. //1 改变目录
  485.                                 strcpy ( name,s+1 );
  486.                                 CD ( name );
  487.                                 break;
  488.                         case 2:
  489. //2 创建文件
  490.                                 s1=strchr ( s+1,' ' );
  491.                                 *s1='\0';
  492.                                 strcpy ( name,s+1 );
  493.                                 fileSize=atoi ( s1+1 );
  494.                                 CREATE ( name,fileSize );
  495.                                 break;
  496.                         case 3:
  497. //3 删除文件
  498.                                 strcpy ( name,s+1 );
  499.                                 DEL ( name );
  500.                                 break;
  501.                         case 4:
  502. //4 显示目录
  503.                                 LSALL();
  504.                                 break;
  505.                         case 5:
  506. //5 创建目录
  507.                                 strcpy ( name,s+1 );
  508.                                 MD ( name );
  509.                                 break;
  510.                         case 6:
  511. //6 删除目录
  512.                                 strcpy ( name,s+1 );
  513.                                 RD ( name );
  514.                                 break;
  515.                         case 0:
  516. //0 退出系统
  517.                                 flag=0;
  518.                                 break;
  519.                         default:
  520.                                 cout<<"命令错误"<<endl;
  521.                         }
  522.                 }
  523.         }
  524. }
  525.  

回复 "c++模拟操作系统文件管理(cd create del lsall md rd)"

这儿你可以回复上面这条便签

captcha