#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include "fat16.h"
//位图
unsigned __int8 bitMap[BIT_MAP_ROW][BIT_MAP_COL];
//读写缓存,这里取一个簇的大小
unsigned __int8 rwBuffer[BUFFER_SIZE];
//当前工作目录
char curWorkDir[PATH_LEN];
//根目录的FCB
struct FCB rootFCB;
//当前文件夹的FCB
struct FCB curFCB;
//fat表
unsigned __int16 fatTable[CLUSTER_NUM];
//硬盘文件的句柄
FILE *disk;
//打开文件的句柄
struct fileHANDLE fHandle[MAX_FILE_OPEN];
void fatFormat()
{
disk = fopen("fat16.disk","wb+");
struct FCB root;
int i,j,k;
k = 0;
printf("开始硬盘格式化......\n");
//初始化缓存
for(i = 0;i < BUFFER_SIZE;i++)
{
rwBuffer[i] = '0';
}
//初始化fat表
for(i = 0;i < CLUSTER_NUM;i++)
{
fatTable[i] = 0;
}
//初始化bitMap表,置为1表示未使用,置为为0表示使用
for(i = 0;i < BIT_MAP_ROW;i++)
for(j = 0;j < BIT_MAP_COL;j++)
{
if(k <= DATE_START)
{
bitMap[i][j]=0;
}
else
{
bitMap[i][j]=1;
}
k++;
}
//初始化硬盘
for(i = 0;i < CLUSTER_NUM;i++)
{
fwrite(rwBuffer,sizeof(__int8),BUFFER_SIZE,disk);
}
//写fat表,占256块,编号为0-255,大小为128kB
/* fseek(disk,0,SEEK_SET);
fwrite(fatTable,sizeof(__int16),CLUSTER_NUM,disk);
//写bitmap表,占16*8块,编号为256-383,大小为64kB
fseek(disk,256*BLOCK_SIZE,SEEK_SET);
for(i = 0;i < BIT_MAP_ROW;i++)
{
fwrite(bitMap[i],sizeof(__int8),BIT_MAP_COL,disk);
}
*/
//写分区信息占用物理块号为399块,即根FCB的信息,这里应该使用的是编号为400的块
fseek(disk,VOLUM_START*BLOCK_SIZE,SEEK_SET);
root.block_no = DATE_START;
root.block_num = 1;
root.create_time = time(NULL);
root.file_size = 2;
root.file_type = DIR_TYPE;
strcpy(root.filename,"C:");
root.last_modify = time(NULL);
//writeFCB(&root);
fwrite(&root,sizeof(struct FCB),1,disk);
//文件指针定位到下一块,这里是根目录的内容
fseek(disk,DATE_START*BLOCK_SIZE,SEEK_SET);
//写两个文件目录.和..
strcpy(root.filename,".");
//writeFCB(&root);
fwrite(&root,sizeof(struct FCB),1,disk);
strcpy(root.filename,"..");
//writeFCB(&root);
fwrite(&root,sizeof(struct FCB),1,disk);
/*strcpy(root.filename,"program");
root.block_no = mallocBlock();
root.file_size = 4;
fwrite(&root,sizeof(struct FCB),1,disk);
fseek(disk,root.block_no*BLOCK_SIZE,SEEK_SET);
strcpy(root.filename,".");
//writeFCB(&root);
fwrite(&root,sizeof(struct FCB),1,disk);
strcpy(root.filename,"..");
fwrite(&root,sizeof(struct FCB),1,disk);
root.block_no = mallocBlock();
root.block_num = 1;
root.file_size = 0;
root.file_type = FILE_TYPE;
strcpy(root.filename,"test.txt");
fwrite(&root,sizeof(struct FCB),1,disk);
root.block_no =mallocBlock();
strcpy(root.filename,"youjingdi.txt");
fwrite(&root,sizeof(struct FCB),1,disk);
*/
fseek(disk,0,SEEK_SET);
fwrite(fatTable,sizeof(__int16),CLUSTER_NUM,disk);
//写bitmap表,占16*8块,编号为256-383,大小为64kB
for(i = 0;i < BIT_MAP_ROW;i++)
{
fwrite(bitMap[i],sizeof(__int8),BIT_MAP_COL,disk);
}
printf("格式化完毕\n");
fclose(disk);
fatInit();
}
void fatInit()
{
int i;
disk = fopen("fat16.disk","rb+");
if(disk==NULL)
{
printf("format the disk?[y/n]:");
i = getchar();
if(i=='y'|| i=='Y')
fatFormat();
else
{
exit(0);
}
}
disk = fopen("fat16.disk","rb+");
fseek(disk,0,SEEK_SET);
fread(fatTable,sizeof(__int16),CLUSTER_NUM,disk);
//写bitmap表,占16*8块,编号为256-383,大小为64kB
fseek(disk,256*BLOCK_SIZE,SEEK_SET);
for(i = 0;i < BIT_MAP_ROW;i++)
{
fread(bitMap[i],sizeof(__int8),BIT_MAP_COL,disk);
}
for(i = 0;i < MAX_FILE_OPEN;i++)
{
fHandle[i].cur_point = 0;
fHandle[i].file_fcb.block_no = 0;
fHandle[i].file_fcb.block_num = 0;
fHandle[i].file_fcb.create_time = 0;
fHandle[i].file_fcb.file_size = 0;
fHandle[i].file_fcb.file_type = 0;
strcpy(fHandle[i].file_fcb.filename,"");
fHandle[i].file_fcb.last_modify = 0;
fHandle[i].handle = -1;
}
fseek(disk,VOLUM_START*BLOCK_SIZE,SEEK_SET);
fread(&rootFCB,sizeof(struct FCB),1,disk);
//printf("%d\n",rootFCB.file_size);
memcpy(&curFCB,&rootFCB,sizeof(struct FCB));
strcpy(curWorkDir,"C:");
}
int fatCreate(char *fileName)
{
struct FCB tmpFCB;
struct FCB fileFCB;
struct FCB backup_curfcb;
char backup_curdir[PATH_LEN+1];
char backup_fileName[NAME_LEN+1];
int i,j,k;
int size,blockNum,blockNo;
memcpy(&tmpFCB,&curFCB,sizeof(struct FCB));
blockNo = tmpFCB.block_no;
blockNum = tmpFCB.block_num;
size = tmpFCB.file_size;
fseek(disk,blockNo*BLOCK_SIZE,SEEK_SET);
for(i = 0;i < size;i++)
{
if(i!=0 && i%16==0)
{
blockNo = fatTable[blockNo];
fseek(disk,blockNo*BLOCK_SIZE,SEEK_SET);
}
fread(&tmpFCB,sizeof(struct FCB),1,disk);
if(strcmp(tmpFCB.filename,fileName)==0)
{
printf("the name is used\n");
return -1;
}
}
memcpy(&tmpFCB,&curFCB,sizeof(struct FCB));
blockNo = tmpFCB.block_no;
blockNum = tmpFCB.block_num;
size = tmpFCB.file_size;
//跳转到最后一块
for(i = 0;i < blockNum -1;i++)
{
blockNo = fatTable[blockNo];
}
size=size%16;
if(size==0)
{
//当前块已经满了,需要申请新的物理块
fatTable[blockNo] = mallocBlock();
//切换到当前工作块上
blockNo = fatTable[blockNo];
tmpFCB.block_num++;
}
tmpFCB.file_size++;
fseek(disk,blockNo*BLOCK_SIZE+size*(sizeof(struct FCB)),SEEK_SET);
fileFCB.block_no = mallocBlock();
fileFCB.block_num = 1;
fileFCB.create_time = time(NULL);
fileFCB.file_size = 0;
fileFCB.file_type = FILE_TYPE;
strcpy(fileFCB.filename,fileName);
fileFCB.last_modify = time(NULL);
fwrite(&fileFCB,sizeof(struct FCB),1,disk);
//已经是根目录了。则直接修改根FCB即可
if(strcmp(curWorkDir,"C:")==0)
{
fseek(disk,VOLUM_START*BLOCK_SIZE,SEEK_SET);
fwrite(&tmpFCB,sizeof(struct FCB),1,disk);
memcpy(&rootFCB,&tmpFCB,sizeof(struct FCB));
memcpy(&curFCB,&tmpFCB,sizeof(struct FCB));
}
//否则跳到上一级目录
else
{
//备份当前工作目录和当前的FCB
strcpy(backup_curdir,curWorkDir);
memcpy(&backup_curfcb,&tmpFCB,sizeof(struct FCB));
getLastName(backup_curdir,backup_fileName);
//切换到上一级目录,来修改其当前文件夹的FCB内容
cd("..");
blockNo = curFCB.block_no;
size = curFCB.file_size;
fseek(disk,blockNo*BLOCK_SIZE,SEEK_SET);
for(i = 0;i < size;i++)
{
fread(&tmpFCB,sizeof(struct FCB),1,disk);
{
if(strcmp(tmpFCB.filename,backup_fileName)==0 && tmpFCB.file_type == DIR_TYPE)
{
printf("yes find \n");
break;
}
}
}
fseek(disk,0-sizeof(struct FCB),SEEK_CUR);
fwrite(&backup_curfcb,sizeof(struct FCB),1,disk);
//还原当前工作目录和当前的FCB
strcpy(curWorkDir,backup_curdir);
memcpy(&curFCB,&backup_curfcb,sizeof(struct FCB));
}
fflush(disk);
return 0;
}
int fatRename(char *srcName,char *dirName)
{
struct FCB tmpFCB;
struct FCB backup_curfcb;
int size,node,num,i;
int flag = 0;
memcpy(&tmpFCB,&curFCB,sizeof(struct FCB));
node = tmpFCB.block_no;
num = tmpFCB.block_num;
size = tmpFCB.file_size;
fseek(disk,node*BLOCK_SIZE,SEEK_SET);
for(i = 0;i < size;i++)
{
if(i!=0 && i%16==0)
{
node = fatTable[node];
fseek(disk,node*BLOCK_SIZE,SEEK_SET);
}
fread(&tmpFCB,sizeof(struct FCB),1,disk);
if(strcmp(tmpFCB.filename,dirName)==0)
{
printf("the name is used\n");
return -1;
}
}
memcpy(&tmpFCB,&curFCB,sizeof(struct FCB));
size = tmpFCB.file_size;
node = tmpFCB.block_no;
fseek(disk,(node)*BLOCK_SIZE,SEEK_SET);
for(i = 0; i < size;i++)
{
if(i!=0 && i%16==0)
{
node = fatTable[node];
fseek(disk,(node)*BLOCK_SIZE,SEEK_SET);
}
fread(&tmpFCB,sizeof(struct FCB),1,disk);
if(strcmp(tmpFCB.filename,srcName)==0)
{
flag = 1;
break;
}
}
if(flag==1)
{
strcpy(tmpFCB.filename,dirName);
fseek(disk,0-sizeof(struct FCB),SEEK_CUR);
fwrite(&tmpFCB,sizeof(struct FCB),1,disk);
}
else
{
prin
没有合适的资源?快使用搜索试试~ 我知道了~
windows fat16文件系统模拟
共5个文件
cpp:2个
h:2个
disk:1个
5星 · 超过95%的资源 需积分: 9 37 下载量 166 浏览量
2011-07-14
09:00:00
上传
评论 1
收藏 48KB ZIP 举报
温馨提示
实现操作系统课程所要求的文件系统模拟运行的功能,可进行文件夹的删除和创建,可进行文件的删除和创建,可进行文件的打开与关闭操作,可进行文件读写操作
资源推荐
资源详情
资源评论
收起资源包目录
FileSystem.zip (5个子文件)
fat16.cpp 29KB
fat16.disk 32MB
menu.cpp 4KB
iosystem.h 219B
fat16.h 3KB
共 5 条
- 1
资源评论
- u0108759742013-05-29注释的很详细。对我很有帮助!
- mazhen12013-06-15谢谢分享,挺好的,课程作业正好用到
- k1037012013-01-09注释很详细,挺好的
- 小白5772015-06-02写的挺好的,注释也挺详细。参考这个完成了我的课程设计
shangxuan2011
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功