📄 dir.h
字号:
//
void dir_prepare(unsigned short tmp,unsigned short len,int type) //新目录和文件初始化.and ..
{
reload_inode_entry(tmp);//得到新目录的节点入口地址
if(type==2)//目录
{
inode_area[0].i_size=32;
inode_area[0].i_blocks=1;
inode_area[0].i_block[0]=alloc_block();
dir[0].inode=tmp;
dir[1].inode=current_dir;
dir[0].name_len=len;
dir[1].name_len=current_dirlen;
dir[0].file_type=dir[1].file_type=2;
for(type=2;type<32;type++)
dir[type].inode=0;
strcpy(dir[0].name,".");
strcpy(dir[1].name,"..");
update_dir(inode_area[0].i_block[0]);
inode_area[0].i_mode=01006;//drwxrwxrwx:目录
}
else
{
inode_area[0].i_size=0;
inode_area[0].i_blocks=0;
inode_area[0].i_mode=0407;//drwxrwxrwx:文件
}
update_inode_entry(tmp);
}
//
unsigned short reserch_file(char tmp[9],int file_type,unsigned short *inode_num,unsigned short *block_num,unsigned short *dir_num)
{ //查找文件并改写缓冲区里节点号,所在目录节点的数据块号(0~7)、目录项所在号
unsigned short j,k;
reload_inode_entry(current_dir);
j=0;
while(j<inode_area[0].i_blocks)
{
reload_dir(inode_area[0].i_block[j]);
k=0;
while(k<32)
{
if(!dir[k].inode||dir[k].file_type!=file_type||strcmp(dir[k].name,tmp))k++;
else
{
*inode_num=dir[k].inode;
*block_num=j;
*dir_num=k;
return 1;
}
}
j++;
}
return 0;
}
//
void cd(char tmp[9])
{
unsigned short i,j,k,flag;
flag=reserch_file(tmp,2,&i,&j,&k);
if(flag)
{
current_dir=i;
if(!strcmp(tmp,"..")&&dir[k-1].name_len)
{
current_path[strlen(current_path)-dir[k-1].name_len-1]='\0';
current_dirlen=dir[k].name_len;
}
else if(!strcmp(tmp,"."));
else if(strcmp(tmp,".."))
{
current_dirlen=strlen(tmp);
strcat(current_path,tmp);
strcat(current_path,"/");
}
}
else printf("The directory %s not exists!\n",tmp);
}
//
void del(char tmp[9])
{
unsigned short i,j,k,m,n,flag,num1,num2;
m=0;
flag=reserch_file(tmp,1,&i,&j,&k);
if(flag)
{
flag=0;
while(fopen_table[flag]!=dir[k].inode&&flag<16)flag++;
if(flag<16)fopen_table[flag]=0;
reload_inode_entry(i); //找到文件所在节点入口,将节点值载入inode_area[0]
if(inode_area[0].i_blocks<=6)
{
while(m<inode_area[0].i_blocks)remove_block(inode_area[0].i_block[m++]);
}
else if(inode_area[0].i_blocks>6&&inode_area[0].i_blocks<=262)
{ m=0;
while(m<6)remove_block(inode_area[0].i_block[m++]);
memset(index_buf,'\0',sizeof(index_buf));
reload_index_block(inode_area[0].i_block[6]);
while(m<inode_area[0].i_blocks)
{
//printf("%d\n",m);
remove_block(index_buf[m-6]);
m++;
}
}
else if(inode_area[0].i_blocks>=263&&inode_area[0].i_blocks<=3837)
{
reload_index1_block(inode_area[0].i_block[7]);
for(num1=0;num1<=(inode_area[0].i_blocks-262)/512;num1++)//index_buf1[num1]
{
reload_index_block(num1);
for(num2=0;num2<=(inode_area[0].i_blocks-262)%512;num2++)
{
remove_block(index_buf[num2]);
}
}
}
inode_area[0].i_blocks=0;
inode_area[0].i_size=0;
remove_inode(i);//移除文件的索引节点
//reserch_file(tmp,1,&i,&j,&k);
//改目录文件所在目录已经在dir_entry中
reload_inode_entry(current_dir);
dir[k].inode=0;
//if(k!=0)dir[k-1].rec_len+=dir[k].rec_len ;
update_dir(inode_area[0].i_block[j]);
inode_area[0].i_size-=16;
m=1;
//删除目录都是0的节点所指的块
while(m<inode_area[i].i_blocks)
{
flag=n=0;
reload_dir(inode_area[0].i_block[m]);
while(n<32)
{
if(!dir[n].inode)flag++;
n++;
}
if(flag==32)
{
remove_block(inode_area[i].i_block[m]);
inode_area[i].i_blocks--;
while(m<inode_area[i].i_blocks)inode_area[i].i_block[m]=inode_area[i].i_block[++m];
}
}
update_inode_entry(current_dir);
}
else printf("The file %s not exists!\n",tmp);
}
//
void mkdir(char tmp[9],int type)
{
unsigned short tmpno,i,j,k,flag;
reload_inode_entry(current_dir); //获得当前目录的索引节点给inode_area[0]
if(!reserch_file(tmp,type,&i,&j,&k)) //未找到同名文件
{
if(inode_area[0].i_size==4096) //目录项已满
{
printf("Directory has no room to be alloced!\n");
return;
}
flag=1;
if(inode_area[0].i_size!=inode_area[0].i_blocks*512)//目录中有某些个块中32个项未满
{
i=0;
while(flag&&i<inode_area[0].i_blocks)
{
reload_dir(inode_area[0].i_block[i]);
j=0;
while(j<32)
{
if(dir[j].inode==0)
{
flag=0;
break;
}
j++;
}
i++;
}
tmpno=dir[j].inode=get_inode();
dir[j].name_len=strlen(tmp);
dir[j].file_type=type;
strcpy(dir[j].name,tmp);
update_dir(inode_area[0].i_block[i-1]);
}
else//全满
{
inode_area[0].i_block[inode_area[0].i_blocks]=alloc_block();
inode_area[0].i_blocks++;
reload_dir(inode_area[0].i_block[inode_area[0].i_blocks-1]);
tmpno=dir[0].inode=get_inode();
dir[0].name_len=strlen(tmp);
dir[0].file_type=type;
strcpy(dir[0].name,tmp);
//初始化新块
for(flag=1;flag<32;flag++)dir[flag].inode=0;
update_dir(inode_area[0].i_block[inode_area[0].i_blocks-1]);
}
inode_area[0].i_size+=16;
update_inode_entry(current_dir);
dir_prepare(tmpno,strlen(tmp),type);
}
else //已经存在同名文件或目录
{
if(type==1)printf("File has already existed!\n");
else printf("Directory has already existed!\n");
}
}
//
void rmdir(char tmp[10])
{
unsigned short i,j,k,flag;
unsigned short m,n;
if(!strcmp(tmp,"..")||!strcmp(tmp,"."))
{
printf("The directory can not be deleted!\n");
return;
}
flag=reserch_file(tmp,2,&i,&j,&k);
if(flag)
{
reload_inode_entry(dir[k].inode); //找到要删除的目录的节点并载入
if(inode_area[0].i_size==32) //只有.and ..
{
inode_area[0].i_size=0;
inode_area[0].i_blocks=0;
reload_dir(inode_area[0].i_block[0]);
dir[0].inode=0;
dir[1].inode=0;
remove_block(inode_area[0].i_block[0]);
//reserch_file(tmp,2,&i,&j,&k);
reload_inode_entry(current_dir);//得到当前目录的节点并更改当前目录项
remove_inode(dir[k].inode);
dir[k].inode=0;
update_dir(inode_area[0].i_block[j]);
inode_area[0].i_size-=16;
flag=0;
m=1;
while(flag<32&&m<inode_area[0].i_blocks)
{
flag=n=0;
reload_dir(inode_area[0].i_block[m]);
while(n<32)
{
if(!dir[n].inode)flag++;
n++;
}
if(flag==32)
{
remove_block(inode_area[0].i_block[m]);
inode_area[0].i_blocks--;
while(m<inode_area[0].i_blocks)inode_area[0].i_block[m]=inode_area[0].i_block[++m];
}
}
update_inode_entry(current_dir);
}
else printf("Directory is not null!\n");
}
else printf("Directory to be deleted not exists!\n");
}
//
void chmod(char limit[1],char tmp[9])
{
unsigned short i,j,k,flag;
flag=reserch_file(tmp,1,&i,&j,&k);
if(flag)
{
reload_inode_entry(dir[k].inode);
switch(limit[0])
{
case '1':inode_area[0].i_mode=257;break;//100000001
case '2':inode_area[0].i_mode=258;break;
case '3':inode_area[0].i_mode=259;break;
case '4':inode_area[0].i_mode=260;break;
case '5':inode_area[0].i_mode=261;break;
case '6':inode_area[0].i_mode=262;break;
case '7':inode_area[0].i_mode=263;break;
}
//printf("\n%d\n ",inode_area[0].i_mode);
update_inode_entry(i);
}
else printf("The file %s not exists!\n");
}
void ls()
{
printf("items type mode size\n");//15*4
unsigned short i,j,k,tmpno,no;
i=0;
reload_inode_entry(current_dir);
while(i<inode_area[0].i_blocks)
{
k=0;
reload_dir(inode_area[0].i_block[i]);
//printf("\n");
//for(no=0;no<32;no++)printf(" %d ",dir[no].inode);
//printf("\n");
while(k<32)
{
if(dir[k].inode)
{
printf("%s",dir[k].name);
if(dir[k].file_type==2)
{
j=0;
reload_inode_entry(dir[k].inode);
if(!strcmp(dir[k].name,".."))while(j++<13)printf(" ");
else if(!strcmp(dir[k].name,"."))while(j++<14)printf(" ");
else while(j++<15-dir[k].name_len)printf(" ");
printf("<DIR> ");
switch(inode_area[0].i_mode&7)
{
case 1:printf("____x");break;
case 2:printf("__w__");break;
case 3:printf("__w_x");break;
case 4:printf("r____");break;
case 5:printf("r___x");break;
case 6:printf("r_w__");break;
case 7:printf("r_w_x");break;
}
printf(" ----");
}
else if(dir[k].file_type==1)
{
j=0;
reload_inode_entry(dir[k].inode);
while(j++<15-dir[k].name_len)printf(" ");
printf("<FILE> ");
switch(inode_area[0].i_mode&7)
{
case 1:printf("____x");break;
case 2:printf("__w__");break;
case 3:printf("__w_x");break;
case 4:printf("r____");break;
case 5:printf("r___x");break;
case 6:printf("r_w__");break;
case 7:printf("r_w_x");break;
}
printf(" %d bytes ",inode_area[0].i_size);
}
printf("\n");
}
k++;
reload_inode_entry(current_dir);
}
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -