#include "filesys.h"
int physic[100]; //文件地址缓冲区
int style=1; //文件的类型
char cur_dir[10]="root"; //当前目录
void format() //格式化
{
int i,j,k;
super_block.n=50;
for(i=0;i<50;i++) //超级块初始化
{
super_block.free[i]=i; //存放进入栈中的空闲块
super_block.stack[i]=i+50; //存放下一组的盘块
}
for(i=0;i<640;i++) //i结点信息初始化
{
for(j=0;j<100;j++)
{
i_node[i].file_address[j]=-1;//文件地址
}
i_node[i].file_length=-1; //文件长度
i_node[i].file_style=-1; //文件类型
}
for(i=0;i<640;i++) //根目录区信息初始化
{
strcpy(root[i].file_name,"");
root[i].i_num=-1;
strcpy(root[i].dir_name,"");
}
for(i=0;i<20449;i++) //存储空间初始化
{
memory[i].n=0;
memory[i].a=0;
for(j=0;j<50;j++)
{
memory[i].free[j]=-1;
}
}
for(i=0;i<20449;i++) //将空闲块的信息用成组链接的方法写进每组的最后一个块中
{ //存储空间初始化
if((i+1)%50==0)
{
k=i+1;
for(j=0;j<50;j++)
{
if(k<20450)
{
memory[i].free[j]=k;//下一组空闲地址
memory[i].n++; //下一组空闲个数 注意在memory[i].n++之前要给其赋初值
k++;
}
else
{
memory[i].free[j]=-1;
}
}
memory[i].a=0; //标记为没有使用
continue; //处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环
}
for(j=0;j<50;j++)
{
memory[i].free[j]=-1;
}
memory[i].n=0;
}
printf("已经初始化完毕\n");
printf("进入文件模拟.....\n\n");
}
void write_file(FILE *fp) //将信息读入系统文件中
{
int i;
fp=fopen("system","wb");
for(i=0;i<20449;i++)
{
fwrite(&memory[i],sizeof(struct block),1,fp);
}
fwrite(&super_block,sizeof(struct block_super),1,fp);
for(i=0;i<640;i++)
{
fwrite(&i_node[i],sizeof(struct node),1,fp);
}
for(i=0;i<640;i++)
{
fwrite(&root[i],sizeof(struct dir),1,fp);
}
fclose(fp);
}
void read_file(FILE *fp) //读出系统文件的信息
{
int i;
fp=fopen("system","rb");
for(i=0;i<20449;i++)
{
fread(&memory[i],sizeof(struct block),1,fp);
}
fread(&super_block,sizeof(struct block_super),1,fp);
for(i=0;i<640;i++)
{
fread(&i_node[i],sizeof(struct node),1,fp);
}
for(i=0;i<640;i++)
{
fread(&root[i],sizeof(struct dir),1,fp);
}
fclose(fp);
}
void callback(int length) //回收磁盘空间
{
int i,j,k,m,q=0;
for(i=length-1;i>=0;i--)
{
k=physic[i]; //需要提供要回收的文件的地址
m=49-super_block.n; //回收到栈中的哪个位置
if(super_block.n==50) //注意 当super_block.n==50时 m=-1;的值
{ //super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中
for(j=0;j<50;j++)
{
memory[k].free[j]=super_block.free[j];
}
super_block.n=0;
memory[k].n=50;
}
memory[k].a=0;
if(m==-1)
{
m=49; //将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息
}
super_block.free[m]=physic[i]; //将下一个文件地址中的盘块号回收到栈中
super_block.n++;
}
}
void allot(int length) //分配空间
{
int i,j,k,m,p;
for(i=0;i<length;i++)
{
k=50-super_block.n; //超级块中表示空闲块的指针
m=super_block.free[k]; //栈中的相应盘块的地址
p=super_block.free[49]; //栈中的最后一个盘块指向的地址
if(m==-1||memory[p].a==1) //检测是否还有下一组盘块
{
printf("内存不足,不能够分配空间\n");
callback(length);
break;
}
if(super_block.n==1)
{
memory[m].a=1; //将最后一个盘块分配掉
physic[i]=m;
super_block.n=0;
for(j=0;j<memory[m].n;j++) //从最后一个盘块中取出下一组盘块号写入栈中
{
super_block.free[j]=memory[m].free[j];
super_block.n++;
}
continue; //要跳过这次循环,下面的语句在IF中已经执行过
}
physic[i]=m; //栈中的相应盘块的地址写进 文件地址缓冲区
memory[m].a=1;
super_block.n--;
}
}
void create_file(char filename[],int length) //创建文件
{
int i,j;
for(i=0;i<640;i++)
{
if(strcmp(filename,root[i].file_name)==0)
{
printf("文件已经存在,不允许建立重名的文件\n");
return;
}
}
for(i=0;i<640;i++)
{
if(root[i].i_num==-1) //如果此文件是格式化状态
{
root[i].i_num=i;
strcpy(root[i].file_name,filename);
strcpy(root[i].dir_name,cur_dir); //把当前目录名 给新建立的文件
i_node[i].file_style=style;
i_node[i].file_length=length;
allot(length);
for(j=0;j<length;j++)
{
i_node[i].file_address[j]=physic[j];
}
break;
}
}
}
void write(char filename[])//往文件中写入信息
{
int i;
char info[200];
FILE *fp;
for(i=0;i<640;i++)
{
if(strcmp(filename,root[i].file_name)==0)
{
printf("输入你要写入的信息...\n");
scanf("%s",info);
fp=fopen("filename","w");
fputs(info,fp);
fclose(fp);
return;
}
else
{
printf("没有此文件!\n");
return;
}
}
}
void read(char filename[])//读出文件中信息
{
int i;
char info[200];
FILE *fp;
for(i=0;i<640;i++)
{
if(strcmp(filename,root[i].file_name)==0)
{
fp=fopen("filename","r");
fputs(fgets(info,200,fp),stdout);
printf("\n");
fclose(fp);
return;
}
else
{
printf("没有此文件!\n");
return;
}
}
}
void create_dir(char filename[]) //创建目录
{
style=0; //0代表文件类型是目录文件
create_file(filename,4);
style=1;
}
void del_file(char filename[]) //删除文件
{
int i,j,k;
for(i=0;i<640;i++)
{
if(strcmp(filename,root[i].file_name)==0)
{
k=root[i].i_num;
for(j=0;j<i_node[k].file_length;j++)
{
physic[j]=i_node[k].file_address[j];
}
callback(i_node[k].file_length); //调用回收函数
for(j=0;j<100;j++) //删除文件后要将文件属性和目录项的各个值恢复初值
{
i_node[k].file_address[j]=-1; //地址恢复初值
}
strcpy(root[i].file_name,""); //文件名恢复初值
root[i].i_num=-1; //目录项的I结点信息恢复初值
strcpy(root[i].dir_name,""); //目录项的文件目录信息恢复初值
i_node[k].file_length=-1; //文件长度恢复
i_node[k].file_style=-1; //文件类型恢复初值
break;
}
}
if(i==640)
{
printf("不存在这个文件\n");
}
}
void del_dir(char filename[]) //删除目录 需要判断目录下时候为空,不为空就不删除
{
int i,j,k;
for(i=0;i<640;i++) //还要加条件判断要删除的目录是不是当前目录
{
k=root[i].i_num; //找到目录名字
if( strcmp(root[i].file_name,filename)==0 && strcmp(cur_dir,filename)!=0 && (i_node[k].file_style)==0 )
{
for(j=0;j<640;j++)
{
if(strcmp(filename,root[j].dir_name)==0)
{
printf("目录不为空不能直接删除\n");
break;
}
}
if(j==640)
{
del_file(filename);
break;
}
break;
}
}
if(i==640)
{
printf("这个不是目录文件 或者不存在这个目录,或者你要删除的是当前目录\n");
}
}
void display_curdir() //显示当前目录下的文件列表
{
int i,k;
printf("\t\t文件名字 文件类型 文件长度 所属目录\n");
for(i=0;i<640;i++)
{
if(strcmp(cur_dir,root[i].dir_name)==0) //查询文件中 所在目录信息和当前目录信息相同的数据
{
k=root[i].i_num;
printf("\t\t%s\t",root[i].file_name); //文件名
printf("\t%d\t",i_node[k].file_style); //文件的类型
printf("%d\t",i_node[k].file_length); //文件的长度
printf("%s\n",root[i].dir_name); //文件所在的目录
}
}
}
void display_dir(char filename[]) //进入指定的目录
{
int i,k;
for(i=0;i<640;i++)
{
k=root[i].i_num; //判断文件类型是不是目录类型
if((strcmp(filename,root[i].file_name)==0) && (i_node[k].file_style==0))
{
strcpy(cur_dir,filename); //将要进入的指定目录设置为当前目录 赋值不要反了strcpy(目的,源)
break;
}
}
if(i==640)
{
printf("没有这个目录\n");
}
}
void open_file(char filename[]) //打开文件
{
int i,j,k;
printf("\t\t文件名字 文件类型 文件长度 所属目录\n");
for(i=0;i<640;i++)
{
k=root[i].i_num;
if(strcmp(filename,r
没有合适的资源?快使用搜索试试~ 我知道了~
二级文件系统(操作系统)
共38个文件
pdb:4个
obj:4个
dsp:2个
5星 · 超过95%的资源 需积分: 9 108 下载量 45 浏览量
2009-08-07
14:54:50
上传
评论 4
收藏 565KB RAR 举报
温馨提示
可以实现下列几条命令: Login 用户登录 Dir 列文件目录 Create 创建文件 Delete 删除文件 Open 打开文件 Close 关闭文件 Read 读文件 Write 写文件
资源推荐
资源详情
资源评论
收起资源包目录
myProject.rar (38个子文件)
myProject
myProject
myProject.dsp 4KB
filename 4B
myProject.plg 1KB
system 4.32MB
myProject.opt 48KB
myProject.dsw 541B
Debug
myProject.ilk 291KB
fileSys.sbr 0B
myProject.bsc 57KB
vc60.idb 49KB
myProject.pch 224KB
vc60.pdb 52KB
fileSys.obj 37KB
c.obj 33KB
myProject.pdb 497KB
myProject.exe 208KB
myProject.ncb 57KB
fileSys.h 730B
fileSys.cpp 13KB
myProject.dsp 4KB
filename 7B
myProject.plg 1KB
system 4.32MB
myProject.opt 48KB
myProject.dsw 541B
Debug
myProject.ilk 298KB
fileSys.sbr 0B
myProject.bsc 57KB
vc60.idb 49KB
myProject.pch 224KB
vc60.pdb 52KB
fileSys.obj 38KB
c.obj 33KB
myProject.pdb 497KB
myProject.exe 208KB
myProject.ncb 57KB
fileSys.h 730B
fileSys.cpp 13KB
共 38 条
- 1
资源评论
- ZLJmooli2017-06-10不错,基本的功能都实现了,也能正常运行
- xiumeng112012-09-06基本符合想要的功能。
- tust00022013-05-08正好能够使用自己的操作系统课程设计
- travelor2013-07-23不错,很有用,谢谢啦
- jsq12112012-09-01基本的功能都能实现!
zhouchanchan
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- CVE-2019-0708漏洞检测与利用工具
- STM32单片机FPGA毕设电路原理论文报告利用c8051f020系列单片机实现智能仪器开发
- STM32单片机FPGA毕设电路原理论文报告利用8位单片机实现与Internet网络通信应用研究
- STM32单片机FPGA毕设电路原理论文报告利用80C196单片机测量三相异步电动机功率因数
- STM32单片机FPGA毕设电路原理论文报告力学传感器与单片机的接口设计
- p107-u07FLT2.wav
- STM32单片机FPGA毕设电路原理论文报告雷达幅频特性测试仪的智能化研究
- STM32单片机FPGA毕设电路原理论文报告可组网电子温湿度测量仪的设计与实现
- STM32单片机FPGA毕设电路原理论文报告可在单片机上实现的语音混沌保密通信方法
- STM32单片机FPGA毕设电路原理论文报告可实现的基于MCS51单片机的恒温控制系统的设计
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功