📄 dir.c
字号:
/************************************************/
/* */
/* dir.c */
/* */
/************************************************/
#include <string.h>
#include <stdio.h>
#include "filsys.h"
_dir() /* dir */
{
unsigned int di_mode;
int i, j, filenum, dirnum;
struct inode * temp_inode;
filenum = 0;
dirnum = 0;
printf( "CURRENT DIRECTORY :\n" );
for( i = 2; i < dir.size; i++ )
{
// printf("%s %d ",dir.direct[i].d_name,dir.direct[i].d_ino);
if( dir.direct[i].d_ino != DIEMPTY )
{
temp_inode = iget( dir.direct[i].d_ino );
di_mode = temp_inode->i_mode;
if( temp_inode->i_mode & DIDIR )
{
printf( "d" ); /* 目录文件 */
dirnum++;
}
else
{
printf( "-" ); /* 普通文件 */
filenum++;
}
for( j = 0; j < 3; j++ )
{
if( di_mode % 2 )
printf( "r" );
else
printf( "-" );
di_mode = di_mode / 2;
if( di_mode % 2 )
printf( "w" );
else
printf( "-" );
di_mode = di_mode / 2;
if( di_mode % 2 )
printf( "x" );
else
printf( "-" );
di_mode = di_mode / 2;
}
printf( " %s\n", dir.direct[i].d_name );
iput( temp_inode );
}
}
printf( "\n %d files\n", filenum);
printf( " %d directories\n", dirnum);
}
/* 创建目录函数 */
mkdir( char * dirname )
{
int dirid, dirpos;
struct inode * inode;
struct direct buf[BLOCKSIZ / DIRECTSIZ];
unsigned int block;
dirid = namei( dirname );
if( dirid != NULL )
{
// inode = iget( dirid );
printf( "mkdir: cannot make directory '%s': File exists\n", dirname );
// iput( inode );
return;
}
dirpos = iname( dirname );
inode = ialloc();
dirid = inode->i_ino;
dir.direct[dirpos].d_ino = dirid;
dir.size++;
/* fill the new dir buf */
strcpy( buf[0].d_name, cur_path_name );
buf[0].d_ino = cur_path_inode->i_ino;
strcpy( buf[1].d_name, dirname );
buf[1].d_ino = dirid;
inode->i_size = 2 * DIRECTSIZ;
inode->i_number = 1;
inode->i_mode = DEFAULTMODE | DIDIR;
inode->i_uid = user[user_id].u_uid;
inode->i_gid = user[user_id].u_gid;
block = balloc();
inode->i_addr[0] = block;
fseek( fd, DATASTART + block * BLOCKSIZ, SEEK_SET );
fwrite( buf, 1, inode->i_size, fd );
iput( inode );
return;
}
chdir( char * dirname ) /* chdir */
{
unsigned int dirid;
dirid = namei( dirname ); /* 获得当前目录的磁盘i节点号 */
if( dirid == NULL ) /* 没有该目录 */
{
printf( "bash: %s: No such file or directory\n",dirname );
return;
}
if( strcmp( dirname, ".." ) == 0 )
dirname = dir.direct[0].d_name;
else
if( strcmp( dirname, "." ) == 0 )
dirname = dir.direct[1].d_name;
putdir(); /* 把当前目录写回到磁盘 */
strcpy( cur_path_name, dirname );
getdir( dirid, dirname ); /* 取得所有进入的目录的目录结构 */
return;
}
rmdir( char * dirname )
{
int dirid, dirpos;
struct inode * inode;
struct direct buf[BLOCKSIZ / DIRECTSIZ];
unsigned int block;
dirid = namei( dirname );
if( dirid == NULL ) /* 找不到该目录 */
{
printf( "rmdir: %s: No such file or directory\n", dirname );
return;
}
inode = iget( dirid );
if( !( inode->i_mode & DIDIR )) /* 不是目录 */
{
printf( "rmdir: %s: Not a directory\n", dirname );
iput( inode );
return;
}
if( inode->i_size > 2 * DIRECTSIZ ) /* 目录非空 */
{
printf( "rmdir: %s: Directory not empty\n", dirname );
iput( inode );
return;
}
dirid = inode->i_ino;
dir.direct[dirpos].d_ino = dirid;
dir.size++;
/* fill the new dir buf */
strcpy( buf[0].d_name, cur_path_name );
buf[0].d_ino = cur_path_inode->i_ino;
strcpy( buf[1].d_name, dirname );
buf[1].d_ino = dirid;
inode->i_size = 2 * DIRECTSIZ;
inode->i_number = 1;
inode->i_mode = DEFAULTMODE | DIDIR;
inode->i_uid = user[user_id].u_uid;
inode->i_gid = user[user_id].u_gid;
block = balloc();
inode->i_addr[0] = block;
fseek( fd, DATASTART + block * BLOCKSIZ, SEEK_SET );
fwrite( buf, 1, inode->i_size, fd );
iput( inode );
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -