📄 dosfolder.cpp
字号:
// dos.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
//模拟MSDOS系统磁盘文件的存储结构
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <math.h>
FILE *f;
int DiskSpace[100]= {0};//定义磁盘空间,共100块
int FileNum = 0; //系统拥有的文件数
struct FILEDIRECTORY
{
char FileName[20]; //文件,名长度为20个字符
int FileBlockNum; //文件占用的磁盘块数
int BeginBlock; //文件在磁盘上的开始块号
};
struct FILEDIRECTORY FileDirectory[20]; //文件目录中的最多文件个数
void Empty(char *TempString) //模板:置文件名为空
{
int i;
for(i= 0; i<19; i++)
TempString[i] = NULL;
}
void InitProgram(void) //程序初始化
{
int i;
for(i = 0; i <= 99; i++) //初始化磁盘空间
DiskSpace[i] = -2; //-2代表此块为空
for(i = 0; i < 20; i++) //初始化目录表
{
Empty( FileDirectory[i].FileName ); //文件名置空
FileDirectory[i].BeginBlock = -1; //
FileDirectory[i].FileBlockNum = -1;
}
}
void DisplayDirectory(void)//在屏幕上显示磁盘上的文件
{
int i = 0;
if( FileNum == 0)
{
printf("There are not any files\n");
fprintf(f,"There are not any files\n");
}
else
{
printf("The following files you can operate:\n");
fprintf(f,"The following are the files you can operate:\n");
do
{
printf("%s ", FileDirectory[i++].FileName);\
int j=i-1;
fprintf(f,"%s", FileDirectory[j].FileName);
if ( i%5 == 0 )
{
printf("\n");
fprintf(f,"\n");
}
}while(i < FileNum);
printf ("\n\n");
fprintf (f,"\n\n");
}
}
int Menu(void)
{ //下面是菜单显示,请选择:
int i;
//clrscr();
printf("The following is the instructions you can operatae.\n\n");
printf(" 1: dir\n");
printf(" 2: delete filename a record_index(>O)\n");
printf(" 3: delete a file\n");
printf(" 4: delete total files\n");
printf(" 5: insert filename a record_index(>O)\n");
printf(" 6: create a filename record_num(>O)\n");
printf(" 7: display the drawing of the diskplace\n");
printf(" 8: exit\n\n");
fprintf(f,"The following is the instructions you can operatae.\n\n");
fprintf(f," 1: dir\n");
fprintf(f," 2: delete filename a record_index(>O)\n");
fprintf(f," 3: delete a file\n");
fprintf(f," 4: delete total files\n");
fprintf(f," 5: insert filename a record_index(>O)\n");
fprintf(f," 6: create a filename record_num(>O)\n");
fprintf(f," 7: display the drawing of the diskplace\n");
fprintf(f," 8: exit\n\n");
DisplayDirectory();
printf("Please select(1-8):");
fprintf(f,"Please select(1-8):");
scanf("%d", &i);
fprintf(f,"%d\n", i);
return i;
}
void Dir(void) //dir:显示所有文件
{
int i;
printf("\nDirectory:\n");
fprintf(f,"\nDirectory:\n");
for(i = 0; i<FileNum; i++)
{
printf("FileName:%s ", FileDirectory[i].FileName);
printf("BeginBlock:%d ", FileDirectory[i].BeginBlock);
printf("BlockNum:%d\n", FileDirectory[i].FileBlockNum);
fprintf(f,"FileName:%s ", FileDirectory[i].FileName);
fprintf(f,"BeginBlock:%d ", FileDirectory[i].BeginBlock);
fprintf(f,"BlockNum:%d\n", FileDirectory[i].FileBlockNum);
}
printf("\nPress any key to continue...");
fprintf(f,"\nPress any key to continue...");
getch();
}
int FindFile(char *TempFileName) //在目录表中查找文件
{
int i;
for(i = 0; i < FileNum; i++)
if(!strcmp(TempFileName, FileDirectory[i].FileName))
return i;
printf("The file %s doesn't exits\n", TempFileName);
fprintf(f,"The file %s doesn't exits\n", TempFileName);
getch();
return -1; //没有该文件,返回-1
}
void DelFileInDirectory (int index)//删除文件
{
//TODO add protect for index
//assert( (index >= 0) && (index <= 20) )
int i;
for(i = index; i < FileNum-1; i++) //如果文件不在目录尾,移动后面的文件
{
strcpy( FileDirectory[i].FileName, FileDirectory[i+1].FileName);
FileDirectory[i].BeginBlock = FileDirectory[i+1].BeginBlock;
FileDirectory[i].FileBlockNum = FileDirectory[i+1].FileBlockNum;
}
if(i == FileNum-1) //将末尾文件置空
{
Empty(FileDirectory[i].FileName);
FileDirectory[i].BeginBlock=-1;
FileDirectory[i].FileBlockNum=-1;
}
FileNum--; //文件数减1
}
void DeleteRecord(int index1, int index)//在当前文件index中删除指定第index1个记录
{
int Num; // the number of the file block
int tmpIndex1, tmpIndex2,tmpIndex3;
int i;
if( (index < 0)|| (index >FileNum) )
{
printf("file index error!");
fprintf(f,"file index error!");
exit(-1);
}
if( (index1 < 0) || ( index1 >= ( Num = FileDirectory[index].FileBlockNum)) )
{ //判断用户输入的索引号是否合法
printf("The File has only %d Blocks,", Num);
printf("you had input illeagelly.\n");
fprintf(f,"The File has only %d Blocks,", Num);
fprintf(f,"you had input illeagelly.\n");
return;
}
if(index1 == 0) // delete the first record of the file
{
tmpIndex1 = FileDirectory[index].BeginBlock;
tmpIndex2 = DiskSpace[tmpIndex1];
DiskSpace[tmpIndex1] = -2;
if( (tmpIndex2 == -2) && Num == 1) // the file only have one block
{
DelFileInDirectory(index);
}
else
{
FileDirectory[index].BeginBlock = tmpIndex2;
FileDirectory[index].FileBlockNum--;
}
}
else if( index1 == (Num-1) ) // delete the last record of the file
{
tmpIndex1 = FileDirectory[index].BeginBlock;
for( i = 0; i < index1; i++) //跳到欲删除的记录的前一条
{
tmpIndex2 = tmpIndex1; //tmpIndex2 save the block index
tmpIndex1 = DiskSpace[tmpIndex2]; //tmpIndex1 save the content of the index
}
DiskSpace[tmpIndex2] = -1;
DiskSpace[tmpIndex1] = -2;
FileDirectory[index].FileBlockNum--;
}
else
// if the index1 is in the middle of the file
// find the index1 that want to delete
{
tmpIndex1 = FileDirectory[index].BeginBlock;
for( i = 0; i < index1; i++) //跳到欲删除的记录的前一条
{
tmpIndex2 = tmpIndex1; //tmpIndex2 save the block index
tmpIndex1 = DiskSpace[tmpIndex2]; //tmpIndex1 save the content of the index
}
tmpIndex3 = DiskSpace[tmpIndex1]; // get the next index after the record that want to delete
DiskSpace[tmpIndex1] = -2;
DiskSpace[tmpIndex2] = tmpIndex3;
FileDirectory[index].FileBlockNum--;
}
}
void DeleteAll (char *TempFileName)//删除目录表中的某个文件
{
int i,index, Tempindex1, TempIndex2;
if((index = FindFile(TempFileName))!=-1)
{
Tempindex1=FileDirectory[index].BeginBlock;
for(i = 0; i < FileDirectory[index].FileBlockNum; i++)
{
TempIndex2=DiskSpace[Tempindex1];
DiskSpace[Tempindex1]=-2;
Tempindex1=TempIndex2;
}
DiskSpace[Tempindex1]=-2;
DelFileInDirectory(index);
printf("The files have been deleted totatly.");
printf("\nPress any key to continue...");
fprintf(f,"The files have been deleted totatly.");
fprintf(f,"\nPress any key to continue...");
getch();
}
}
int FindEmpty(void) //查找磁盘空间的第一个空块
{
int i;
for(i = 0; i <= 99; i++)
if(DiskSpace[i] == -2)
return i;
printf(" There have been no enough space.\n");
fprintf(f," There have been no enough space.\n");
return 100;
}
void InsertRecord(int index1, int index) //要插入的记录号为0~FileBlockNum
//0在第一个节点前插入,FILeBlockNum在最后一个节点插入
//the correct procedure is find one empty space then change the index
//insert means insert after the current index1
{
int index2, tmpIndex1, tmpIndex2,i,Num;
if( index1 < 0 || index1>(Num = FileDirectory[index].FileBlockNum))
{
printf("The File has only %d Blocks,", Num);
printf("you had input illeagelly.\n");
fprintf(f,"The File has only %d Blocks,", Num);
fprintf(f,"you had input illeagelly.\n");
return;
}
if( index1 == 0 ) // insert before the first record
{
if((index2 = FindEmpty()) != 100)
{
tmpIndex1 = FileDirectory[index].BeginBlock;
FileDirectory[index].BeginBlock = index2;
DiskSpace[index2] = tmpIndex1;
FileDirectory[index].FileBlockNum++;
}
else
{
printf("Out of memory!");
fprintf(f,"Out of memory!");
exit(0);
}
}
else if( index1 == Num-1 ) // insert after the last record
{
//TODO find the last index
tmpIndex1 = FileDirectory[index].BeginBlock;
for( i = 0; i <= index1; i++) //跳到最后一条记录
{
tmpIndex2 = tmpIndex1; //tmpIndex2 save the block index
tmpIndex1 = DiskSpace[tmpIndex2]; //tmpIndex1 save the content of the index
}
if((index2 = FindEmpty()) != 100)
{
DiskSpace[index2] = -1;
DiskSpace[tmpIndex2] = index2;
FileDirectory[index].FileBlockNum++;
}
else
{
printf("Out of memory!");
fprintf(f,"Out of memory!");
exit(0);
}
}
else // insert after one index
{
tmpIndex1 = FileDirectory[index].BeginBlock;
for( i = 0; i <= index1; i++) //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -