📄 dir.c
字号:
/* dir.c*/
#include <stdio.h>
#include <string.h>
#include "filesys.h"
_dir() /* _dir */
{
unsigned int di_mode;
int i,one,j,k,h=0; //~~~~edited
struct inode * temp_inode;
printf("\nCURRENT DIRECTORY:\n");
for (i=0;i<dir.size;i++)
{
if (dir.direct[i].d_ino!=DIEMPTY)
{
printf(" %14s ",dir.direct[i].d_name); //~~~~edited
temp_inode=iget(dir.direct[i].d_ino);
di_mode=temp_inode->di_mode;
if ((temp_inode->di_mode & DIFILE) == DIFILE) //~~~~edited
printf ("f ");
else printf ("d ");
for (j=0;j<9;j++) //~~~~edited
{
one=di_mode % 2;
di_mode=di_mode /2;
if (one) printf ("x");
else printf ("-");
}
printf(" ");
if ((temp_inode->di_mode & DIFILE) == DIFILE) //~~~~edited
{
printf ("<%ld>", temp_inode->di_size);
printf (" ->Chain:");
if (temp_inode->di_size)
for(k=0; k<((temp_inode ->di_size/BLOCKSIZ)+1); k++) //~~~~edited
{
printf("%4d", temp_inode ->di_addr[k]);
h++;
if(h%5==0) printf("\n ");
}
printf("\n");
}
else printf ("<dir>\n");
iput (temp_inode);
}
}
}
mkdir (dirname) /* mkdir */
char *dirname;
{
int dirid,dirpos;
struct inode * inode;
struct inode * tmpinode;
struct direct buf[BLOCKSIZ/(DIRSIZ+ 2)];
unsigned int block;
int i;
dirid=namei(dirname);
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 create a dir the same name", dirname);
iput (inode);
return;
}
dirpos = iname(dirname);
tmpinode=iget(cur_path_inode->i_ino);
tmpinode->di_size+=(DIRSIZ+2);
iput(tmpinode);
inode=ialloc();
dirid=inode->i_ino;
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;
for(i=2;i<(BLOCKSIZ/(DIRSIZ+ 2));i++)buf[i].d_ino=0; //~~~~edited
block=balloc();
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("目录创建成功.\n");
return;
}
chdir (dirname) /* chdir */
char * dirname;
{
unsigned int dirid;
struct inode * inode;
unsigned short block;
int i,j,low=0,high=0,l=0;
int ctmp ;//~~~~edited
if (strlen(dirname)==0)//~~~~edited
{
printf("\n%s\n",cpath);
return;
}//~~~~~~~~~~
dirid =namei(dirname);
if (dirid==NULL)
{
printf("\n目录%s不存在\n", dirname);
return;
}
inode=iget(dirid);
if (!access (user_id, inode, user[user_id].u_default_mode))
{
printf("\nhas not access to the directory %s",dirname);
iput(inode);
return;
}
/* write back the current directory */
fseek(fd, DATASTART+cur_path_inode->di_addr[0]*BLOCKSIZ,SEEK_SET);
fwrite(&dir.direct,1,BLOCKSIZ, fd); //~~~~~~~可以修改
cur_path_inode->di_size=dir.size*(DIRSIZ+2);
iput (cur_path_inode);
cur_path_inode=inode;
if (!stricmp(dirname,".."))
{
ctmp=strlen(cpath);
for(;ctmp>=0;ctmp--)
{
if ((cpath[ctmp])=='\\') l++;
if (l==2) break;
}
cpath[ctmp+1]='\0';
}else if (stricmp(dirname,".")){
strcat(cpath,dirname);
strcat(cpath,"\\");
}
/* read the change dir from disk */
j=0;
for (i=0; i<inode->di_size/BLOCKSIZ+ 1; i++)
{
fseek(fd,DATASTART+inode->di_addr[i]*BLOCKSIZ, SEEK_SET);
fread(&dir.direct[j],1,BLOCKSIZ,fd);
j+=BLOCKSIZ/(DIRSIZ+2);
};
dir.size=inode->di_size/(DIRSIZ+2); //~~~~~~edited
for(i=dir.size;i<DIRNUM;i++)
dir.direct[i].d_ino=0; //~~~~~~
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -