// os_test.cpp : 定义控制台应用程序的入口点。
//
//#include "stdafx.h"
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
using namespace std;
/*宏定义*/
#define MEM_D_SIZE 1024*1024 //总磁盘空间为M
#define lihaoSIZE 1024 //磁盘块的大小K
#define lihao_NUM 1024 //磁盘块数目K
#define FATSIZE lihao_NUM*sizeof(struct fatitem) //FAT表大小
#define ROOT_lihao_NO FATSIZE/lihaoSIZE+1 //根目录起始盘块号
#define ROOT_lihao_SIZE sizeof(struct direct) //根目录大小
#define DIR_MAXSIZE 1024 //路径最大长度为KB
#define MSD 8 //最大子目录数
#define MOFN 8 //最大文件深度为
#define MAX_WRITE 1024*128 //最大写入文字长度KB
/*数据结构*/
struct fatitem//size 8
{
int item;//存放文件下一个磁盘的指针
char em_lihao;//磁盘块是否空闲标志位0 空闲
};
struct direct//目录结构体
{
/*文件控制快信息*/
struct FCB
{
char name[9];//文件/目录名8位
char property;//属性1位目录0位普通文件
int size; //文件/目录字节数、盘块数)
int firstlihao;//文件/目录起始盘块号
int next;//子目录起始盘块号
int sign;//1是根目录0不是根目录
}directitem[MSD+2];
};
struct opentable//文件打开表
{
struct openttableitem
{
char name[9];//文件名
int firstlihao;//起始盘块号
int size;//文件的大小
}openitem[MOFN];
int cur_size;//当前打文件的数目
};
struct fatitem *fat;//FAT表*
struct direct *root;//根目录
struct direct *cur_dir;//当前目录
struct opentable u_opentable;//文件打开表
int fd=-1; /*文件打开表的序号*/
char *bufferdir; /*记录当前路径的名称*/
char *flihao; /*虚拟磁盘起始地址*/
/*函数声明*/
void initfile();//初始化函数,申请1M空间
void format();//格式化函数
void enter();
void halt();
int create(char *name);//创建文件函数
int open(char *name);//打开文件函数
int close(char *name);//关闭文件函数
int write(char *name,int fd,char *buf,int len);//写文件函数
int read(int fd,char *buf);//读文件函数
int del(char *name);//删除文件函数
int mkdir(char *name);//创建目录函数
int rmdir(char *name);//删除目录函数
void dir();//显示当前目录下的子目录和所有文件的函数
int cd(char *name);//转换目录函数
int rename(char *name, int fd);//重命名文件函数
int copy(char *name, int fd);//复制文件函数
int move(char *name, int fd);//移动文件函数
void command();//命令函数
int inter();
void initfile()
{
flihao = (char *)malloc(MEM_D_SIZE*sizeof(char));
format();
}
void format()
{
int i;
FILE *fp;
fat = (struct fatitem *)(flihao+lihaoSIZE);
//初始化FAT表
fat[0].item=-1;
fat[0].em_lihao='1';
for(i=1;i<ROOT_lihao_NO-1;i++)
{
fat[i].item=i+1;
fat[i].em_lihao='1';
}
fat[ROOT_lihao_NO].item=-1;
fat[ROOT_lihao_NO].em_lihao='1';
for(i=ROOT_lihao_NO+1;i<lihao_NUM;i++)
{
fat[i].item = -1;
fat[i].em_lihao = '0';
}
root = (struct direct *)(flihao+lihaoSIZE+FATSIZE);
//初始化目录
root->directitem[0].sign = 1;
root->directitem[0].firstlihao = ROOT_lihao_NO;
strcpy(root->directitem[0].name,".");
root->directitem[0].next = root->directitem[0].firstlihao;
root->directitem[0].property = '1';
root->directitem[0].size = ROOT_lihao_SIZE;
//指向上一级目录的目录项
root->directitem[1].sign = 1;
root->directitem[1].firstlihao = ROOT_lihao_NO;
strcpy(root->directitem[1].name,"..");
root->directitem[1].next = root->directitem[0].firstlihao;
root->directitem[1].property = '1';
root->directitem[1].size = ROOT_lihao_SIZE;
if((fp = fopen("lihao.dat","wb"))==NULL)
{
printf("Error:\n Cannot open file \n");
return;
}
for(i=2;i<MSD+2;i++)
{
root->directitem[i].sign = 0;
root->directitem[i].firstlihao = -1;
strcpy(root->directitem[i].name,"");
root->directitem[i].next = -1;
root->directitem[i].property = '0';
root->directitem[i].size = 0;
}
if((fp = fopen("lihao.dat","wb"))==NULL)
{
printf("Error:\n Cannot open file \n");
return;
}
if(fwrite(flihao,MEM_D_SIZE,1,fp)!=1)
{
printf("Error:\n File write error! \n");
}
fclose(fp);
}
void enter()
{
FILE *fp;
int i;
flihao = (char *)malloc(MEM_D_SIZE*sizeof(char));
if((fp=fopen("lihao.dat","rb"))==NULL)
{
printf("Cannot open file\n");
return;
}
if(!fread(flihao,MEM_D_SIZE,1,fp))
{
printf("Cannot read file\n");
exit(0);
}
fat = (struct fatitem *)(flihao+lihaoSIZE);
root = (struct direct *)(flihao+lihaoSIZE+FATSIZE);
fclose(fp);
//初始化用户打开表
for(i=0;i<MOFN;i++)
{
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstlihao = -1;
u_opentable.openitem[i].size = 0;
}
u_opentable.cur_size = 0;
cur_dir = root;
bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char));
strcpy(bufferdir,"lihao:");
}
void halt()
{
FILE *fp;
int i;
if((fp=fopen("lihao.dat","wb"))==NULL)
{
printf("Error:\nCannot open file\n");
return;
}
if(!fwrite(flihao,MEM_D_SIZE,1,fp))
{
printf("Error:\nFile write error!\n");
}
fclose(fp);
free(flihao);
free(bufferdir);
return;
}
int mkdir(char *name)
{
int i,j;
struct direct *cur_mkdir;
if(!strcmp(name,"."))
return(-4);
if(!strcmp(name,".."))
return(-4);
if(strlen(name)>8)
return(-1);
for(i=2;i<MSD+2;i++)
{
if(cur_dir->directitem[i].firstlihao==-1)
break;
}
if(i>=MSD+2)//目录/文件已满
return(-2);
for(j=2;j<MSD+2;j++)//判断是否有重名
{
if(!strcmp(cur_dir->directitem[j].name,name))
break;
}
if(j<MSD+2)//如果有重名
return(-3);
for(j=ROOT_lihao_NO+1;j<lihao_NUM;j++)
{
if(fat[j].em_lihao=='0')
break;
}
if(j>=lihao_NUM)
return(-5);
fat[j].em_lihao='1';
//填写目录项
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstlihao=j;
cur_dir->directitem[i].size=ROOT_lihao_SIZE;
cur_dir->directitem[i].next=j;
cur_dir->directitem[i].property='1';
cur_mkdir=(struct direct *)(flihao+cur_dir->directitem[i].firstlihao*lihaoSIZE);
//初始化目录
cur_mkdir->directitem[0].sign=0;
cur_mkdir->directitem[0].firstlihao=cur_dir->directitem[i].firstlihao;
strcpy(cur_mkdir->directitem[0].name,".");
cur_mkdir->directitem[0].next=cur_mkdir->directitem[0].firstlihao;
cur_mkdir->directitem[0].property='1';
cur_mkdir->directitem[0].size=ROOT_lihao_SIZE;
//指向上一级目录的目录项
cur_mkdir->directitem[1].sign=cur_dir->directitem[0].sign;
cur_mkdir->directitem[1].firstlihao=cur_dir->directitem[0].firstlihao;
strcpy(cur_mkdir->directitem[1].name,"..");
cur_mkdir->directitem[1].next=cur_mkdir->directitem[1].firstlihao;
cur_mkdir->directitem[1].property='1';
cur_mkdir->directitem[1].size=ROOT_lihao_SIZE;
for(i=2;i<MSD+2;i++)
{
cur_mkdir->directitem[i].sign=0;
cur_mkdir->directitem[i].firstlihao=-1;
strcpy(cur_mkdir->directitem[i].name,"");
cur_mkdir->directitem[i].next=-1;
cur_mkdir->directitem[i].property='0';
cur_mkdir->directitem[i].size=0;
}
return 0;
}
int cd(char *name)
{
int i,j,item;
char *str;
char *temp,*point,*point1;
struct direct *temp_dir;
temp_dir=cur_dir;
str=name;
if(!strcmp("\\",name))
{
cur_dir = root;
strcpy(bufferdir,"Root:");
return 0;
}
temp = (char *)malloc(DIR_MAXSIZE*sizeof(char));
for(i=0;i<(int)strlen(str);i++)
temp[i]=str[i];
temp[i]='\0';
for(j=0;j<MSD+2;j++)
{
if(!strcmp(temp_dir->directitem[j].name,temp))
break;
}
free(temp);
if(j>=MSD+2)
return(-1);
item=temp_dir->directitem[j].firstlihao;
temp_dir=(struct direct *)(flihao+item*lihaoSIZE);
if(!strcmp("..",name))
{
if(cur_dir->directitem[j-1].sign!=1)
{
point=strchr(bufferdir,'\\');
while(point!=NULL)
{
point1=point+1;
point=strchr(point1,'\\');
}
*(point1-1)='\0';
}
}
else
{
bufferdir = strcat(bufferdir,"\\");
bufferdir = strcat(bufferdir,name);
}
cur_dir=temp_dir;
return 0;
}
int rmdir(char *name)
{
int i,j,item;
struct direct *temp_dir;
//检查当前目录项中有无该目录
for(i=2;i<MSD+2;i++)
{
if(!strcmp(cur_dir->directitem[i].name,name))
break;
}
- 1
- 2
- 3
- 4
前往页