#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Block_number 128
#define Block_size 64
//目录和文件的结构定义
typedef struct node
{
char name[50]; //目录或文件的名字
int type; //0代表目录,1代表普通文件
char state;//目录状态,$表示空目录,~表示非空
int file_state;//文件状态,1表示open,0表示close
int file_size; //文件的大小
int strat_number;//文件起始盘快号
char property[5];//r-表示只读,rw表示读写
char content[Block_number * Block_size];//文件的内容
char extension[10];//文件扩展名
struct node *next; //指向下一个兄弟结点的指针
struct node *sub; //指向第一个子结点的指针
struct node *father; //指向父结点的指针
}dirNode;
//文件分配表结构定义
typedef struct Node
{
char name[50];//文件名
int start_number;//起始快号
int next_number;//文件存放位置的下一个块号
int number;//所在块号
int length;//长度
int state;//盘块记录,0表示可用,1表示占用,-1表示文件结束,其他值表示故障块
struct Node *next;
}*FAT;
//定义字符串结构
typedef struct
{
char data[100];
}string;
//记录已打开或建立的文件信息结构
typedef struct table
{
char path[100];//路径信息
char property[5];//r-表示只读,rw表示读写
int start_number;//起始块号
int length;//文件长度
char type;//o表示打开,c表示关闭
struct table *next;
}*Table;
dirNode *work;//工作目录
dirNode *root;//根目录
Table Info_t;//已打开或建立的文件信息表
FAT fat;//文件分配表,带头结点
char path[100];//记录路径
int Is_copy = 0;//表示是否是复制指令,1是
int size = 0;//复制命令时的文件大小
//函数申明
void InitFAT();//初始化文件分配表
void InitDir();//初始化目录
void InitInfo_t();//初始化文件信息表
int Create_File(char way[]);//创建文件
void Open_File(char way[]);//打开文件
void Close_File(char way[]);//关闭文件
void Read_File(char way[]);//读文件
void Write_File(char way[]);//写文件
void Delete_File(char way[]);//删除文件
void Show_Content_File(char way[]);//显示文件内容
void Copy_File(char way1[],char way2[]);//复制文件
void Change_Property_File(char way[]);//改变文件属性
void Make_Dir(char way[]);//创建目录
void Show_Dir();//显示所有目录
void Delete_Dir(char way[]);//删除目录
void Change_Dir(char way[]);//改变工作目录
dirNode *Search(char way[]);//查找路径
int order(char command[]);//命令解析
void Help();//帮助函数
//初始化文件分配表
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;
//找到上级目录
s = strrchr(way,'/');
*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;
}
r
没有合适的资源?快使用搜索试试~ 我知道了~
模拟一个小型磁盘文件管理系统
共13个文件
pdb:2个
cpp:1个
plg:1个
4星 · 超过85%的资源 需积分: 50 139 下载量 87 浏览量
2014-06-29
14:46:16
上传
评论 15
收藏 235KB ZIP 举报
温馨提示
设计一个简单的磁盘文件管理系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现: (1)支持多级目录结构,支持文件的绝对路径访问; (2)文件的逻辑结构采用流式(字节流)结构,物理结构采用链式结构中的显式链方式; (3)磁盘管理采用文件分配表; (4)实现文件操作命令:创建目录、列表目录、删除空目录、创建文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性; (5)通过主函数对所实现的功能进行测试。
资源推荐
资源详情
资源评论
收起资源包目录
OS_Test3.zip (13个子文件)
OS_Test3
OS_Test3.opt 53KB
OS_Test3.dsp 4KB
OS_Test3.ncb 57KB
OS_Test3.dsw 541B
OS_Test3.plg 895B
main.cpp 24KB
Debug
OS_Test3.ilk 198KB
vc60.idb 33KB
main.obj 47KB
OS_Test3.pdb 377KB
OS_Test3.exe 196KB
vc60.pdb 44KB
OS_Test3.pch 221KB
共 13 条
- 1
资源评论
- xunlei5672014-10-18算法有些复杂了
- 逗比的一天2015-07-01不是来喷的,运行起来有bug,命名方面及其不友好,不能做到让人望文生义,太多的if else,其实有些条件是冗余的,太多不仅影响效率,而且嵌套太多影响阅读!
- alwaysBrother2015-06-26程序可以运行,但是运行界面没有操作提示让人很茫然。
- nanfangqiulin2014-09-19内容很多,美中不足的是没有程序运行说明。
huster_yjt
- 粉丝: 2
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功