虚拟文件系统的实现

本文档描述了如何创建和管理虚拟文件系统,包括创建新的文件系统、初始化已有的虚拟磁盘、打开、创建、编辑、删除文件,以及显示文件目录等功能。代码实现了文件的读写操作,并涉及到了文件的i节点、超级块、文件目录结构等关键概念。
摘要由CSDN通过智能技术生成

这个是我们操作系统课程设计的一个题目,当时参加完趋势竞赛后在连续熬了一个星期通宵后我又熬了一个通宵把这个写好了.时间比较紧,因为晚上还要赶着写报告,真是辛苦.这个程序也就当时写了三个多小时吧,难免有些漏洞.

 // FileSys.cpp : Defines the entry point for the console application.
//
#include <stdafx.h>
#include <stdio.h>
#include <iostream.h>
#include <dos.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>          /* ctime, asctime      */
#include <string.h>
#define  FILE_BLOCKS       16     /*文件占用的最大块数*/
#define  NAME_LENGTH       10
#define  DEV_SIZE          1024 * 1024*100  /*虚拟磁盘拥有100M的空间*/
#define  BLOCK_NUM         512*200    /*磁盘中存放数据的总逻辑块数*/
#define  INODE_NUM         1000
#define  BLOCK_SIZE        512//逻辑块的大小;
#define  FILE_LEN          16*512
#define  DATA              1024*1024//定义数据区的起点;

struct time//时间结构体;
{
  short year;
  short month;
  short day;
  short hour;
  short min;
};
struct super_block/*管理块*/

 int   num_of_files;//登记系统中文件的总数;
 bool  block[BLOCK_NUM];//true表示不存在,false表示存在文件,该节点不可用;
 bool  inode[INODE_NUM];//标记inode的使用情况;
 int   first_inode_block;//第一个inode节点的偏移地址 
 int   first_file_index;//文件目录的起点
    bool  flag[200];//true表示一个组中有空闲块,false表示该组已用满;
};

struct  inode

 int num;
 char s_name[NAME_LENGTH];/*文件名*/
 short blocks;//记录文件占用的磁盘块数目;
    int s_file_length;/*文件的长度*/
 int s_used_blocks[FILE_BLOCKS];/*文件使用的磁盘块号*/
};
/*打开文件表*/
struct file_opened
{
   char name[NAME_LENGTH];
  struct inode  i_node;
  struct file_opened*next;
};
struct file_index//文件目录结构;
{
     char name[NAME_LENGTH];//存放文件名;
     unsigned int num;//文件占用的i节点号;
     struct file_index*next;//指向下一个节点的指针;
  struct time s_time;//创建或最后一次修改文件的时间;
};
void save(FILE*fp,struct super_block*super,struct file_index*index,struct inode*newinode);
/*
功能:创建一个新的文件系统;
*/
/*得到系统的当前时间*/
struct time* gettime()
{
  struct time* s_time;
  s_time = (struct time*)malloc(sizeof(struct time));
  time_t now_end; /* define 'now'. time_t is probably
                   * a typedef */
         now_end = time((time_t *)NULL); 
        /* Get the system time and put it
   * into 'now' as 'calender time' */
   tm tim;         //定义tm结构的变量tim
   now_end = time(NULL);
   tim = *localtime(&now_end);   //利用localtime将时间从time_t格式转化到tm结构中
         s_time->year = tim.tm_year;
   s_time->month = tim.tm_mon;
   s_time->day = tim.tm_mday;
   s_time->hour = tim.tm_hour;
   s_time->min = tim.tm_min;
   return s_time;
}
FILE* create_new_file_sys(struct super_block* super)
{
    FILE*fp;
 char name[NAME_LENGTH];
    struct  inode *s_inode;//存放空闲i节点的号码
 s_inode = (struct inode*)malloc(sizeof(struct inode));

 cout<<"请输入你要创建的虚拟磁盘文件名:";
 cin>>name;

    if((fp = fopen(name, "w+"))==0)
 {
        cout<<"打开文件的时候出现错误!"<<endl;
  return NULL;
    };

 fseek(fp,DEV_SIZE ,SEEK_SET);
    fputc('#',fp);/*写入文件结束标志;*/
 fseek(fp,0,SEEK_SET);
 /*将超级块写入文件*/
    /*初始化super*/
 for(int i = 0;i<INODE_NUM;i++)
 {
    super->inode[i] = true ;//初始化i节点都可用;
 }
 for( i = 0;i<BLOCK_NUM;i++)//初始化数据块都可用;
  super->block[i] = true;//true表示可用;

 for(i = 0;i<200;i++)
  super->flag[i] = true;
    super->num_of_files = 0;
    super->first_inode_block = sizeof(struct super_block);
 super->first_file_index =
  sizeof(struct super_block)+sizeof(struct inode)*INODE_NUM;
 //将超级块写入虚拟磁盘开头;
 if(fwrite(super,sizeof(struct super_block),1,fp)!= 1)
 {
  cout<<"写入超级块的时候出错!"<<endl;
  return NULL;
 }
   
    fseek(fp,super->first_inode_block,SEEK_SET);//定位到i节点开始的地方;
 for(i = 0;i<INODE_NUM;i++)
 {
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值