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 + -
显示快捷键?