#include "MyFile.h"
#include "MyFile_data.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
//初始化文件分配表
void InitFAT()
{
int i;
FAT filetable,temp;
fat = (FAT)malloc(sizeof(Node));
temp = fat;
for(i = 0;i < Block_number;i ++)
{
filetable = (FAT)malloc(sizeof(Node));
filetable->state = 0;
filetable->number = i;
filetable->next_number = -1;
filetable->start_number = -1;
filetable->length = -1;
strcpy(filetable->name,"");
filetable->next = NULL;
temp->next = filetable;
temp = temp->next;
}
}
//初始化目录
void InitDir()
{
root = (dirNode*)malloc(sizeof(node));
strcpy(root->name,"root");
root->type = 0;
root->file_state = -1;
root->father = NULL;
root->next = NULL;
root->sub = NULL;
root->state = '$';
work = root;
strcpy(path,"root");
}
//初始化文件信息表
void InitInfo_t()
{
Info_t = (Table)malloc(sizeof(table));
Info_t->length = -1;
strcpy(Info_t->path,"");
strcpy(Info_t->property,"");
Info_t->start_number = -1;
Info_t->type = 'c';
Info_t->next = NULL;
}
//创建文件
int Create_File(char way[])
{
int i = 0,j = 0;
int file_size;//文件大小
int number;//文件所要的块数
char temp[Block_number * Block_size];//输入缓存
FAT f,fa;
Table tab,t;
tab = Info_t;
f = fat->next;
dirNode *p,*q;
char temp_name[50];
char ext[10];//扩展名
char *s;
//找到上级目录
// printf("in create \n");
s = strrchr(way,'/');
// printf("in create s=%s\n",s);
if(s==NULL)
{
printf("输入不合法!文件创建失败!\n");
return 0;
}
*s = '\0';
strcpy(temp_name,way);
*s = '/';
p = Search(temp_name);
if(p)
{
q = (dirNode*)malloc(sizeof(node));
strcpy(q->extension,"无");
if(Is_copy == 0)
{
printf("请输入文件大小:");
scanf("%d",&file_size);
}
else
file_size = size;
number = (int)(file_size/Block_size);//文件所要的块数
if(file_size%Block_size != 0)
number ++;
s = strrchr(way,'/');
strcpy(temp_name,s+1);
while(temp_name[i] != '\0')
{
if(temp_name[i] == '.')//该文件有扩展名
{
s = strchr(temp_name,'.');
strcpy(ext,s+1);//取得扩展名
*s = '\0';
strcpy(q->extension,ext);
break;
}
else
{
i ++;
}
}
strcpy(q->name,temp_name);
q->sub = NULL;
q->type = 1;
q->next = NULL;
q->file_size = file_size;
strcpy(q->property,"rw");
if(p->state == '$')
{
p->sub = q;
q->father = p;
//FAT,统计空闲块数量
j = 0;
while(f)
{
if(f->state == 0)
{
j ++;
f = f->next;
}
else
f = f->next;
}//while
f = fat->next;
if(j < number)
{
printf("空间不够!文件创建失败!\n");
return 0;
free(q);
}
else//找到空闲块号分配
{
while(tab->next)//tab总是指向末尾
tab = tab->next;
t = (Table)malloc(sizeof(table));
strcpy(t->path,way);//记录文件路径
strcpy(t->property,"rw");
t->type = 'c';
t->next = NULL;
tab->next = t;
tab = tab->next;
p->state = '~';
for(i = 0;i < number;i ++)
{
while(f)
{
if(f->state == 0)
{
f->state = 1;
if(i == 0)
{
f->length = number;
t->length = number;
t->start_number = f->number;
strcpy(f->name,temp_name);
f->start_number = f->number;
q->strat_number = f->number;
}
fa = f->next;
if(fa && (i != number-1))//记录文件存放下一个块号
{
if(fa->state == 0)
f->next_number = fa->number;
else
while(fa)
{
if(fa->state == 0)
{
f->next_number = fa->number;
break;
}
else
fa = fa->next;
}
}
f = f->next;
break;
}
else
f = f->next;
}
}
if(Is_copy ==0)
{
printf("请输入文件内容:\n");
scanf("%s",temp);
//将缓存中的数据写入文件
strcpy(q->content,temp);
}
else
strcpy(q->content,"");
}
}//if(p->state == '$')
else
{
p = p->sub;
while(p->next)
{
p = p->next;
}
p->next = q;
q->father = p;
//FAT,统计空闲块数量
j = 0;
while(f)
{
if(f->state == 0)
{
j ++;
f = f->next;
}
else
f = f->next;
}//while
f = fat->next;
if(j < number)
{
printf("空间不够!文件创建失败!\n");
return 0;
free(q);
}
else//找到空闲块号分配
{
while(tab->next)//tab总是指向末尾
tab = tab->next;
t = (Table)malloc(sizeof(table));
strcpy(t->path,way);//记录文件路径
strcpy(t->property,"rw");
t->type = 'c';
t->next = NULL;
tab->next = t;
tab = tab->next;
p->state = '~';
for(i = 0;i < number;i ++)
{
while(f)
{
if(f->state == 0)
{
f->state = 1;
if(i == 0)
{
f->length = number;
t->length = number;
t->start_number = f->number;
strcpy(f->name,temp_name);
f->start_number = f->number;
q->strat_number = f->number;
}
fa = f->next;
if(fa && i != number-1)//记录文件存放下一个块号
{
if(fa->state == 0)
f->next_number = fa->number;
else
while(fa)
{
if(fa->state == 0)
{
f->next_number = fa->number;
break;
}
else
fa = fa->next;
}
}
f = f->next;
break;
}
else
f = f->next;
}
}
if(Is_copy ==0)
{
printf("请输入文件内容:\n");
scanf("%s",temp);
//将缓存中的数据写入文件
strcpy(q->content,temp);
}
else
strcpy(q->content,"");
}
}
}//if(p)
else
{
printf("路径不合法!文件创建失败\n");
return 0;
}
return 1;
}
//打开文件
void Open_File(char way[])
{
int flag = 0;//1表示文件已经打开,0表示没有打开
int ext = 0;//1表示文件有扩展名,0表示没有扩展名
int i = 0;
char operate[10];
char *s;
char temp[50];
char temp_way[50];
Table tab;
dirNode *p;
//判断文件是否有扩展名
s = strrchr(way,'/');
if(s==NULL)
{
printf("输入不合法!文件打开失败!\n");
return ;
}
strcpy(temp,s+1);
//判断该文件是否有扩展名
while(temp[i] != '\0')
{
if(temp[i] == '.')
{
ext = 1;
break;
}
else i ++;
}
if(ext)
{
s = strchr(way,'.');
*s = '\0';
strcpy(temp_way,way);
*s = '.';
p = Search(temp_way);
}
else
p = Search(way);
if(p)
{
//查找文件信息表
tab = Info_t;
while(tab)
{
if((strcmp(tab->path,way) == 0) && (tab->type == 'o'))
{
printf("文件已经打开!\n");
flag = 1;
break;
}
else tab = tab->next;
}
if(flag == 0)
{
printf("请输入打开方式:\n");
printf("read : 以读方式打开 write : 以写方式打开\n");
scanf("%s",operate);
if(strcmp(operate,"read") == 0)
{
//更新文件信息表
tab = Info_t;
while(tab)
{
if(strcmp(tab->path,way) == 0)
{
tab->type = 'o';
break;
}
else tab = tab->next;
}
Read_File(way);
}
else if(strcmp(operate,"write") == 0)
{
//更新文件信息表
tab = Info_t;
while(tab)
{
if(strcmp(tab->path,way) == 0)
{
tab->type = 'o';
break;
}
else tab = tab->next;
}
Write_File(way);
}
else
printf("命令错误!打开文件失败\n");
}
}
else
printf("路径错误!\n");
}
//关闭文件
void Close_File(char way[])
{
Table tab;
int i = 0;
int flag = 1;//1表示文件打开,0表示文件关闭
int ext = 0;//1表示文件有扩展名,0无
char *s;
char temp[50];
char temp_way[50];
dirNode *p;
s = strrchr(way,'/');
if(s==NULL)
{
printf("输入不合法!文件打开失败!\n");
return ;
} strcpy(temp,s+1)