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

📄 file.c

📁 操作系统演示
💻 C
📖 第 1 页 / 共 2 页
字号:
        if(strcmp(FCB[m].file_name,filename)==0&&sign_count>0)
        {   draw_FCB(FCB[m].usr_name,FCB[m].file_name,FCB[m].point_sector,FCB[m].file_size,FCB[m].time,FCB[m].property);
            draw_disk(m);
            sprintf(error,"%s","Cover? y/n");
            outtextxy(200,200,error);

            c=bioskey(0);
            setfillstyle(SOLID_FILL,BLACK);
            bar(200,200,420,230);

            if((char)c=='y')
              {
                fseek(disk, (m+2)*SECTOR_SIZE, SEEK_SET);
                fwrite(dump, SECTOR_SIZE, 1, disk);
                FCB[m].point_sector =m+2;
                FCB[m].file_size=0;
                fseek(disk, m*sizeof(FCB[m]), SEEK_SET);
                fwrite(&FCB[m],sizeof(FCB[m]),1,disk);
              }

            clear_FCB();
            clear_disk();
            return 1;
        }


      }

   if(sign_count>SECTOR_SIZE/sizeof(FCB[1]))
       return 0;

    sprintf(error,"%s","Owner:");
    outtextxy(200,200,error);
    rectangle(200,210,360,230);
    m=0;
    while(m<9)
    {  c=bioskey(0);
       if(c==ENTER)
       break;
       setcolor(YELLOW);
       FCB[sign_count].usr_name[m]=(char)c;
       m++;
       sprintf(error,"%c",c);
       outtextxy(202+10*m,215,error);
    }

     setfillstyle(SOLID_FILL,BLACK);
     bar(200,200,360,230);


     FCB[sign_count].property=2;
     FCB[sign_count].file_size=0;
     strcpy(FCB[sign_count].file_name,filename);

     FCB[sign_count].point_sector =sign_count+2;

     getdate(&d);
     sprintf(filename,"%d.%2d.%2d",d.da_year,d.da_mon,d.da_day);
     strcpy(FCB[sign_count].time,filename);

     fseek(disk, sign_count*sizeof(FCB[sign_count]), SEEK_SET);
     fwrite(&FCB[sign_count],sizeof(FCB[sign_count]),1,disk);
     sign_count++;    /*记录文件所用扇区的个数*/
     fseek(disk, 1*SECTOR_SIZE, SEEK_SET);
     fwrite(&sign_count,sizeof(sign_count),1,disk);  /*把扇区的个数保存到磁盘第1个扇区上*/


}

int del_file()
{
    int m=0;
    int c;
    char filename[20]={0};
    char error[12]={0};
    char dump[256]={0};

    sprintf(error,"%s","File_n:");
    outtextxy(200,200,error);
    rectangle(200,210,360,230);

    while(m<9)
    {  c=bioskey(0);
       if(c==ENTER)
       break;
       setcolor(YELLOW);
       filename[m]=(char)c;
       m++;
       sprintf(error,"%c",c);
       outtextxy(202+10*m,215,error);
    }
     setfillstyle(SOLID_FILL,BLACK);
     bar(200,200,360,230);

    
    for(m=0;m<=sign_count;m++)
      {
        if(strcmp(FCB[m].file_name,filename)==0&&sign_count>0)
        {   draw_FCB(FCB[m].usr_name,FCB[m].file_name,FCB[m].point_sector,FCB[m].file_size,FCB[m].time,FCB[m].property);
            sprintf(error,"%s","DEL? y/n");
            outtextxy(200,200,error);
            c=bioskey(0);
            setfillstyle(SOLID_FILL,BLACK);
            bar(200,200,420,230);

            if((char)c=='y')
             {
                 fseek(disk, (m+2)*SECTOR_SIZE, SEEK_SET);
                 fwrite(dump, SECTOR_SIZE, 1, disk);

                for(;m<=sign_count-1;m++)
                 {strcpy(FCB[m].usr_name,FCB[m+1].usr_name);
                  strcpy(FCB[m].file_name,FCB[m+1].file_name);
                  FCB[m].point_sector=FCB[m+1].point_sector;
                  FCB[m].file_size=FCB[m+1].file_size;
                  strcpy(FCB[m].time,FCB[m+1].time);
                  FCB[m].property=FCB[m+1].property;
                  fseek(disk, m*sizeof(FCB[m]), SEEK_SET);
                  fwrite(&FCB[m],sizeof(FCB[m]),1,disk);
                  }

                 sign_count--;
                 fseek(disk, 1*SECTOR_SIZE, SEEK_SET);
                 fwrite(&sign_count,sizeof(sign_count),1,disk);

             }
            clear_FCB();
            clear_disk();
            return 1;
        }

      }

    if(m>sign_count)
    {
        sprintf(error,"%s","No found");
        outtextxy(200,200,error);
        getch();
        setfillstyle(SOLID_FILL,BLACK);
        bar(200,200,420,230);
        return 0;
    }






}

int add_file()
{
   
    int m=0;
    int c;
    int rtn=0;
    char filename[20]={0};
    char error[12]={0};
    char buf[256]={0};


    sprintf(error,"%s","File_n:");
    outtextxy(200,200,error);
    rectangle(200,210,360,230);

    while(m<9)
    {  c=bioskey(0);
       if(c==ENTER)
       break;
       setcolor(YELLOW);
       filename[m]=(char)c;
       m++;
       sprintf(error,"%c",c);
       outtextxy(202+10*m,215,error);
    }
     setfillstyle(SOLID_FILL,BLACK);
     bar(200,200,360,230);

    for(m=0;m<=sign_count;m++)
      {
        if(strcmp(FCB[m].file_name,filename)==0&&sign_count>0)
        {   draw_FCB(FCB[m].usr_name,FCB[m].file_name,FCB[m].point_sector,FCB[m].file_size,FCB[m].time,FCB[m].property);
            draw_disk(m);
            sprintf(error,"%s","ADD? y/n");
            outtextxy(200,200,error);
            c=bioskey(0);
            setfillstyle(SOLID_FILL,BLACK);
            bar(200,200,420,230);

            if((char)c=='y')
             {
                 fseek(disk, (m+2)*SECTOR_SIZE+FCB[m].file_size, SEEK_SET);

                 rtn=get_file_content(buf);
                 fwrite(buf,rtn,1,disk);
                 FCB[m].file_size+=rtn;

                 fseek(disk,m*sizeof(FCB[m]),SEEK_SET);
                 fwrite(&FCB[m],sizeof(FCB[m]),1,disk);

             }
             clear_disk();
        }

         }

   if(m>sign_count)
   {
        sprintf(error,"%s","No found");
        outtextxy(200,200,error);
        getch();
        setfillstyle(SOLID_FILL,BLACK);
        bar(200,200,420,230);
        return 0;
   }

}

int get_file_content(char* buf)
{
    int ch, count=0;
    int x=0,y=0;
    char s[10]={0};
    setcolor(YELLOW);
    sprintf(s,"%s","File_c");
    outtextxy(180,70,s);
    setcolor(RED);
    rectangle(180,80,500,400);
    setcolor(GREEN);

    while ((ch = getch()) != '~')
    {
        buf[count] = ch;
        sprintf(s,"%c",ch);
        if(185+10*x>492)
         {  x=0;
            y++;
         }
        outtextxy(185+10*x,85+y*10,s);
        count++;
        x++;
    }
     setfillstyle(SOLID_FILL,BLACK);
     bar(180,70,500,400);
     clear_FCB();
     clear_disk();

    free(s);

    return count;
}



int init_disk(void)
{
    char dump[SECTOR_SIZE] = {0};
    int i;
   disk = fopen("vdisk.dat", "r+b");
   if(disk == NULL)
    {
        disk = fopen("vdisk.dat", "w+r");
            if (disk == NULL)
                return 0;

            for (i=0; i<TOTAL_SECTOR; i++)
                { fseek(disk,i*SECTOR_SIZE,SEEK_SET);
                  fwrite(dump, SECTOR_SIZE, 1, disk);
                 }
    }

    return (int)disk;
}

void close_disk(void)           /*关闭文件*/
{
    fclose(disk);
}

int read_disk(int sector, void* buf)
/* 把磁盘的第sector个扇区内容读入到buf
   sector从0开始编号
   运行正确返回非0值,错误返回0 */
{
    if (!init_disk())
        return 0;

    fseek(disk, sector*SECTOR_SIZE, SEEK_SET);  /*SEEK代表0 将位置指针移到离文件头sector*SECTOR_SIZE个字节处*/
    return fread(buf, SECTOR_SIZE, 1, disk);
}

int write_disk(int sector, void* buf)
/* 把buf中SECTOR_SIZE个字节的数据写到磁盘的第sector个扇区
   sector从0开始编号
   运行正确返回非0值,错误返回0 */
{
    if (!init_disk())
        return 0;

    fseek(disk, sector*SECTOR_SIZE, SEEK_SET);
    return fwrite(buf, SECTOR_SIZE, 1, disk);
}


int draw_FCB(char *usr_name,char *file_name ,int point_sector,int size,char *time,int property)
{   int i;
    char s[15]={0};
    setcolor(YELLOW);
    sprintf(s,"%s","FCB");
    outtextxy(20,70,s);
    setcolor(RED);
    rectangle(20,80,170,400);

    line(80,80,80,400);

    for(i=0;i<=4;i++)
    {
        line(20,134+i*54,170,134+i*54);
    }

    settextjustify(0,3);
    setcolor(GREEN);
    sprintf(s,"%s","USR_NA");
    outtextxy(25,100,s);
    sprintf(s,"%s",usr_name);
    outtextxy(85,100,s);

    sprintf(s,"%s","FIL_NA");
    outtextxy(25,154,s);
    sprintf(s,"%s",file_name);
    outtextxy(85,154,s);

    sprintf(s,"%s","SECOTR");
    outtextxy(25,208,s);
    sprintf(s,"%d",point_sector);
    outtextxy(85,208,s);

    sprintf(s,"%s","SIZE");
    outtextxy(30,262,s);
    sprintf(s,"%d",size);
    outtextxy(85,262,s);

    sprintf(s,"%s","TIME");
    outtextxy(30,316,s);
    sprintf(s,"%s",time);
    outtextxy(85,316,s);

    sprintf(s,"%s","PORERTY");
    outtextxy(22,370,s);
    sprintf(s,"%d",property);
    outtextxy(85,370,s);

     return 1;

}

int clear_FCB()
{
    setfillstyle(SOLID_FILL,9);
    bar(20,70,170,400);
    return 1;
}

int draw_disk(int m)
{   int x=0,y=0;
    int i=0;
    char buf[2]={0};
    fseek(disk,(m+2)*SECTOR_SIZE, SEEK_SET);
    fread(buf,1,1,disk);
    for(;i<SECTOR_SIZE;i++)
    {
      if(i%16==0)
       {
        x=0;
        y++;
       }

      if(buf[0]!=0)
       {  setfillstyle(SOLID_FILL,RED);
          bar(505+x*7,70+y*7,510+x*7,75+y*7);
       }
      else
       {
          setfillstyle(SOLID_FILL,GREEN);
          bar(505+x*7,70+y*7,510+x*7,75+y*7);
       }
        x++;
       fseek(disk,(m+2)*SECTOR_SIZE+i, SEEK_SET);
       fread(buf,1,1,disk);
    }



 return 1;

}

int clear_disk()
{
    setfillstyle(SOLID_FILL,9);
    bar(500,70,630,200);

}

⌨️ 快捷键说明

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