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

📄 wjxt.txt

📁 做的操作系统课程设计,是做的一个文件系统. 可能调试的时候有点问题.但是思路是没问题的.
💻 TXT
字号:
#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <ctype.h>
//#include <malloc.h>
#include <stdlib.h>


#define FILENAME_LEN 21
#define INPUT_LEN 81
#define COMMAND_LEN 11

struct FileNode 
{
	char filename[FILENAME_LEN];
	int isdir;
	int i_nlink;
	int adr;
	struct FileNode *parent, *child;
	struct FileNode *sibling_prev, *sibling_next;
};


void Init();

int cdComd();
int editComd();
int delComd();
int rdComd();
int dirComd();
int mdComd();

int FindPath(char *ph);
int FindFilename(char Para2[]);


struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink);//??????
int GetInput(char* buffer,unsigned int buffer_len);//????
int CheckCommand();//ü???
int GetDir(int begin,char* path,char* curDir);//??????
void Trim(char* str);

struct FileNode *cp, *tp, *root,*upper;
char path[INPUT_LEN-COMMAND_LEN];//??????????
char curpath[INPUT_LEN-COMMAND_LEN],Para1[COMMAND_LEN],
Para2[INPUT_LEN-COMMAND_LEN],tmppath[INPUT_LEN-COMMAND_LEN];
char filename[FILENAME_LEN],dirname[FILENAME_LEN],tmp;
unsigned int i,j;//int i,j;

//????
int main()
{
	Init();//??????hile(1)
	{
		if(ParseCommand())//????
			ExecuteCommand();//?Аü?
	}
}

//?Аü?????
void ExecuteCommand()
{
	int sign;
	//???Para1????????????鍊	if(strcmp(Para1,"cd")==0) 
		sign=cdComd();            //cdü?
	else if(strcmp(Para1,"edit")==0) 
		sign=editComd();         //editü?
	else if(strcmp(Para1,"del")==0) 
		sign=delComd();          //delü?
	else if(strcmp(Para1,"dir")==0) 
		sign=dirComd();          //dirü?
	else if(strcmp(Para1,"md")==0) 
		sign=mdComd();         //mdü?
	else if(strcmp(Para1,"rd")==0) 
		sign=rdComd();           //rdü?
	else if(strcmp(Para1,"exit")==0)
		exit(0);                         //exitü?
	else
		printf("ü???,???\n");  //ü?????????????}

//??????
struct FileNode* CreateFileNode(char filename[],int isdir,int i_nlink)
{
	//???????    struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode));
	//??ě?????
    strcpy(node->filename,filename);
	node->isdir=isdir;
	node->i_nlink=i_nlink;
	node->parent=NULL;
	node->child=NULL;
	node->sibling_prev=NULL;
	node->sibling_next=NULL;
    return node;
}

//??????id Init()
{
	struct FileNode *binNode,*usrNode,
		*unixNode,*etcNode,*libNode,*userNode,
		*binNode2,*liuNode,*sunNode,*ftiNode;
	strcpy(path,"/"); //??д????·??
	//?????????	binNode=CreateFileNode("bin",1,0);
	usrNode=CreateFileNode("usr",1,0);
	unixNode=CreateFileNode("unix",0,0);
	etcNode=CreateFileNode("etc",1,0);
	libNode=CreateFileNode("lib",1,0);
	userNode=CreateFileNode("user",1,0);
	binNode2=CreateFileNode("bin",1,0);
	liuNode=CreateFileNode("liu",1,0);
	sunNode=CreateFileNode("sun",1,0);
	ftiNode=CreateFileNode("fti",1,0);
	cp=tp=root=CreateFileNode("/",1,0);
	//????ě????
	root->parent=NULL;
	root->child=binNode;
	root->sibling_prev=root->sibling_next=NULL;
	
	binNode->parent=root;
	binNode->child=NULL;
	binNode->sibling_prev=NULL;
	binNode->sibling_next=usrNode;
	
	usrNode->parent=NULL;
	usrNode->child=libNode;
	usrNode->sibling_prev=binNode;
	usrNode->sibling_next=unixNode;
	
	unixNode->parent=NULL;
	unixNode->child=NULL;
	unixNode->sibling_prev=usrNode;
	unixNode->sibling_next=etcNode;
	
	etcNode->parent=NULL;
	etcNode->child=NULL;
	etcNode->sibling_prev=unixNode;
	etcNode->sibling_next=NULL;
	
	libNode->parent=usrNode;
	libNode->child=liuNode;
	libNode->sibling_prev=NULL;
	libNode->sibling_next=userNode;
	
	userNode->parent=NULL;
	userNode->child=NULL;
	userNode->sibling_prev=libNode;
	userNode->sibling_next=binNode2;
	
	binNode2->parent=NULL;
	binNode2->child=NULL;
	binNode2->sibling_prev=userNode;
	binNode2->sibling_next=NULL;
	
	liuNode->parent=libNode;
	liuNode->child=NULL;
	liuNode->sibling_prev=NULL;
	liuNode->sibling_next=sunNode;
	
	sunNode->parent=NULL;
	sunNode->child=NULL;
	sunNode->sibling_prev=liuNode;
	sunNode->sibling_next=ftiNode;
	
	ftiNode->parent=NULL;
	ftiNode->child=NULL;
	ftiNode->sibling_prev=sunNode;
	ftiNode->sibling_next=NULL;
	
}

//???????????????????ǘ??
int FindFilename(char Para2[])
{
	i=strlen(Para2)-1;
	j=0;
	
	while(Para2[i]!='/'&& i>=0)
	{	
		filename[j]=Para2[i];
		i--; j++;
	}
	filename[j]='\0';//???搲????????戫filename?
	if(i<0) Para2[i+1]='\0';
	else Para2[i]='\0';
	j--;
	//filename???????????
	for(i=0;i<strlen(filename)/2;i++,j--)
	{
		tmp=filename[i];
		filename[i]=filename[j];
		filename[j]=tmp;
	}
	
	//?镒·??
	if(strlen(Para2)>0)
	{
		int sign=FindPath(Para2);
		if(sign==0) return 0;
	}
	return 1;
}

//???凸?????????
//???????r_len???????buffer_len-1????????
//buffer_len?????0'??int GetInput(char* buffer,unsigned int buffer_len)
{
	unsigned int count=0;//int count=0;
	while(count<buffer_len)
	{
		if((buffer[count]=getchar())==10)
		{
			buffer[count]='\0';
			return count;
		}
		count++;
	}
	while(getchar()!=10);
	buffer[buffer_len-1]='\0';
	return -1;
}	

//????????
int ParseCommand()
{
	char Inputs[INPUT_LEN];
	int i=0,j=0,ch;
	unsigned int k=0;//int k=0;
	
	printf("%s>",path);
	//????
	if(GetInput(Inputs,INPUT_LEN)==-1)
	{
		printf("??А?????\n");
		return 0;
	}
	
	Para1[0]=Para2[0]='\0';
	
	//????????????
	while(Inputs[i]!=' '&&Inputs[i]!='\0' && i<COMMAND_LEN-1)
	{   
		Para1[i]=Inputs[i];
		i++;
	}//while
	Para1[i]='\0';
	
	//??ü????
	if(i==(COMMAND_LEN-1))return 1;
	
	//?????·?????f(Inputs[i]!='\0')
	{    
		while(Inputs[i]==' ' && i<INPUT_LEN-1) i++;
		j=0;
		while(Inputs[i]!='\0'  && i<INPUT_LEN-1)
		{  
			Para2[j]=Inputs[i];
			i++; j++;
		}
		Para2[j]='\0';
	}
	Trim(Para1);
	Trim(Para2);
	
	//??????????????д??
	for(k=0;k<strlen(Para1);k++)
	{
		ch=tolower((int)Para1[k]);
		Para1[k]=ch;
	}
	return 1;
}

//cd??????????
int cdComd()
{
	if(!CheckCommand())//ü???
		return 0;
	
	if(strcmp(Para2,"..")==0)
	{          //??d ..ü?????
		int i;
		
		while(cp->sibling_prev)
			cp=cp->sibling_prev;//????????????
		if(cp->parent)
		{
			cp=cp->parent;//?????ǘ??
		}
		else
		{
			return 0;
		}
		//????·????????
		i=strlen(path);
		while(path[i]!='/'&& i>0) i--;
		
		if(i!=0)
			path[i]='\0';
		else
			path[i+1]='\0';
		
	}
	else
	{
		FindPath(Para2);//?镒·??
	}
	return 1;
}

//ü??????????
void Trim(char* str)
{
	int begin,end;
	char* tmp;
	begin=0;
	end=strlen(str);
	
	//??????????????
	while(str[begin]==' ' && str[begin]!='\0')begin++;
	//????β??????while(str[--end]==' ');
	str[end+1]='\0';
	
	//????if(begin<end)
	{
		tmp=(char*)malloc((sizeof(char))*(end-begin+2));
		strcpy(tmp,&str[begin]);
		strcpy(str,tmp);
		free(tmp);
	}
	
}

//????????????
int GetDir(int begin,char* path,char* curDir)
{
	int i=0;
	int len=strlen(path);
	while(!((path[begin]=='\\' )|| (path[begin]=='/'))&&begin<len)
	{
		curDir[i++]=path[begin++];
	}
	curDir[i]='\0';
	Trim(curDir);
	return begin+1;
}

//?镒·??????
int FindPath(char *ph) 
{
	struct FileNode *temp;//struct FileNode *tp,*temp;
	char oldpath[INPUT_LEN-COMMAND_LEN];
	unsigned int i=0;//int i=0;
	int sign=1;
	if(strcmp(ph,"/")==0)
	{          //ph???
		cp=root;
		strcpy(path,"/");
		return 1;
	}
	
	temp=cp;
	strcpy(oldpath,path);//???攭·??????
	if(ph[0]=='/')
	{          //???????????
		cp=root->child;
		i++;//???		strcpy(path,"/");
	}
	else 
	{
		if(cp!=NULL && cp!=root )
			strcat(path,"/");
		
		if(cp && cp->child)
		{
			if(cp->isdir)
				cp=cp->child; //??????????????
			else
			{
				printf("·????!\n");
				return 0;
			}
		}
	}
	while(i<=strlen(ph)&& cp)//??????·???????????
	{
		int j=0;
		if(ph[i]=='/'&& cp->child)
		{
			i++;//???
			if(cp->isdir)
				cp=cp->child;//????????
			else
			{
				printf("·????!\n");
				return 0;
			}
			strcat(path,"/");
		}
		
		
		//curpath ??????????????
		while(ph[i]!='/'&& i<=strlen(ph)) 
		{
			curpath[j]=ph[i];
			i++;  j++;
		}
		
		curpath[j]='\0';
		
		while((strcmp(cp->filename,curpath)!=0 || (cp->isdir!=1))&& cp->sibling_next!=NULL)
		{
			cp=cp->sibling_next;
		}
		
		if(strcmp(cp->filename,curpath)==0 )
		{
			if(cp->isdir==0)
			{
				strcpy(path,oldpath);
				cp=temp;
				printf("?????.\n");
				return 0; 
			}
			
			strcat(path,cp->filename);
		}
		
		if(strcmp(cp->filename,curpath)!=0 || cp==NULL) 
		{
			strcpy(path,oldpath);
			cp=temp;
			printf("??·????\n");
			return 0; 
		}
	}
	return 1;
}

//???????
int editComd()
{ 
	//char tmp;
	struct FileNode * temp=CreateFileNode("",0,0);
	int sign;
	struct FileNode *tp;
	
	//·????????
	if(strlen(Para2)==0)
	{
		printf("\nü????д?.\n");
		return 0;
	}
	//?????
	if(strlen(Para2)>50)
	{
		printf("\n???\n");
		return 0;
	}
	//????
	if (!(isalpha(Para2[0])||Para2[0]=='_'||Para2[0]=='\0'||Para2[0]=='/'))
	{
		printf("??????n");/* ???????'??'????'???????????'*/
		return 0;
	}
	
	//?????ign=FindFilename(Para2);
	if(sign==0)
		return 0;
	
	if(cp->isdir!=1)//??????????ǎ????	{
		printf("you cannot edit a file in under a file!\n");
		return 0;
	}
	
	//??????????别????????
	tp=CreateFileNode("",1,0);
	strcpy(tp->filename,filename);
	tp->isdir=0;
	tp->i_nlink=0;
	if(cp->child==NULL)
	{	tp->parent=cp;
	tp->child=NULL;
	cp->child=tp;
	tp->sibling_prev=NULL;
	tp->sibling_next=NULL;
	}
	else
	{	temp=cp;
	   //?temp???????别??
	temp=temp->child;
	while(temp->sibling_next )//find the last sibing node
	{
		temp=temp->sibling_next;
		if(strcmp(temp->filename,filename)==0&&temp->isdir==0)
		{
			printf("?????\n");//??????			return 0;
		}
	}//??????????	
	
	temp->sibling_next=tp;
	tp->parent=NULL;
	tp->child=NULL;
	tp->sibling_prev=temp;
	tp->sibling_next=NULL;
	
	}
	
	return 1;
}

//??????????
int mdComd()
{
	//	char tmp;
	int sign;
	struct FileNode * temp, *tp;
	temp=CreateFileNode("",1,0);
	//??????
	if(strlen(Para2)==0)
	{
		printf("\nü????д?.\n");
		return 0;
	}
	//?????
	if(strlen(Para2)>50)
	{
		printf("\n?????);
		return 0;
	}
	//????
	if (!(isalpha(Para2[0])||Para2[0]=='_'||Para2[0]=='\0'||Para2[0]=='/'))
    {
		printf("??????д?n");/* ?????????'??'????'???????????'*/
		return 0;
    }
	//?????? 
	sign=FindFilename(Para2);
	if(sign==0) return 0;
	
	//??????????ǎ????	if(cp->isdir!=1)
	{
		printf("you cannot make a directory in under a file!\n");
		return 0;
	}
	
	//?????????????别????????
	tp=CreateFileNode(filename,1,0);
	if(cp->child==NULL)
	{	tp->parent=cp;
	tp->child=NULL;
	cp->child=tp;
	tp->sibling_prev=NULL;
	tp->sibling_next=NULL;
	}
	else
	{	temp=cp;
	   //?temp???????别??
	temp=temp->child;
	while(temp->sibling_next )//find the last sibing node
	{
		temp=temp->sibling_next;
		if(strcmp(temp->filename,filename)==0&&temp->isdir==1)
		{
			printf("?????\n");//??????			return 0;
		}
	}//??????????	
	
	temp->sibling_next=tp;
	tp->parent=NULL;
	tp->child=NULL;
	tp->sibling_prev=temp;
	tp->sibling_next=NULL;
	
	}
	
	return 1;
}

//??????
int delComd()
{ 
	//	char tmp;
	int sign;
	struct FileNode *temp;
	//??????
	if(strlen(Para2)==0)
	{
		printf("\nü????д?.\n");
		return 0;
	}
	//?????ign=FindFilename(Para2);
	if(sign==0) return 0;
	
	//?temp???????	if(cp->child) 
	{
		temp=cp->child;
		while(temp->sibling_next && (strcmp(temp->filename,filename)!=0 || temp->isdir!=0))
			temp=temp->sibling_next;
		if(strcmp(temp->filename,filename)!=0)
		{
			printf("???攚????
			return 0;
		}
	}
	else
	{
		printf("???攚????
		return 0;
	}
	//????????
	if(temp->isdir!=0)
	{
		printf("ERROR!??????????????\n");
		return 0;
	}
	//????????????????(temp->i_nlink!=0)
	{
		printf("?????????????????;
		return 0;
	}
	//???
    if(temp->parent==NULL)//?????????
	{
		temp->sibling_prev->sibling_next=temp->sibling_next;
		if(temp->sibling_next)//????????????
			temp->sibling_next->sibling_prev=temp->sibling_prev;
		temp->sibling_prev=temp->sibling_next=NULL;
	}//if
	else//??????
	{ 
		if(temp->sibling_next)//????????????
			temp->sibling_next->parent=temp->parent;
		temp->parent->child=	temp->sibling_next;
	}//else
	
	free(temp);
	
	return 1;
}
//ü???????
int CheckCommand()
{
	if(strlen(Para2)==0)
	{
		printf("ü??????????\n");
		return 0;
	}
	return 1;
}

//??????
int rdComd()
{ 
	//	char tmp;
	struct FileNode *temp;
	char cmd[2];
	
	//ü???
	if(!CheckCommand())
		return 0;
	//??????
	if(!FindFilename(Para2))
		return 0;
	
	//?temp???????	if(cp->child) 
	{
		temp=cp->child;
		while(temp->sibling_next && (strcmp(temp->filename,filename)!=0|| temp->isdir!=1))
			temp=temp->sibling_next;
		if(strcmp(temp->filename,filename)!=0)
		{
			printf("???攚????!\n");
			return 0;
		}
	}
	else
	{
		printf("???攚????!\n");
		return 0;
	}
	
	//?????ǎ??temp->isdir!=1)
	{
		printf("ERROR!??????????????\n");
		return 0;
	}
	//???????????????????????(temp->child)
	{
		printf("\n?????????????????/N \n");
		
		GetInput(cmd,2);
		if(strcmp(cmd,"n")==0||strcmp(cmd,"N")==0)
			return 0;
	}
	//???
	if(temp->parent==NULL)//?????????
	{
		temp->sibling_prev->sibling_next=temp->sibling_next;
		if(temp->sibling_next)//????????????
			temp->sibling_next->sibling_prev=temp->sibling_prev;
		temp->sibling_prev=temp->sibling_next=NULL;
		
		
	}//if
	else//??????
	{ 
		if(temp->sibling_next)//????????????
			temp->sibling_next->parent=temp->parent;
		temp->parent->child=	temp->sibling_next;
	}//else
	
	free(temp);
	return 1;
}

//????????
int dirComd()
{
	if(strlen(Para2)>0)
	{
		int sign=FindPath(Para2);//?镒·??
		if(sign==0)
		{
			return 0;
		}
		else
		{
			printf("\n%s>", path);
		}
	}
	
	if(cp!=root)
		printf("   <DIR>             %s\n","..");
	if(cp->child==NULL) 
	{
		return 0;//????????
	}
	
	tp=cp;
	//????????????????????????p=tp->child;
	while(tp)
	{
		if(tp->isdir)
			printf("   <DIR>             %s\n",tp->filename);
		else
			printf("   <FILE>            %s\n",tp->filename);
		tp=tp->sibling_next;
	}
	return 0;//????
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -