#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream.h>
#include<ctype.h>
#include <conio.h>
#define SECTOR_SIZE 512 //扇区大小
#define DIR_ITEM_NUMBER 2048 // 共有64*512/16=2048个目录项
#define DIR_ITEM_SIZE 16 //每个目录项16个字节
#define FAT_SECTOR 32 //FAT表占32个扇区, 4096*4/512=32
#define FAT_ITEM_SIZE 4096
void fileCreate(char *fileName,int fileLength);
int requestDisk(int startPosition,int Length,char *fileName);
void fileDel(char *fileName);
void fileRename(char *fileName,char *newName);
void showFile(char *fileName);
void fileDir();
//模拟磁盘空间
char disk[2097152]; //共有512*4096个字节
/*目录结构*/
struct DirItem{
char filename[15]; //文件名14个字节,最后一位为'\0'
int FirstSector; //起始扇区号。
};
/*文件分配表*/
struct FAT{
int SectorNo; //扇区号,0 - 4096
int pointer; //指针为0'空闲扇区,指针为-1'文件的最后扇区,指针为正值'文件的下一扇区号。
};
struct DirItem dir_item[DIR_ITEM_NUMBER]; //指向目录
struct FAT fat_item[FAT_ITEM_SIZE]; //指向FAT
char filename[15];
void init(){
int i=0;
//初始化文件分配表FAT
for(i=0;i<97;i++){
fat_item[i].pointer=-1; //存储目录项和文件分配表,不用于存储数据
fat_item[i].SectorNo=i;
}
for(i=97;i<FAT_ITEM_SIZE;i++){
fat_item[i].pointer=0;
fat_item[i].SectorNo=i;
}
//初始化目录表DIR
for(i=0;i<DIR_ITEM_NUMBER;i++){
dir_item[i].FirstSector=0; //表示未使用
}
}
int main(){
struct orderTable //命令表
{
char name[8];
};
init();
char orderInput[30]; //存储用户输入的命令字符串
char orderName[8]; //命令名字
char fileName[20]; //命令参数1,是文件名字
char parameter2[6]; //命令参数2,是个数字
struct orderTable comd_name[5]; //命令表
int i=0;
int flag=0; //用户输入串 读写位置 标志
int flagOrder=-1;
//初始化命令表
strcpy(comd_name[0].name,"create");
strcpy(comd_name[1].name,"delete");
strcpy(comd_name[2].name,"rename");
strcpy(comd_name[3].name,"dir");
strcpy(comd_name[4].name,"show");
while(1)
{
printf("\n");
printf("|******************************************************|\n");
printf("|* create-创建 delete-删除 rename-重命名 *|\n");
printf("|* dir-显示磁盘中所有文件 show-显示文件所在扇区号 *|\n");
printf("|* 输入'命令 ?'获得帮助,例如'create ?',exit-退出程序 *|\n");
printf("|******************************************************|\n");
printf("请输入命令:>");
fflush(stdin); //清空缓冲区
gets(orderInput); //获取用户输入串
if(!strcmp(orderInput,"exit"))exit(0); //当用户输入 exit 退出程序
for(i=0;orderInput[i]!=' '&&orderInput[i]!='\0';i++)//以空格为界 分解用户输入串
{
orderName[i]=orderInput[i];
}
flag=i;//保存读写指针
orderName[i]='\0';
flagOrder=-1; //初始化标志位,flagOrder 指明命令在命令表中的位置
for(i=0;i<5;i++)
{
if(!strcmp(orderName,comd_name[i].name))
{
flagOrder=i; //记录命令的位置,以便访问
break;
}
}
if(flagOrder==-1)
{
printf("你输入的命令有误!请重新输入!\n");
continue ;
}
//以空格为界,分解字符串,分解出第一个字符串放到fileName中
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
fileName[i-flag-1]=orderInput[i];
}
fileName[i-flag-1]='\0'; //为字符串数组 置一个结束标志
////////////////////////////////////////////////////////
flag=i; //下一个字符串 读写指针
if(!strcmp(fileName,"?")) //显示命令帮助
{
switch(flagOrder){
case 0:
printf("创建一个文件 格式 create [filename][filelength]\n");
printf("例如: create joy 1000 ,将创建名为joy,长度为1000字节的文件\n");
break;
case 1:
printf("删除一个文件 格式 delete [filename] \n");
printf("例如: delete joy,将删除名为joy的文件\n");
break;
case 2:
printf("重命名一个文件,格式 rename [oldFileName][newFileName]\n");
printf("例如rename joy1,joy2 ,将joy1改名为joy2\n");
break;
case 3:
printf("显示所有文件,例如 dir,将显示所有文件\n");
break;
case 4:
printf("显示文件所存储的扇区号,例如 show joy,将显示joy文件所在扇区号\n");
break;
default:
printf("命令错误");
}
getch();
}
else{
switch(flagOrder)//对相应的命令 进行参数处理
{
case 0:
{
int Temp[4]={1,10,100,1000};
int sum=0;
int len=0;
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter2[i-flag-1]=orderInput[i];
}
parameter2[i-flag-1]='\0'; //为字符串数组 置一个结束标志
flag=i;
len=strlen(parameter2); //求字符串数组的长度
for(i=0;i<len;i++) //把第二个参数 字符串变成整数
sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
fileCreate(fileName,sum); //将命令和参数 传给建文件模块执行
}
break;
case 1:
fileDel(fileName); //删除文件
break;
case 2:
{
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter2[i-flag-1]=orderInput[i];
}
parameter2[i-flag-1]='\0';
flag=i;
fileRename(fileName,parameter2);
}
break;
case 3:
fileDir();
break;
case 4:
showFile(fileName);
break;
default:
printf("错误!没有可执行的命令");
}
}
}
return 0;
}
void fileCreate(char *fileName,int fileLength)
{
int i=0;
int startPosition=97; //文件分配开始位置,等磁盘分配函数 返回值
for(i=0;i<DIR_ITEM_NUMBER;i++)
{
if(!strcmp(fileName,dir_item[i].filename)) //判断是否重名,如果重名直接返回
{
printf("文件重名,请取别的名字!\n");
return ; //文件重名,退出创建函数
}
}
int result=requestDisk(startPosition,fileLength,fileName);
if(!result)
{
printf("申请磁盘空间失败!无法建立文件!\n");
return ;//申请磁盘空间失败,退出创建函数
}
if(result)
{
printf("成功创建文件!\n\n");
printf("===========================================\n");
printf("文件名 长度 开始位置\n");//显示刚建立的文件
printf("%s ",fileName);
printf("%d ",fileLength);
printf("%d ",dir_item[result-1].FirstSector);
printf("\n===========================================\n");
}
}
void fileDel(char *fileName){
int flag=-1,i=0,FirstSector=0,temp=0;
for(i=0;i<DIR_ITEM_NUMBER;i++)
{
if(!strcmp(fileName,dir_item[i].filename)){ //判断有无该文件
flag=i;
FirstSector=dir_item[i].FirstSector;
dir_item[i].FirstSector=0;
break;
}
}
if(flag==-1)
{
printf("该文件不存在!\n");
return;
}
else{
while(fat_item[FirstSector].pointer!=-1){
temp=FirstSector;
FirstSector=fat_item[FirstSector].pointer;
fat_item[temp].pointer=0;
memset(dir_item[flag].filename,0,sizeof(dir_item[flag].filename));
}
fat_item[FirstSector].pointer=0;
printf("此文件已成功删除!\n");
}
}
void fileRename(char *fileName,char *newName)
{
int i=0;
int flag=0;
for(i=0;i<DIR_ITEM_NUMBER;i++) //在文件表里找到,并重命名
if(!strcmp(fileName,dir_item[i].filename))
{
strcpy(dir_item[i].filename,newName);
flag=1;
break;
}
if(flag==1)
printf("重命名成功!\n");
else
printf("重命名失败!无此文件\n");
}
void fileDir()
{
int i=0;
if(dir_item[0].FirstSector==0) // 说明没有文件
{
printf("磁盘无文件!\n");
return ;
}
while(dir_item[i].FirstSector!=0){//打印所有文件名
printf("%s\n",dir_item[i].filename);
i++;
}
}
void showFile(char *fileName){
int flag=-1,i=0,FirstSector=0,temp=0;
for(i=0;i<DIR_ITEM_NUMBER;i++)
{
if(!strcmp(fileName,dir_item[i].filename)){ //判断有无该文件
flag=i;
FirstSector=dir_item[i].FirstSector;
break;
}
}
if(flag==-1)
{
printf("该文件不存在!\n");
return;
}
else{
printf("此文件存储扇区号为: \n");
while(fat_item[FirstSector].pointer!=-1){
temp=FirstSector;
FirstSector=fat_item[FirstSector].pointer;
printf("%d\n",fat_item[temp].SectorNo);
}
printf("%d\n",fat_item
操作系统实验 编程实现简单文件系统
5星 · 超过95%的资源 需积分: 46 115 浏览量
2011-05-02
20:14:23
上传
评论 5
收藏 215KB RAR 举报
yuyou_yuyou
- 粉丝: 0
- 资源: 2
最新资源
- python-leetcode面试题解之第157题用Read4读取N个字符-题解.zip
- python-leetcode面试题解之第156题上下翻转二叉树-题解.zip
- python-leetcode面试题解之第155题最小栈-题解.zip
- python-leetcode面试题解之第153题寻找旋转排序数组中的最小值-题解.zip
- python-leetcode面试题解之第152题乘积最大子数组-题解.zip
- python-leetcode面试题解之第151题反转字符串中的单词-题解.zip
- python-leetcode面试题解之第150题逆波兰表达式求值-题解.zip
- python-leetcode面试题解之第149题直线上最多的点数-题解.zip
- python-leetcode面试题解之第148题排序链表-题解.zip
- python-leetcode面试题解之第147题对链表进行插入排序-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页