操作系统课程设计(二)简单文件系统实现

本文档详细介绍了如何实现一个简单的文件系统,包括初始化、格式化、进入、退出、创建文件、打开、关闭、写入、读取、删除、创建目录、删除目录、显示目录和更改当前目录等操作。通过定义数据结构如FAT表、目录项和文件打开表,以及一系列函数实现文件系统的功能。
摘要由CSDN通过智能技术生成
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #define DIR_LENGTH  1024     /*路径最长可达100字节*/
  5. #define MAX_WRITE 1024*128    /*写入文字可达128k字节*/      
  6. #define MEM_D_SIZE 1024*1024    /*1M磁盘空间*/
  7. #define DISKSIZE 1024     /*磁盘快的大小 1K*/
  8. #define MSD   5      /*最大子目录数 5 (类似五叉树)*/
  9. #define DISK_NUM MEM_D_SIZE/DISKSIZE  /*磁盘快数目 1024=1M/1K*/
  10. #define FATSIZE  DISK_NUM*sizeof(struct fatitem) /*FAT表大小 8K=8192B (理想应该是 1.5K)*/
  11. #define MOFN  5      /*最大文件打开数 5 (即除根以外最大深度为5)*/
  12. #define ROOT_DISK_NO FATSIZE/DISKSIZE+1  /*根目录起始盘快号 9*/
  13. #define ROOT_DISK_SIZE sizeof(struct direct)/*根目录大小 196*/ 
  14. /*---------------FAT表项结构-----------------------*/
  15. struct fatitem  /* size 8*/
  16. {
  17.  int item;  /*存放文件下一个磁盘的指针*/
  18.  char em_disk; /*磁盘块是否空闲标志位 0 空闲*/
  19. };
  20. /*-------------------目录项结构------------------------*/
  21. struct direct  /* size 196*/
  22. {
  23.  /*-----文件控制快信息-----*/
  24.  struct FCB
  25.  {
  26.    char name[9];  /*文件/目录名 8位*/
  27.    char property;  /*属性 1位目录 0位普通文件*/
  28.    int size;   /*文件/目录字节数(原注释位盘块数)*/
  29.    int firstdisk;  /*文件/目录 起始盘块号*/
  30.    int next;   /*子目录起始盘块号*/
  31.    int sign;   /*1是根目录 0不是根目录*/
  32.  }directitem[MSD+2];
  33. };
  34. /*------------------文件打开表项结构--------------------------*/
  35. struct opentable   /* size 104*/
  36. {
  37.  struct openttableitem /* size 20*/
  38.  {
  39.   char name[9]; /*文件名*/
  40.   int firstdisk; /*起始盘块号*/ 
  41.   int size;  /*文件的大小*/
  42.  }openitem[MOFN];
  43.  int cur_size;  /*当前打文件的数目*/
  44. };
  45. /*-------------------------------------------------------------------*/
  46. struct fatitem *fat;   /*FAT表*/
  47. struct direct *root;   /*根目录*/
  48. struct direct *cur_dir;   /*当前目录*/
  49. struct opentable u_opentable; /*文件打开表*/
  50. int  fd=-1;     /*文件打开表的序号*/
  51. char *bufferdir;    /*记录当前路径的名称*/
  52. char *fdisk;     /*虚拟磁盘起始地址*/
  53. void initfile();
  54. void   format();
  55. void enter();
  56. void     halt();
  57. int create(char *name);
  58. int   open(char *name);
  59. int  close(char *name);
  60. int write(int fd,char *buf,int len);
  61. int  read(int fd,char *buf);
  62. int   del(char *name);
  63. int mkdir(char *name);
  64. int rmdir(char *name);
  65. void dir();
  66. int cd(char *name);
  67. void print();
  68. void show();
  69. /*----------------------------------------------------------------------------------------------*/
  70. /*------------------------------------------初始化文件系统--------------------------------------*/
  71. void initfile()
  72. {
  73.  fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M空间*/
  74.  format();
  75.  free(fdisk);
  76. }
  77. /*----------------------------------------------------------------------------------------------*/
  78. /*------------------------------------------格式化----------------------------------------------*/
  79. void format()
  80. {
  81.  int i;
  82.  FILE *fp;
  83.  fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT表地址(为什么向后偏移 1k)*/
  84.  /*-----初始化FAT表------------*/
  85.  fat[0].item=-1;  /*引导块*/
  86.  fat[0].em_disk='1';
  87.  for(i=1;i<ROOT_DISK_NO-1;i++) /*存放 FAT表的磁盘块号*/
  88.  {
  89.   fat[i].item=i+1;
  90.   fat[i].em_disk='1';  
  91.  }
  92.  fat[ROOT_DISK_NO-1].item=-1;
  93.  fat[ROOT_DISK_NO-1].em_disk='1';
  94.  fat[ROOT_DISK_NO].item=-1;  /*存放根目录的磁盘块号*/
  95.  fat[ROOT_DISK_NO].em_disk='1';
  96.  for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)
  97.  {
  98.   fat[i].item = -1;
  99.   fat[i].em_disk = '0';  
  100.  }
  101.  /*-----------------------------------------------*/
  102.  root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目录的地址*/
  103.  /*初始化目录*/
  104.  /*---------指向当前目录的目录项---------*/
  105.  root->directitem[0].sign = 1;
  106.  root->directitem[0].firstdisk = ROOT_DISK_NO;
  107.  strcpy(root->directitem[0].name,".");
  108.  root->directitem[0].next = root->directitem[0].firstdisk;
  109.  root->directitem[0].property = '1';
  110.  root->directitem[0].size = ROOT_DISK_SIZE;
  111.  /*-------指向上一级目录的目录项---------*/
  112.  root->directitem[1].sign = 1;
  113.  root->directitem[1].firstdisk = ROOT_DISK_NO;
  114.  strcpy(root->directitem[1].name,"..");
  115.  root->directitem[1].next = root->directitem[0].firstdisk;
  116.  root->directitem[1].property = '1';
  117.  root->directitem[1].size = ROOT_DISK_SIZE;
  118.  for(i=2;i<MSD+2;i++) /*-子目录初始化为空-*/
  119.  {
  120.   root->directitem[i].sign = 0;
  121.   root->directitem[i].firstdisk = -1;
  122.   strcpy(root->directitem[i].name,"");
  123.   root->directitem[i].next = -1;
  124.   root->directitem[i].property = '0';
  125.   root->directitem[i].size = 0;  
  126.  }
  127.  if((fp = fopen("disk.dat","wb"))==NULL)
  128.  {
  129.   printf("Error:/n Cannot open file /n");
  130.   return;
  131.  }
  132.  if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*把虚拟磁盘空间保存到磁盘文件中*/  
  133.  {
  134.   printf("Error:/n File write error! /n");
  135.  }
  136.  fclose(fp);
  137. }
  138. /*----------------------------------------------------------------------------------------------*/
  139. /*--------------------------------进入文件系统--------------------------------------------------*/
  140. void enter()
  141. {
  142.      FILE *fp;
  143.      int i;
  144.      fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请 1M空间*/
  145.      if((fp=fopen("disk.dat","rb"))==NULL)
  146.      {
  147.           printf("Error:/nCannot open file/n");
  148.           return;                                
  149.      }
  150.      if(!fread(fdisk,MEM_D_SIZE,1,fp))  /*把磁盘文件disk.dat 读入虚拟磁盘空间(内存)*/    
  151.   {
  152.           printf("Error:/nCannot read file/n");
  153.           exit(0);  
  154.   }
  155.      fat = (struct fatitem *)(fdisk+DISKSIZE);  /*找到FAT表地址*/
  156.      root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/
  157.      fclose(fp);
  158.      /*--------------初始化用户打开表------------------*/
  159.      for(i=0;i<MOFN;i++)
  160.      {
  161.           strcpy(u_opentable.openitem[i].name,"");
  162.           u_opentable.openitem[i].firstdisk = -1;
  163.           u_opentable.openitem[i].size = 0;              
  164.      }
  165.      u_opentable.cur_size = 0;
  166.      
  167.      cur_dir = root; /*当前目录为根目录*/
  168.      bufferdir = (char *)malloc(DIR_LENGTH*sizeof(char));
  169.      strcpy(bufferdir,"Root:"); /*显示根目录为E:*/ 
  170. }
  171. /*----------------------------------------------------------------------------------------------*/
  172. /*------------------------------------退出文件系统----------------------------------------------*/
  173. void halt()
  174. {
  175.      FILE *fp;
  176.      int i;
  177.      if((fp=fopen("disk.dat","wb"))==NULL)
  178.      {
  179.           printf("Error:/nCannot open file/n");
  180.           <
  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值