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

📄 dir.c

📁 设计并实现一个多用户多级目录结构的文件系统
💻 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 + -