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

📄 dir.c~

📁 模拟linux的ext3文件系统。采用位图法。用一个文件模拟硬盘。实现创建、删除目录、文件。读、写文件
💻 C~
字号:
#define MAIN#include "structure.h"// function mkdir()u16 mkdir(u8 *path,u8 *name){ u16 newi,block,parent_inode_num,offset; struct ext2_inode parent_inode,inode; tag='2'; if((strlen(path))){      if(!(parent_inode_num=get_dir(path))) {             printf("Invalid pathname!\n");             return 0;      } } else parent_inode_num=current_dir; if(!(strlen(name))){        printf("miss parameter!\n");        return 0; } load_inode_entry(&parent_inode,parent_inode_num); if((block=search_name(&parent_inode,name,&offset)))    {          printf("dir already exist\n");          return 0; }  if(!(newi=create_dir_entry(&parent_inode,name)))  {	 printf("cannot make a dir!\n");	 return 0; } update_inode_entry(&parent_inode,parent_inode_num); load_inode_entry(&inode,newi); init_dir(&inode,newi,parent_inode_num); update_inode_entry(&inode,newi); return 1;}//function rmdir()u16 rmdir(u8 *path,u8 *name){ u16 oldi,block,parent_inode_num,offset; struct ext2_inode parent_inode,inode; u8 buffer[512]; if((strlen(path))){      if(!(parent_inode_num=get_dir(path))) {             printf("Invalid pathname!\n");             return 0;      } } else parent_inode_num=current_dir; if(!(strlen(name))){        printf("miss parameter\n");        return 0; } load_inode_entry(&parent_inode,parent_inode_num); if(!(block=search_name(&parent_inode,name,&offset))){	 printf("name not exist\n"); 	 return 0; } load_block_entry(buffer,block); oldi=buffer[offset]+buffer[offset+1]*0x100; load_inode_entry(&inode,oldi); if(!(empty_dir(&inode)))  { 	 printf("you can not delete a directory when it is not empty !\n");	 return 0; } free_blocks(&inode); free_inode(oldi); buffer[offset]=buffer[offset+1]=0; update_block_entry(buffer,block); return 1;}// function dir()void dir_block(u16 block){ u8 buffer[512]; struct ext2_dir_entry *de; u16 i; if(!block)  return; load_block_entry(buffer,block); for(i=0,de=(struct ext2_dir_entry *)buffer;i<DIR_ENTRIES_PER_BLOCK;i++,de++){         if(de->d_inode)         {               if(de->d_file_type=='1')		{                         printf("f------rwx ");		}		else		{			 printf("d------rwx ");		}	printf("%s\n",de->name);	}			 }}void dir_ind(u16 block){ u8 buffer[512]; u16 i; if(!block)  return; load_block_entry(buffer,block); for(i=0;i<256;i++)	 dir_block(buffer[2*i]+buffer[2*i+1]*0x100);}void dir_dind(u16 block){ u8 buffer[512]; u16 i; if(!block)  return; load_block_entry(buffer,block); for(i=0;i<256;i++)	 dir_ind(buffer[2*i]+buffer[2*i+1]*0x100);}void dir( ){ struct ext2_inode inode; load_inode_entry(&inode,current_dir); if(!(test_inode(current_dir)))  {                   printf("the dir not exist!!\n");                   return; } u16 i; for(i=0;i<6;i++)       dir_block(inode.i_block[i]); dir_ind(inode.i_block[6]); dir_dind(inode.i_block[7]);}//function cd()u16 cd(u8 *path){ u16 inode_num; u8 ch; if((!strlen(path))){	 printf("miss parameter\n");	 return 0; } if(!(inode_num=get_dir(path))){         printf("wrong dir\n");        	 return 0; } current_dir=inode_num; if((ch=*path)=='/'){        strcpy(current_path,path); } else if(ch) strcat(current_path,path); return 1;}

⌨️ 快捷键说明

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