directorybuffer.c

来自「参照MINIX3写的操作系统 用GCC+NASM+BOCHS开发」· C语言 代码 · 共 178 行

C
178
字号
#include "../kernel.h"
#include "FileSystem.h"

#define NR_DIRECTORY_BUFFER 10
#define NR_DIRECTORY_INODE 200
#define NO_INODE_MENBER -1
#define NO_DIRECTY -1

extern LPBuffer GetPhysicalBlock(int Block ,int Device);
extern void FreeBufferBlock(LPBuffer pFileBuffer);
extern void Sysnc();

extern LPInodeBuffer GetInode(unsigned long InodeNumber);
extern t_32 WriteFile(LPSuper Super,LPInode pInode,t_32 Count,t_8 Mode,t_32 Dest);
extern t_32 ReadFile(LPInode pInode,t_32 StartPosition,t_32 Count,t_8 Mode,t_32 Dest);
extern void FreeInodeBuffer(LPInodeBuffer pInodeBuffer);
DirectoryBuffer FileDir[NR_DIRECTORY_BUFFER];//文件目录缓冲区
static t_32   FreeIndex=0;//文件目录缓冲区链的头指针



   
  int    strcmp   (   const   char   *   src,   const   char   *   dst  )  
  {  
               int   ret   =   0   ;  
               while(   !   (ret = *(unsigned char *)src-*(unsigned char *)dst)&&*dst)  
                            ++src,   ++dst;  
                if   (   ret   <   0   )  
                            ret   =   -1   ;  
                else   if   (   ret   >   0   )  
                               ret   =   1   ;  
   
                return(   ret   );  
  }  
 


PUBLIC void InitDirectoryBuffer ()
//初始化文件目录缓冲区
{
	int i=0;
	
	for(i=0;i<NR_DIRECTORY_BUFFER-1;i++)
	{
		FileDir[i].FatherInodeNumber=0;
		FileDir[i].Dir.InodeNumber=0;
		MemorySet(FileDir[i].Dir.Name,FILE_NAME_SIZE,'\0');
        FileDir[i].Next=&FileDir[i+1];
	}	
	
	FileDir[NR_DIRECTORY_BUFFER-1].FatherInodeNumber=0;
	FileDir[NR_DIRECTORY_BUFFER-1].Dir.InodeNumber=0;
	MemorySet(FileDir[NR_DIRECTORY_BUFFER-1].Dir.Name,FILE_NAME_SIZE,'\0');
    FileDir[NR_DIRECTORY_BUFFER-1].Next=&FileDir[i+1];
	FileDir[NR_DIRECTORY_BUFFER-1].Next=NULL;
		
	printk("InitDirectoryBuffer\n");

}

t_bool IOReadDirectory(t_32 FatherInodeNumber,char *srcName,
								  LPDirectoryBuffer pDirectoryBuffer,t_32 Device)
//从设备中将父目录Inode号为FatherInodeNumber,目录名为Name的目录读入
{


	LPInodeBuffer pInodeBuffer;
	LPInode pInode;	
	char Data[1024];//数据缓存区
	char dstName[29];//保存目录名
	t_32 i=0,j=0;
	t_32 ReadSize;
	//取得父目录
	pInodeBuffer=GetInode(FatherInodeNumber);
	pInode=pInodeBuffer->FileInode;
	for(i=0;i<pInode->FileSize;i+=1024)//循环读入数据,每次一块
	{

		//返回值为零,说明到文件结尾
		//没找到返回
	    if((ReadSize=ReadFile(pInode,i*1024,1024,0,(t_32)&Data))==0)
		{
			pDirectoryBuffer->FatherInodeNumber=0;
			return ERROR;
		}
		for(j=0;j<ReadSize;j+=32)
		{
			//目录名最大为28,剩余的用字符串结束符'\0'填充
            MemoryCopy((void *)dstName,(void *)(Data+j),28);
			dstName[28]='\0';//在最后加上字符串结束符
			if(strcmp(srcName,dstName)==0)//比较
			{   
				pDirectoryBuffer->FatherInodeNumber=FatherInodeNumber;
				MemoryCopy((void *)&pDirectoryBuffer->Dir,(void *)(Data+j),32);
				return OK;
			}
				
		}
	

	}
	pDirectoryBuffer->FatherInodeNumber=0;	
	return ERROR;
}
t_32 GetDirectory(t_32 FatherInodeNumber,char *Name)
//返回父目录Inode号为FatherInodeNumber,目录名为Name的目录读入
{

	int i=0;
	for(i=0;i<NR_DIRECTORY_BUFFER-1;i++)
	{
		 //FatherInodeNumber相同Name也要相同
		 if(FileDir[i].FatherInodeNumber==FatherInodeNumber&&
			 !strcmp(FileDir[i].Dir.Name,Name))
		//返回Inode号
			return FileDir[i].Dir.InodeNumber;
	}

	//不在缓冲区中,从文件中读入
    if(OK!=IOReadDirectory(FatherInodeNumber,Name,
								  &FileDir[FreeIndex],0))
		return ERROR;
	if(++FreeIndex>=NR_DIRECTORY_BUFFER)
			FreeIndex=0;
	return FileDir[FreeIndex-1].Dir.InodeNumber;

}

 void IOWriteDirectory(t_32 FatherInodeNumber,t_32 Device ,LPDirectory pDirectory)
//将目录写入目录文件中。
{
	LPInodeBuffer pInodeBuffer;
	LPInode pInode;	
	//取得父目录
	pInodeBuffer=GetInode(FatherInodeNumber);
	printk("%d\n",pInodeBuffer->InodeNumber);
	pInode=pInodeBuffer->FileInode;
	WriteFile(GetSuper(),pInode,sizeof(Directory),0,(t_32)pDirectory);
	pInodeBuffer->Dirty=DIRTY;
	  printk("pInode->FileSize %d\n",pInode->FileSize);
	printk("FistBlock %d\n",pInode->Block[0]); printk("pInode %d\n",pInode);
	FreeInodeBuffer(pInodeBuffer);

}


t_bool AddDirectory(t_32 FatherInodeNumber,char *Name,t_32 ChildInodeNumber,t_32 Device)
//在父目录下添加子录
{
	Directory nDirectory;
	DirectoryBuffer nDirectoryBuffer;
	if(OK==IOReadDirectory(FatherInodeNumber,Name,
								  &nDirectoryBuffer,Device))
	return ERROR;//有相同的目录存在
	//讲子目录写入父目录
	nDirectory.InodeNumber=ChildInodeNumber;
	strcpy(nDirectory.Name,Name);
	IOWriteDirectory(FatherInodeNumber,Device ,&nDirectory);
	return OK;

}
/*
DeleteDirectory()
//在父目录下删除子录
{
	DirectoryBuffer nDirectoryBuffer;
	if(ERROR==IOReadDirectory(FatherInodeNumber,Name,
								  &nDirectoryBuffer,Device))
	return ERROR;//该目录不存在存在

}
ChangeDirectory()
//在同一个目录下更改子目录
{
}*/


⌨️ 快捷键说明

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