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

📄 dir.h

📁 用c语言编程
💻 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 + -