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