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

📄 dir.c

📁 操作系统课程设计
💻 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 + -