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

📄 dir.c

📁 此版本是在网上广为流传的 二级文件系统 基础上制作的.重新编写了块操作等模块,修正了N多BUG. 实现的命令有 ls-列目录 md-创建目录 cd-进入子目录 mf-创建文件 cat-显示文件内
💻 C
字号:
#include<stdio.h>

#include<string.h>

#include "filesys.h"

_dir()    /*  -dir  */
{
  unsigned short di_mode;
  int i,j,k,one;
  struct inode *temp_inode;
  printf("\ndir size=%d\n",dir.size);
  for(i=0;i<dir.size;i++)
  {
    if(dir.direct[i].d_ino!=DIEMPTY)
    {
       printf("%14s ",dir.direct[i].d_name);
       printf("d_ino=%d",dir.direct[i].d_ino);
       temp_inode=iget(dir.direct[i].d_ino);
       di_mode=temp_inode->di_mode;
    if(temp_inode->di_mode & DIFILE)  printf("f"); 
    else printf("d");
       for(j=0;j<9;j++)
       {
           one=di_mode%2;
           di_mode=di_mode/2;
           if(one) printf("x");
           else printf("-");
       }

/*printf("i=%d,d_name=%s,",i,dir.direct[i].d_name);
printf("di_mode=%0x\n",temp_inode->di_mode);*/
        if(temp_inode->di_mode & DIFILE)  
        {
           printf("%ld",temp_inode->di_size);
           printf(" block chain:");
           for(k=0;k<temp_inode->di_size/BLOCKSIZ+(temp_inode->di_size%BLOCKSIZ != 0);k++)
           printf("%d ",temp_inode->di_addr[k]);
           printf("\n");
        }
        else
               printf("<dir>block chain:%d\n",dir.direct[i].d_ino);
               iput(temp_inode);
      }
  }
printf("dir---->out\n");
}

  
mkdir(dirname)    /* mkdir */
char *dirname;
{
  int dirid,dirpos;
  struct inode *inode;
  struct direct buf[BLOCKSIZ/(DIRSIZ+2)];
  unsigned int block;

  dirid=namei(dirname);
  printf("dirid=%d\n",dirid);
  if(dirid != NULL)
  {
      inode=iget(dirid);
      if(inode->di_mode & DIDIR)
        printf("\n%s directory already existed!!!\n",dirname);
      else
        printf("\n%s is a file name,&can't creat a dir the same name\n",dirname);
      iput(inode);
    return;
  }
   dirpos=iname(dirname);
   inode=ialloc();
/*dirid=filsys.s_inode[filsys.s_pinode-1];*/
   dirid=inode->i_ino;
/*printf("\ndirid=%d",dirid);
printf("dirpos=%d\n",dirpos);
printf("dir.size=%d\n",dir.size);*/
  
   dir.direct[dirpos].d_ino=inode->i_ino;
   dir.size++;
   /*fill the new dir buf */
   strcpy(buf[0].d_name,".");
   buf[0].d_ino=dirid;
   strcpy(buf[1].d_name,"..");
   buf[1].d_ino=cur_path_inode->i_ino;
/*strcpy(buf[2].d_name,dirname);
buf[2].d_ino=dirid;*/
   buf[2].d_ino=0;
   block=balloc();
/*printf("block=%d\n",block);*/
   fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
   fwrite(buf,1,BLOCKSIZ,fd);

   inode->di_size=2*(DIRSIZ+2);
   inode->di_number=1;
   inode->di_mode=user[user_id].u_default_mode|DIDIR;
   inode->di_uid=user[user_id].u_uid;
   inode->di_gid=user[user_id].u_gid;
   inode->di_addr[0]=block;
   iput(inode);
printf("mkdir---->out\n");
   return ;
}



chdir(dirname)    /* chdir */
char *dirname;
{
   unsigned int dirid;
   struct inode *inode;
   unsigned short block;
   int i,j,low=0,high=0;

   dirid=namei(dirname);
/*printf("\ndirname=%skkkkk,dirid=%d\n",dirname,dirid); */
   if(dirid==NULL)
   {
       printf("\n%s does not existed\n",dirname);
       return;
   }

   inode=iget(dirid);
   if (inode->di_mode & DIFILE) {
       printf("\nIt's a File! Can't use this command!\n");
       return;
   }
   if(!access(user_id,inode,user[user_id].u_default_mode))
   {
       printf("\nhas not access to the directory %s\n",dirname);
       iput(inode);
       return;
   }

   if ( !strcmp(dirname, "..") ) {
      if ( dir_lv > 1 ) {
          cur_path[dir_lv-1][0] = 0;
          --dir_lv;
      }
   }        
   else if ( !strcmp(dirname, ".") ) { }
   else {
      if ( dir_lv < 10 ) {
          strcpy(cur_path[dir_lv], dirname);
          ++dir_lv;
      }    
   }   

   /* pack the current directory*/
   for(i=0;i<dir.size; i++)
   {
       for(j=0;j<DIRNUM;j++)
              if(dir.direct[j].d_ino==0) break;
       memcpy(&dir.direct[j],&dir.direct[i],DIRSIZ+2);
       dir.direct[j].d_ino=0;
   }

   /*write back the current directory*/
   for(i=0;i<cur_path_inode->di_size/BLOCKSIZ+(cur_path_inode->di_size%BLOCKSIZ!=0); i++)
   {
       bfree(cur_path_inode->di_addr[i]);
   }
   for(i=0;i<dir.size; i+=BLOCKSIZ/(DIRSIZ+2))
   {
       block=balloc();
/*printf("i=%d,block=%d\n",i,block);*/
       cur_path_inode->di_addr[i]=block;
       fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
       fwrite(&dir.direct[i],1,BLOCKSIZ,fd);
   }

   cur_path_inode->di_size=dir.size*(DIRSIZ+2);
   iput(cur_path_inode);

   cur_path_inode=inode;
   dir.size=inode->di_size/(DIRSIZ+2);

/*printf("\ndir.size=%d\n",dir.size);*/
/*printf("\ninode->di_addr[0]=%d\n",inode->di_addr[0]);*/

   /*read the change dir from disk */

   j=0;
   for(i=0;i<inode->di_size/BLOCKSIZ+(inode->di_size%BLOCKSIZ!=0); i++)
   {
/*printf("\ni=%d,inode->di_addr[i]=%d\n",i,inode->di_addr[i]);*/
        fseek(fd,DATASTART+inode->di_addr[i]*BLOCKSIZ,SEEK_SET);
        fread(&dir.direct[j],1,BLOCKSIZ,fd);
        j+=BLOCKSIZ/(DIRSIZ+2);
   };
   
printf("chdir---->out\n");
   return;

}

⌨️ 快捷键说明

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