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

📄 creatde.c

📁 设计并实现一个多用户多级目录结构的文件系统
💻 C
字号:
/************************************************/
/*												*/
/*					creatdel.c					*/
/*												*/
/************************************************/

#include <stdio.h>
#include "filsys.h"

int creat( char * pathname, unsigned short mode )
{
	unsigned int di_ith, di_ino;
	struct inode * inode;
	int i, j;

	di_ino = namei( pathname );

	if( di_ino != NULL )								/* 该文件名已经存在 */
	{
		inode = iget( di_ino );			
		if( !( access( inode ) | WRITE ))	// 不允许写,出错
		{
			iput( inode );
			printf( "You have no access to creat\n" );
			return -1;
		}

		/* 以下重写一个文件 */

		/* 释放原有文件的磁盘块 */
		for( i = 0; i < inode->i_size / BLOCKSIZ + 1; i++ )
			bfree( inode->i_addr[i] );
		inode->i_size = 0;
		
		/* 该文件已经打开 */
		for( i = 0; i < SYSOPENFILE; i++ )
			if( sys_ofile[i].f_inode == inode )
			{
				sys_ofile[i].f_off = 0;
				for( j = 0; j < NOFILE; j++ )
				{
					if( user[user_id].u_ofile[j] == i )
						return j;
				}
			}

			/* 该文件还没有打开 */
		for( i = 0; i < NOFILE; i++ )
			if( user[user_id].u_ofile[i] == SYSOPENFILE + 1 )
			{
				user[user_id].u_uid = inode->i_uid;
				user[user_id].u_gid = inode->i_gid;
				for( j = 0; j < SYSOPENFILE; j++ )
					if( sys_ofile[j].f_count == 0 )
					{
						user[user_id].u_ofile[i] = j;
						sys_ofile[j].f_off = 0;
						sys_ofile[j].f_count = 1;
						sys_ofile[j].f_inode = inode;
						sys_ofile[j].f_flag = inode->i_mode;
					}
				return i;
			}
	}
	else					/* not existed before */	// 建立新文件
	{
		inode = ialloc();
		inode->i_addr[0] = balloc();
		di_ith = iname( pathname );
		
		dir.size++;

		dir.direct[di_ith].d_ino = inode->i_ino;
		inode->i_mode = mode | DIREG;
		inode->i_uid = user[user_id].u_uid;
		inode->i_gid = user[user_id].u_gid;
		inode->i_size = 0;
		inode->i_number = 1;

		for( i = 0; i < SYSOPENFILE; i++ )
		{
			if( sys_ofile[i].f_count == 0 )
				break;
		}

		for( j = 0; j < NOFILE; j++ )
		{
			if( user[user_id].u_ofile[j] == SYSOPENFILE + 1 ) 
				break;
		}

		user[user_id].u_ofile[j] = i;
		sys_ofile[i].f_flag = mode;
		sys_ofile[i].f_count = 1;
		sys_ofile[i].f_off = 0;
		sys_ofile[i].f_inode = inode;

		return j;
	}
}

_delete( char * filename )
{
	unsigned int dinodeid;
	struct inode * inode;

	dinodeid = namei( filename );
	if( dinodeid != NULL )
		inode = iget( dinodeid );
	inode->i_number--;
	iput( inode );
}

⌨️ 快捷键说明

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