⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 一个实现基本目录操作的操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 标准文档模板 */

#include "Stdio.h"
#include "Conio.h"
#include <stdlib.h> 
#define NULL 0

struct usernode{                  /*用户结点定义*/
 int struction;                  /*1为管理员,0为普通用户*/
 char name[20];
 struct usernode *next;
}*head=NULL,*p,*w;
typedef struct usernode Usernode;


struct catalog{                      /*文件目录结点定义*/
 char name[20];
 char creator[20];
 int  struction;                        /*当为目录时为1,当为文件时为0*/
 struct catalog *parent,*leftchild,*rightsibling;      /*定义父亲结点、最左子树、右兄弟*/
}*root=NULL,*q;

 typedef struct catalog Catalog;


/**********************************************************************************/

choose()                                  /*选择功能函数*/
{
  printf("\n\n请选择你需要的操作:\n");
  printf("\n******************************************************");
  printf("\n                                                    \n");
  printf("\n   1.创建目录        2.删除目录        3.打开目录     ");
  printf("\n   4.创建文件        5.删除文件        6.移动文件     ");
  printf("\n   7.文件重命名      8.用户登陆        9.删除用户     ");
  printf("\n   10.用户注册       11.返回到上一层   12.返回到根目录");
  printf("\n       13.查看文件信息           14.退出系统          ");
  printf("\n******************************************************");
  printf("\n");
}

/**********************************************************************************/

creatcatalog()          /*创建目录函数*/
{
  int z,c=0,d=1;
  char named[20];
  Catalog *t,*newcatalog;
  newcatalog=(Catalog*)malloc(sizeof(Catalog));
  printf("\n当前的目录为%s,输入新建子目录名:",q->name);
  scanf("%s",named);
  if(q->leftchild!=NULL)                 /*如果当前目录的最左子树不为空*/
  {
    t=q->leftchild;
     while(t!=NULL && d==1)                   /*查询是否存在相同命名的目录*/
      {
      d=0;
       for(z=0;(z<=19 && named[z]!='\0') || (t->name[z]!='\0' && z<=19);z++)
          if(named[z]!=t->name[z])
             d=1;
           if(d==1)
               t=t->rightsibling;
       }
    if(t!=NULL && t->struction==1)           /*存在相同命名时*/
     { printf("\n此目录已存在!");
       c=1;
       }
    else
     for(z=0;z<=19;z++)                       /*对新目录名赋值*/
      newcatalog->name[z]=named[z];
  }
 if(c==0)  {
  if(q->leftchild==NULL)                   /*当当前目录的最左子树为空时,直接赋值*/
   {
    q->leftchild=newcatalog;
    for(z=0;z<=19;z++)
      newcatalog->name[z]=named[z];
   }
  else {                                     /*当最左子树不为空时*/
   t=q->leftchild;
   while(t->rightsibling!=NULL)              /*将新建目录插入到当前目录的最右子树中*/
    t=t->rightsibling;
   t->rightsibling=newcatalog;
   }
  for(z=0;z<=19;z++)
  newcatalog->creator[z]=p->name[z];         /*对新建目录的其它属性赋值*/
   newcatalog->parent=q;
    newcatalog->leftchild=NULL;
     newcatalog->rightsibling=NULL;
      newcatalog->struction=1;
  print(q);
  }
}

/**********************************************************************************/

deletecatalog()                       /*删除目录函数*/
{
 int z,b=0,d=1;
 Catalog *k=q->leftchild,*l=q;
 char named[20];
 print(q);
 if(q->leftchild==NULL)                    /*当最左子树为空*/
  printf("\n没有可以删除的目录");
 else {
   while(k!=NULL && k->struction==0)         /*查询当最左子树不为空时,是否存在子目录*/
     k=k->rightsibling;
   if(k==NULL)
    printf("\n没有可以删除的目录");
   else  {                                /*当存在子目录时*/
    printf("\n输入要删除的目录名:");
    scanf("%s",named);
    while(k!=NULL && d==1)                        /*查询是否有匹配的子目录名*/
      {
      d=0;
        for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
          if(named[z]!=k->name[z])
             d=1;
           if(d==1)
           {
              l=k;
              k=k->rightsibling;
           }
       }
    if(k==NULL)
     printf("\n不存在此目录!");
    else   {                                      /*找到匹配子目录时*/
    for(z=0;z<=19;z++)
     {
       if(k->creator[z]!=p->name[z])                /*查询此子目录的创建者是否为当前用户*/
        b=1;
     }
     if(b==1)                                     /*当当前用户不为创建者*/
       printf("\n你不能删除此目录!");
    else  {
     if(l==q)                                       /*删除目录*/
       q->leftchild=k->rightsibling;
     else
       l->rightsibling=k->rightsibling;
    printf("\n删除目录成功!");
    print(q);
    }
   }
  }
 }
}

/**********************************************************************************/

opencatalog()                           /*打开目录函数*/
{
 int d=1,z;
 Catalog *t;
 char named[20];
 t=q;
 print(q);
 if(q->leftchild==NULL)                    /*当最左子树为空*/
 printf("没有可以打开的目录!");
 else {
  q=q->leftchild;
  while(q!=NULL && q->struction==0)            /*查询当最左子树不为空时,是否存在子目录*/
    q=q->rightsibling;
   if(q==NULL)                                 /*不存在子目录*/
     {
       printf("\n没有可以打开的目录!");
       q=t;
      }
   else  {
    printf("\n输入要打开的目录:");
    scanf("%s",named);
     while(q!=NULL && d==1)                       /*查询是否存在要打开的目录名*/
      {
      d=0;
       for(z=0;(z<=19 && named[z]!='\0') || (q->name[z]!='\0' && z<=19);z++)
          if(named[z]!=q->name[z])
             d=1;
           if(d==1)
               q=q->rightsibling;               /*当找到要打开的目录或者不存在此目录时停止循环*/
       }
    if(q==NULL)
      { printf("\n不存在此目录!");
        q=t;
      }
    }
   print(q);                                     /*输出当前目录状态*/
  }
}

/**********************************************************************************/

creatfile()                                  /*创建文件函数*/
{
  int z,c=0,d=1;
  char named[20];
  Catalog *t,*newfile;
  newfile=(Catalog*)malloc(sizeof(Catalog));
  printf("\n当前的目录为%s,输入新建文件名:",q->name);
  scanf("%s",named);
  if(q->leftchild!=NULL)                           /*如果当前目录的最左子树不为空*/
  {
    t=q->leftchild;
    while(t!=NULL && d==1)                          /*查询是否存在相同命名的文件*/
      {
      d=0;
       for(z=0;(z<=19 && named[z]!='\0') || (t->name[z]!='\0' && z<=19);z++)
          if(named[z]!=t->name[z])
             d=1;
           if(d==1)
               t=t->rightsibling;
       }
    if(t!=NULL && t->struction==0)                    /*存在相同命名时*/
     {
       printf("\n此文件已存在!");
       c=1;
       }
    else
     for(z=0;z<=19;z++)                               /*对新文件名赋值*/
      newfile->name[z]=named[z];
  }
 if(c==0)  {
  if(q->leftchild==NULL)                              /*当当前目录的最左子树为空时,直接赋值*/
   {
    q->leftchild=newfile;
    for(z=0;z<=19;z++)
      newfile->name[z]=named[z];
   }
  else {                                       /*当最左子树不为空时*/
   t=q->leftchild;
   while(t->rightsibling!=NULL)                 /*将新建文件插入到当前目录的最右子树中*/
    t=t->rightsibling;
   t->rightsibling=newfile;
   }
  for(z=0;z<=19;z++)                             /*对新建文件的其它属性赋值*/
   newfile->creator[z]=p->name[z];
    newfile->parent=q;
     newfile->leftchild=NULL;
      newfile->rightsibling=NULL;
       newfile->struction=0;
  print(q);
  }
}

/**********************************************************************************/

renamefile()                                          /*文件重命名函数*/
{
 Catalog *k=q->leftchild,*t=q;
 int z,d=1;
 char named[20];
 char namedn[20];
 print(q);
 if(q->leftchild==NULL)                         /*当最左子树为空*/
  printf("\n没有可以重命名的文件");
 else {
   while(k!=NULL && k->struction==1)             /*查询当最左子树不为空时,是否存在文件*/
     k=k->rightsibling;
   if(k==NULL)
    printf("\n没有可以重命名的文件");
     else  {
     printf("\n输入要重命名的文件名:");
     scanf("%s",named);
   while(k!=NULL && d==1)                    /*查询是否有符合命名的文件*/
      {
      d=0;
       for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
          if(named[z]!=k->name[z])
             d=1;
           if(d==1)
               k=k->rightsibling;
       }
    if(k==NULL)
     printf("\n不存在此文件!");
    else  {
     d=1;
     for(z=0;z<=19;z++)                      /*查询当前用户是否为文件创建者*/
     {
       if(k->creator[z]!=p->name[z])
        d=0;
     }
     if(d==0)                              /*如果不是文件创建者*/
       printf("\n你没有权限重命名此文件!");
     else   {
     printf("\n输入新的文件名:");
      scanf("%s",namedn);
       k=q->leftchild;
        d=1;
         while(k!=NULL && d==1)               /*查询新文件名是否已存在*/
         {
           d=0;
          for(z=0;(z<=19 && namedn[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
          if(namedn[z]!=k->name[z])
             d=1;
           if(d==1)
              k=k->rightsibling;
      }
    if(k!=NULL)
     printf("\n已存在此文件名!");

    else {
       k=q->leftchild;
       while(k!=NULL && d==1)                /*找到要重命名的文件*/
      {
      d=0;
       for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
          if(named[z]!=k->name[z])
             d=1;
           if(d==1)
             {
              t=k;
               k=k->rightsibling;
             }
       }
      if(t==q)                                      /*重命名操作*/
        q->leftchild=k->rightsibling;
      else
        t->rightsibling=k->rightsibling;
       k=(Catalog*)malloc(sizeof(Catalog));
        for(z=0;z<=19;z++)
         k->name[z]=namedn[z];
          if(q->leftchild==NULL)
           q->leftchild=k;
         else {
           t=q->leftchild;
           while(t->rightsibling!=NULL)
           t=t->rightsibling;
            t->rightsibling=k;
              }
    for(z=0;z<=19;z++)
      k->creator[z]=p->name[z];
        k->parent=q;
         k->leftchild=NULL;
          k->rightsibling=NULL;
           k->struction=0;
         printf("\n操作成功!");
      }
     }
   }
 }
}
      print(q);
}

/**********************************************************************************/

checkfile()                                         /*查看文件信息函数*/
{
 Catalog *k=q->leftchild;
 int z,d=1;
 char named[20];
 char namedn[20];
 print(q);
 if(q->leftchild==NULL)                         /*当最左子树为空*/
  printf("\n没有可以查看的文件");
 else {
   while(k!=NULL && k->struction==1)             /*查询当最左子树不为空时,是否存在文件*/
     k=k->rightsibling;
   if(k==NULL)
    printf("\n没有可以查看的文件");
     else  {
     printf("\n输入要查看的文件名:");
     scanf("%s",named);
   while(k!=NULL && d==1)                    /*查询是否有符合命名的文件*/
      {
      d=0;
       for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
          if(named[z]!=k->name[z])
             d=1;
           if(d==1)
               k=k->rightsibling;
       }
    if(k==NULL)
     printf("\n不存在此文件!");
    else
     printf("文件名:%s \n文件创建者:%s\n",k->name,k->creator);
    }
  }
}

/**********************************************************************************/

movefile()                                    /*移动文件函数*/
{
 Catalog *k=q->leftchild,*t=q,*s,*b;
 int z,e=0,d=1;
 char named[20];
 print(q);
 if(q->leftchild==NULL)                        /*最左子树为空*/
  printf("\n没有可以移动的文件");
 else {
   while(k!=NULL && k->struction==1)            /*当最左子树不为空时,当前目录是否存在文件*/
     k=k->rightsibling;
   if(k==NULL)
    printf("\n没有可以移动的文件");
     else  {
     k=q->leftchild;
     printf("\n输入要移动的文件名:");
     scanf("%s",named);
   while(k!=NULL && d==1)              /*查询是否存在此文件*/
      {
      d=0;
       for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
          if(named[z]!=k->name[z])
             d=1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -