⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dosfolder.cpp

📁 包含操作系统原理书籍中所提到的很多方法的实现函数
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -