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

📄 simdisk.cpp

📁 位图操作位图操作位图操作位图操作位图操作
💻 CPP
字号:
# include < iostream.h >
# include < string.h >
# include < stdio.h >
# include < io.h > 
# include "superblock.h"
# include "inode.h"
# include "file.h"
# include "command.h"
# include "buffer.h"
# include "bitmap_operation.h"

int main ()
{
	FILE * pfile;
	int filehandle;
    
	//创建一个文件并将其大小改为100M
	pfile = fopen ( " simdisk.dat ", "w+" );          //创建文件
	if ( pfile == NULL )
	{
		cout<<"the file cannot be opened !"<<endl;
		return false;
	}
	filehandle = fileno ( pfile );
	if ( chsize ( filehandle , 1024 * 1024 * 100 ) != 0 ) return false;     //chsize为改变文件大小函数
    /**************************************************************************************************/
	//定义超级块
	super_block sb;
	fseek ( pfile , 1024 , SEEK_SET );
	long const superblock_entry = ftell ( pfile );                  //超级块的入口地址
	sb.s_inodes = 27594;
	sb.s_nzones = 102400;
	sb.s_imap_blocks = 4;
	sb.s_zmap_blocks = 13;
	sb.s_firstdatazone = 48;
	sb.s_max_size = 10 * 1024 * 1024;
	sb.s_magic = 0x137f;
	/*long superblock_start = ftell ( pfile );
	cout << superblock_start << endl;*/
	fwrite ( &sb.s_inodes , sizeof ( sb.s_inodes ) , 1 , pfile );
	/*long superblock_end = ftell ( pfile );
	cout << superblock_end << endl;*/
	fwrite ( &sb.s_nzones , sizeof ( sb.s_nzones ) , 1 , pfile );
	fwrite ( &sb.s_imap_blocks , sizeof ( sb.s_imap_blocks ) , 1 , pfile );
	fwrite ( &sb.s_zmap_blocks , sizeof ( sb.s_zmap_blocks ) , 1 , pfile );
	fwrite ( &sb.s_firstdatazone , sizeof ( sb.s_firstdatazone ) , 1 , pfile );
	fwrite ( &sb.s_max_size , sizeof ( sb.s_max_size ) , 1 , pfile );
	fwrite ( &sb.s_magic , sizeof ( sb.s_magic ) , 1 , pfile );
    /**************************************************************************************************/
    //i节点位图
	int b_block_i;       //将于i节点位图及下面空闲块位图用到的计数变量
	/*long imap[4];
	fseek ( pfile , 2048 , SEEK_SET );
	imap[0] = ftell ( pfile );
    for ( int b_block_i = 0 ; b_block_i < 1024 ; b_block_i ++ ){
		fread ( &sb.s_imap[0].b_block[b_block_i] , 1 , 1 , pfile ); 
	}
    fseek ( pfile , 3072 , SEEK_SET );
    imap[1] = ftell ( pfile );
	for ( b_block_i = 0 ; b_block_i < 1024 ; b_block_i ++ ){
		fread ( &sb.s_imap[1].b_block[b_block_i] , 1 , 1 , pfile ); 
	}
    fseek ( pfile , 4096 , SEEK_SET );
	imap[2] = ftell ( pfile ); 
	for ( b_block_i = 0 ; b_block_i < 1024 ; b_block_i ++ ){
		fread ( &sb.s_imap[2].b_block[b_block_i] , 1 , 1 , pfile ); 
	}
	fseek ( pfile , 5120 , SEEK_SET );
	imap[3] = ftell ( pfile );
	for ( b_block_i = 0 ; b_block_i < 1024 ; b_block_i ++ ){
		fread ( &sb.s_imap[3].b_block[b_block_i] , 1 , 1 , pfile ); 
	}*/
    for ( int imap_i = 0 ; imap_i < 4 ; imap_i++ ){
		fseek ( pfile , 2048 + imap_i * 1024 , SEEK_SET );
        for ( b_block_i = 0 ; b_block_i < 1024 ; b_block_i ++ ){
			sb.s_imap[imap_i].b_block[b_block_i] = 0x00;
			fwrite ( &sb.s_imap[imap_i].b_block[b_block_i] , 1 , 1 , pfile ); 
		}
	}
	/**************************************************************************************************/
	//空闲盘块位图
	//long zmap[13];
    //fseek ( pfile , 6144 , SEEK_SET );
	for ( int zmap_i = 0 ; zmap_i < 13 ; zmap_i++ ){
		fseek ( pfile , 6144 + zmap_i * 1024 , SEEK_SET );
		for ( b_block_i = 0 ; b_block_i < 1024 ; b_block_i ++ ){
			if ( zmap_i == 0 && b_block_i < 6 ) sb.s_zmap[zmap_i].b_block[b_block_i] = 0xff;
			else sb.s_zmap[zmap_i].b_block[b_block_i] = 0x00;
			fwrite( &sb.s_zmap[zmap_i].b_block[b_block_i] , 1 , 1 , pfile );
		}
	}

	/**************************************************************************************************/
	//i节点区,占1M,每个i节点占用38字节空间
	fseek ( pfile , 19456 , SEEK_SET );
	long const inode_entry = ftell ( pfile );                          //i节点区的入口地址
    m_inode * inodes = new m_inode [ sb.s_inodes ];
    for ( int inodenum = 0 ; inodenum < sb.s_inodes ; inodenum++ ){
		inodes[inodenum].i_mode = 0;
		fwrite ( &inodes[inodenum].i_mode , sizeof ( inodes[inodenum].i_mode ) , 1 , pfile );
        inodes[inodenum].i_uid = 0;
		fwrite ( &inodes[inodenum].i_uid , sizeof ( inodes[inodenum].i_uid ) , 1 , pfile );
		inodes[inodenum].i_size = 1024;
		fwrite ( &inodes[inodenum].i_size , sizeof ( inodes[inodenum].i_size ) , 1 , pfile );
		inodes[inodenum].i_mtime = 20080213;
		fwrite ( &inodes[inodenum].i_mtime , sizeof ( inodes[inodenum].i_mtime ) , 1 , pfile );
		inodes[inodenum].i_gid = 0;
		fwrite ( &inodes[inodenum].i_gid , sizeof ( inodes[inodenum].i_gid ) , 1 , pfile );
		inodes[inodenum].i_nlinks = 0;
		fwrite ( &inodes[inodenum].i_nlinks , sizeof ( inodes[inodenum].i_nlinks ) , 1 , pfile );
		fwrite ( inodes[inodenum].i_zone , sizeof ( inodes[inodenum].i_zone[0] ) , 9 , pfile );
		//fwrite ( &inodes[inodenum] , sizeof ( inodes[inodenum] ) , 1 , pfile );
	}
    /**************************************************************************************************/
	//根目录区,1k
	fseek ( pfile , 47 * 1024 , SEEK_SET );
    int root_i;
	m_file root_dir;
	dir_entry root_entry[63];
	root_dir.f_mode = 'd';
	root_dir.f_count = 0;  //内存中使用
	//root_dir.f_inode = inodes;      //内存中使用
	root_dir.f_flags = 1;
	root_dir.f_pos = ftell ( pfile );     //内存中使用
    inodes[0].i_zone[0] = ftell ( pfile ) / 1024;
	fwrite ( &root_dir.f_mode , sizeof ( root_dir.f_mode ) , 1 , pfile );
	//fwrite ( &root_dir.f_count , sizeof ( root_dir.f_count ) , 1 , pfile );
    //fwrite ( root_dir.f_inode , sizeof ( root_dir.f_inode ) , 1 , pfile );        
    fwrite ( &root_dir.f_flags , sizeof ( root_dir.f_flags ) , 1 , pfile );
	//fwrite ( &root_dir.f_pos , sizeof ( root_dir.f_pos ) , 1 , pfile );
	for ( root_i = 0 ; root_i < 63 ; root_i++ ){
		root_entry[root_i].inode = 0;
		fwrite ( &root_entry[root_i].inode , sizeof ( root_entry[root_i].inode ) , 1 , pfile );
		for ( int name_i = 0 ; name_i < 14 ; name_i ++ ){
			root_entry[root_i].name[name_i] = 0;
		}
		fwrite ( &root_entry[root_i].name[0] , sizeof ( root_entry[root_i].name[0] ) , 14 , pfile );
		//fwrite ( &root_entry[root_i] , sizeof (root_entry[root_i]) , 1 , pfile );
	}
    fseek ( pfile , 0 , inode_entry );
	fwrite ( &inodes[0] , sizeof ( inodes[0] ) , 1 , pfile );
	sb.s_isup = inodes;
	delete []inodes;
    /**************************************************************************************************/
	dir_entry entry[63];                  //在内存中使用的目录的目录项
	for ( root_i =0 ; root_i < 63 ; root_i ++ ){       //初始化目录项的位置,是使其指向根目录
		entry[root_i].inode = root_entry[root_i].inode;
		strncpy ( entry[root_i].name , root_entry[root_i].name , 13 ); 
	}
	int const nfiles = 16;                           //允许同时打开的文件(包括目录)数
	m_file * file_list = new m_file[nfiles];         //在内存中设一数组记录打开了哪些文件
    //function test
	show_info ( sb );
	/*fseek ( pfile , superblock_entry , SEEK_SET );
	short s_inodes;
	fread ( &s_inodes , sizeof ( s_inodes ) , 1 , pfile );
	cout << s_inodes << endl;*/
	com_analyser( pfile , inode_entry , entry , root_entry , sb ,file_list );
	

	fclose ( pfile );
	return 0;
}

⌨️ 快捷键说明

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