📄 simdisk.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 + -