采用空白文件目录结构管理磁盘空间,实现磁盘空间的分配和回收

来源:互联网 发布:ubuntu环境变量设置 编辑:程序博客网 时间:2024/06/08 05:12

实验题目:采用空白文件目录结构管理磁盘空间,实现磁盘空间的分配和回收

#include"stdio.h"
#include"math.h"
#define N 5
char fname;
int xh;
struct freearea //空白文件目录,并初始化
{
 int startaddress;//第一个空闲块

 int size;//空闲块的块数

 int state;//空闲区状态,0表示空表目,1为可用空块

 char name[100]; //用来存放进入空白文件目录的文件名称

}freeblock[N]={{8,5,1,{NULL}},{15,4,1,{NULL}},{20,7,1,{NULL}},{30,8,1,{NULL}},{60,13,1,{NULL}}};

struct filemenu //文件目录表
{
 char Fname; //文件名称

 int size;  //文件的大小

}FMenu[100];

int alloc(int applyarea)///为文件分配存储块的函数,磁盘空间的分配
{
 int i,tag=0,j=0,flag=1;

 for( i=0 ;  i< N ; i++ )
  //for( j = 0 ; j < 100 ; j++ )
  if(freeblock[i].state==1 && freeblock[i].size > applyarea && flag==1 && freeblock[i].name[xh]==NULL)
  {
   freeblock[i].startaddress = freeblock[i].startaddress + applyarea;

   freeblock[i].size=freeblock[i].size-applyarea;

   tag=1;/*有满足条件的空闲区时,tag置1*/

   flag=0;

   //freeblock[i].name=FMenu[i].Fname;
   freeblock[i].name[xh]=fname;

      //printf("$$$$$ %c/n",freeblock[i].name);

   return freeblock[i].startaddress-applyarea;
  }
  else
   if(freeblock[i].state==1 && freeblock[i].size==applyarea && flag==1 && freeblock[i].name[xh]==NULL)
   {
    freeblock[i].startaddress = freeblock[i].startaddress + applyarea;

    freeblock[i].size=freeblock[i].size-applyarea;

    freeblock[i].state=0;

    flag=0;

    tag=1;/*有满足条件的空闲区时,tag置1*/

    //freeblock[i].name=FMenu[i].Fname;
    freeblock[i].name[xh]=fname;
     //printf("******* %c/n",freeblock[i].name);
   }
   if(tag==0)
    return -1;
}
void setfree()///实现磁盘空间的回收
{
 int i,j,k;
 char s;
 printf("输入要删除的文件名: /n");
 getchar();
 scanf("%c",&s);
 for(j=0;j<100 ;j++)
  if(FMenu[j].Fname==s)
  {
   //printf("@@@ %c %d/n",FMenu[j].Fname,j);
   break;
  }
 for(i=0;i<N;i++)
 {
  for(k=0;k<100;k++)
  //printf("$$$$$ %c %d/n",freeblock[i].name,i);
  if(freeblock[i].name[k]==s)
  {
   //printf("#### %c %d/n",freeblock[i].name,i);
   freeblock[i].state=1;

   freeblock[i].startaddress=freeblock[i].startaddress - ((int)ceil(FMenu[j].size*1.0/100)) ;

   freeblock[i].size=freeblock[i].size + ((int)ceil(FMenu[j].size*1.0/100)) ;
  }
 }
}

void print()
{
 int i;
 printf("          |...................................................................|/n");
 printf("          |序号..........第一个空白块.........连续空闲块个数.........状态.....|/n");
 printf("          |...................................................................|/n");
 for(i=0;i<N;i++)
 {
 printf("          |%3d..............%3d.......................%3d..........%3d........|/n",
 i,freeblock[i].startaddress,freeblock[i].size,freeblock[i].state);
 printf("          |...................................................................|/n");
 }
}
void main()
{
 int start,i,a,k,j,same=1;
 //char name;
 printf("分配前的空白文件目录: /n");

 print();

 printf("每个空闲块内存为100/n");

 printf("可选择服务类型 /n");

    printf("1 调入新的文件/n");

    printf("2 收回文件磁盘空间 /n");
 
    printf("3 退出 /n");  /*输出功能提示*/

 printf("空闲区状态;0表示空表目,1为可用空块/n");

 printf("请选择服务类型 /n");

    scanf("%d",&a); /*读入选择的服务 */
 xh=0;
 while(a!=3)
 {
  if(a==1)
  {
   /*printf("分配前的空白文件目录: /n");

   print();*/
   same=1;

   printf("输入文件名: /n");

   getchar();
   scanf("%c",&fname);
   for(i=0;i<100;i++)
   {
                 if(FMenu[i].Fname==fname)
                 {
                    printf("已经有这个名字的文件了,请从新输入/n");
                    same=0;
                    break;
                 }
   }
   
   if(same==1)
   {
    FMenu[xh].Fname=fname;
    
    printf("输入所需磁盘大小: ");
    scanf("%d",&FMenu[xh].size);
   
   
   //k=(int)ceil(FMenu[i].size*1.0/100);
    start=alloc((int)ceil(FMenu[xh].size*1.0/100));
    
    if(start==-1)
     printf("没有足够的内存,文件等候/n");
    else
    {
     printf("分配后的空白文件目录: /n");
     print();
    }
    xh++;
   }
  }
  if(a==2)
  {
   setfree();
   
   printf("删除后的空白文件目录: /n");

   print();
  }
  printf("@@@@@请选择服务类型: /n");

    scanf("%d",&a); /*读入选择的服务 */
 }
}

 

 

原创粉丝点击