亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? yafs_op.h

?? 簡單模擬了操作系統文件系統的操作
?? H
?? 第 1 頁 / 共 2 頁
字號:
/*!
 * \file
 * \brief 各種內存數據結構以及磁盤數據結構的操作函數
 *
 * 各種內存數據結構以及磁盤數據結構的操作函數的定義 */
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <ctime>
#include <cmath>
#include <list>
#include <string.h>
#include <memory.h>
#include "yafs.h"
#include "yafs_mem.h"

using std::list;


struct super_block initSuperBlock;		//!<內存中的超級塊
struct group_desc initGroupDesc;		//!<內存中的塊組描述符
struct dir_entry_mem result;			//!<目錄結構的根目錄

/*!
 * \brief 將內存中的超級塊結構寫入磁盤中 * @param initSuperBlock 內存中的超級塊結構 */
void writeSuperBlock( struct super_block initSuperBlock )
{
	FILE *file = fopen( "disk.img", "r+" );
	fseek( file, 0, SEEK_SET );
	fwrite( &initSuperBlock, sizeof( struct super_block ), 1, file );
	fclose( file );
}

/*!
 * \brief 將磁盤上的超級塊結構讀取到內存中 */
void getSuperBlock()
{
	FILE *file = fopen ( "disk.img", "r+" );
	fseek( file, 0, SEEK_SET );
	fread( &initSuperBlock, sizeof( super_block ), 1, file );
	fclose( file );
}

/*!
 * \brief 將磁盤中的塊組描述符讀取到內存中 */
void getGroupDesc()
{
	FILE *file = fopen( "disk.img", "r+" );
	fseek( file, 1 * 1024, SEEK_SET );
	fread( &initGroupDesc, sizeof( group_desc ), 1, file );
	fclose( file );
}

/*!
 * \brief 將內存中的塊組描述符寫入到磁盤中 * @param initGroupDesc	內存中的塊組描述符 */
void writeGroupDesc( struct group_desc initGroupDesc )
{
	FILE *file = fopen( "disk.img", "r+" );
	fseek( file, 1024, SEEK_SET );
	fwrite( &initGroupDesc, sizeof( group_desc ), 1, file );
	fclose( file );
}

/*!
 * \brief 將內存中的塊“位圖”寫入到磁盤中 * @param blockBitmap 內存的中塊“位圖” */
void writeBlockBitmap( char blockBitmap[] )
{
	FILE *file = fopen( "disk.img", "r+" );
	fseek( file, 2 * 1024, SEEK_SET );
	fwrite( blockBitmap, sizeof( char ) * 1024, 1, file );
	fclose( file );
}

/*!
 * \brief 更新磁盤中的塊“位圖”中特定”位“的值,將特定的數據塊標記為已使用或者為使用 * @param offset 需要標記的數據塊的塊號 * @param c “位”修改后的值,'0'表示未被使用,'1'表示正在使用 */
void updateBlockBitmap( int offset, char c )
{
	FILE *file = fopen( "disk.img", "r+" );
	fseek( file, initGroupDesc.block_bitmap * 1024 + offset * sizeof( char ), SEEK_SET );
	fwrite( &c, sizeof( char ), 1, file );
	fclose( file );
}

/*!
 * \brief 將內存中的結點“位圖”寫入到磁盤中 * @param inodeBitmap 內存中的結點“位圖” */
void writeInodeBitmap( char inodeBitmap[] )
{
	FILE *file = fopen ( "disk.img", "r+" );
	fseek( file, initGroupDesc.inode_bitmap * 1024, SEEK_SET );
	fwrite( inodeBitmap, sizeof( char ) * 1024, 1, file );
	fclose ( file );
}

/*!
 * \brief 更新磁盤中的索引結點"位圖"的特定“位”的值,將特定的索引結點標記為已使用或者未使用 * @param offset 需要更新的索引結點的結點號 * @param c “位”修改后的值,'0'表示未被使用,'1'表示正在使用 */
void updateInodeBitmap( int offset, char c )
{
	FILE *file= fopen ( "disk.img", "r+" );
	fseek( file, initGroupDesc.inode_bitmap * 1024 + sizeof( char ) * offset, SEEK_SET );
	fwrite( &c, sizeof( char ), 1, file );
	fclose( file );
}

/*!
 * \brief 將索引結點寫入到磁盤中 * @param initInode 需要寫入的索引結點 * @param offset 索引結點的結點號 */
void writeInode( struct inode initInode, int offset )
{
	FILE *file = fopen ( "disk.img", "r+" );
	char i = '1';

	fseek( file, 4 * 1024 + offset * sizeof( struct  inode ), SEEK_SET );
	fwrite( &initInode, sizeof( struct inode ), 1, file );

	fseek( file, 3 * 1024 + offset * sizeof( char ), SEEK_SET );
	fwrite( &i, sizeof( char ), 1, file );
	fclose( file );

	initSuperBlock.free_inodes_count--;
	initGroupDesc.free_inodes_count--;
	writeSuperBlock( initSuperBlock );
	writeGroupDesc( initGroupDesc );
}

/*!
 * \brief 從磁盤中獲取索引結點 * @param offset 索引結點的結點號 * @return 返回一個索引結點 */
struct inode getInode( int offset )
{
	FILE *file = fopen ( "disk.img", "r+" );
	struct inode result;
	fseek( file, 4 * 1024 + offset * sizeof( struct inode ), SEEK_SET );
	fread( &result, sizeof( struct inode ), 1, file );
	fclose( file );
	return result;
}

/*!
 * \brief 將索引結點轉為內存索引結點 * @param node 被轉換的索引結點 * @return 返回一個內存索引結點 */
struct inode_mem inode2InodeMem( struct inode node)
{
	struct inode_mem result;
	result.node = node;
	return result;
}

/*!
 * \brief 將目錄項寫入到磁盤中 * @param dir 被寫入的目錄項 * @param offset 寫入位置相對于寫入塊的起始地址的偏移量 * @param block 目錄項將被寫入的塊的塊號 */
void writeDirEntry( struct dir_entry dir, int offset, int block )
{
	FILE *file = fopen( "disk.img", "r+" );
	fseek( file, block * 1024 + offset, SEEK_SET );
	fwrite( &dir, sizeof( struct dir_entry ), 1, file );
	fclose( file );
	return;
}

/*!
 * \brief 從磁盤中讀取一個目錄項 * @param offset 需要讀的目錄項相對于目錄項所在塊的起始地址的偏移量 * @param block 目錄項所在的塊的塊號 * @return */
struct dir_entry getDirEntry( int offset, int block )
{
	FILE *file = fopen( "disk.img", "r+" );
	struct dir_entry result;
	fseek( file, block * 1024 + offset, SEEK_SET );
	fread( &result, sizeof( struct dir_entry ), 1, file );
	fclose( file );
	return result;
}

/*!
 * \brief 將目錄項寫入到磁盤中
 *
 * 將目錄項寫入到磁盤中,寫入的位置為目錄項的父目錄的子目錄的結尾 * @param father 目錄項的父目錄 * @param dir 需要被寫入的目錄項 */
void addDirEntry( struct dir_entry_mem* father, struct dir_entry dir )
{

	int block = father->inode.node.i_block[ 0 ];
	int offset = 0;
	struct dir_entry tmpDir = getDirEntry( offset, block );

	while( tmpDir.rec_len != 0 )
	{
		offset += tmpDir.rec_len;
		tmpDir = getDirEntry( offset, block );
	}

	tmpDir.rec_len = sizeof( struct dir_entry );
	writeDirEntry( tmpDir, offset, block );
	offset += tmpDir.rec_len;
	writeDirEntry( dir, offset, block );
}

/*!
 *\brief 分配一個空的索引結點 * @return 返回被分配的索引結點的結點號 */
int alloInodeNum()
{
	if( initSuperBlock.free_inodes_count == 0 )
	{
		printf( "%s", "已經沒有空的結點了\n" );
		return -1;
	}

	FILE *file = fopen( "disk.img", "r+" );
	int result = 0;
	fseek( file, initGroupDesc.inode_bitmap * 1024 + result * sizeof( char ), SEEK_SET );
	char c;
	fread( &c, sizeof( char ), 1, file );

	while ( c == '1' )
	{
		result++;
		fseek( file, initGroupDesc.inode_bitmap * 1024 + result * sizeof( char ), SEEK_SET );
		fread( &c, sizeof( char ), 1, file );
	}

	fclose( file );
	return result;
}

/*!
 * \brief 分配一個空的塊 * @return 返回被分配的塊的塊號 */
int alloBlockNum()
{
	if( initSuperBlock.free_blocks_count == 0 )
	{
		printf( "%s", "已經沒有空的塊了\n");
		return -1;
	}

	FILE *file = fopen( "disk.img", "r+" );
	int result = 18;
	fseek( file, initGroupDesc.block_bitmap * 1024 + result * sizeof( char ), SEEK_SET );
	char c;
	fread( &c, sizeof( char ), 1, file );

	while ( c == '1' )
	{
		result ++;
		fseek( file, initGroupDesc.block_bitmap * 1024 + result * sizeof( char ), SEEK_SET );
		fread( &c, sizeof( char ), 1, file );
	}

	char i = '1';
	fseek( file, initGroupDesc.block_bitmap * 1024 + result * sizeof( char ), SEEK_SET );
	fwrite( &i, sizeof( char ), 1, file );
	fclose( file );

	initSuperBlock.free_blocks_count--;
	initGroupDesc.free_blocks_count--;
	writeSuperBlock( initSuperBlock );
	writeGroupDesc( initGroupDesc );
	return result;
}

/*!
 * \brief 檢查指定目錄下是否存在指定名字的文件或者文件夾 * @param father 檢查的目錄 * @param name 檢查的文件名 * @return 返回一個布爾值,若為真,則不存在這樣的文件或文件夾,若否,則存在 */
bool checkName( struct dir_entry_mem father, char* name )
{
	list<dir_entry_mem>::iterator iter = father.children.begin();

	while( iter != father.children.end() )
	{
		if( strcmp( (*iter).dir.name, name ) == 0 )
			return false;
		iter++;
	}

	return true;
}

/*!
 * \brief 檢查在目錄下的添加文件或者文件夾操作是否合法 * @param father 需要被檢查的目錄 * @param name 需要被檢查的文件名 * @return 返回一個布爾值,若為真,則表示目錄的操作可行,若否,則表示不可行 */
bool isValidOp( struct dir_entry_mem father, char* name )
{
	if( father.children.size() >= 10 )
	{
		printf( "%s", "目錄下的文件和文件夾已滿\n" );
		return false;
	}

	if( ! checkName( father, name ) )
	{
		printf( "%s", "目錄下存在同名的文件或者文件夾\n" );
		return false;
	}

	return true;
}

/*!
 * \brief 格式化磁盤 */
void format()
{
	FILE *file = fopen( "disk.img", "r+" );
	char i = 0;
	rewind( file );
	while( ftell( file ) != feof( file ) )
		fwrite( &i, sizeof( char ), 1, file );
	fclose( file );

  initSuperBlock.blocks_count = 1024;
  initSuperBlock.inodes_count = 128;
  initSuperBlock.free_blocks_count = 1006;
  initSuperBlock.free_inodes_count = 128;
  initSuperBlock.log_blocks_size = 1024;
  initSuperBlock.blocks_per_group = 1024;
  initSuperBlock.inodes_per_group = 128;
  memset( initSuperBlock.fill, 0, sizeof( initSuperBlock.fill) );

  initGroupDesc.free_blocks_count = 1024;
  initGroupDesc.free_inodes_count = 128;
  initGroupDesc.block_bitmap = 0x02;
  initGroupDesc.inode_bitmap = 0x03;
  initGroupDesc.inode_table = 0x04;
  char blockBitmap[1024];
  char inodeBitmap[1024];
  memset( blockBitmap, '0', sizeof( blockBitmap ) );
  memset( inodeBitmap, '0', sizeof( inodeBitmap ) );

  struct inode inodeRoot;
  inodeRoot.i_size = 1024;
  inodeRoot.i_blocks = 1;
  inodeRoot.i_ctime = time( NULL );
  inodeRoot.i_atime = inodeRoot.i_ctime;
  inodeRoot.i_mtime = inodeRoot.i_ctime;
  inodeRoot.i_block[ 0 ] = 18;

  for ( int i = 1; i < YAFS_N_BLOCKS; i ++ )
	  inodeRoot.i_block[ i ] = 0;

  struct dir_entry rootDir;
  rootDir.inode = 0;
  rootDir.file_type = 2;
  rootDir.rec_len = 0;
  memset( rootDir.name, 0, sizeof( char ) * YAFS_NAME_LEN );
  strcpy( rootDir.name, "." );

  struct dir_entry rootFather;
  rootFather = rootDir;
  memset( rootFather.name, 0, sizeof( char ) * YAFS_NAME_LEN );
  strcpy( rootFather.name, ".." );
  rootDir.rec_len = sizeof( struct dir_entry );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区香蕉| 99久精品国产| 91年精品国产| 日韩精品在线一区二区| 专区另类欧美日韩| 国产专区欧美精品| 5566中文字幕一区二区电影| 中文字幕免费不卡在线| 裸体健美xxxx欧美裸体表演| 91蝌蚪porny| 日本一区二区三区免费乱视频| 日韩精品视频网站| 欧美视频一区二区三区四区| 国产亚洲综合色| 久久精品国产999大香线蕉| 在线观看国产日韩| 亚洲欧美日韩在线播放| 国产不卡视频在线播放| 日韩亚洲欧美在线| 日韩精品福利网| 欧美日韩久久久一区| 亚洲另类在线一区| 一本一道久久a久久精品综合蜜臀| 欧美国产综合色视频| 韩国av一区二区三区在线观看| 欧美一区二区三区爱爱| 肉肉av福利一精品导航| 欧美视频在线一区二区三区| 一区二区三区中文字幕| 99视频精品全部免费在线| 国产精品久久久久久久久搜平片 | 欧美v亚洲v综合ⅴ国产v| 亚洲成人1区2区| 欧美日韩一区二区在线观看| 夜夜精品视频一区二区 | 国产aⅴ精品一区二区三区色成熟| 91精品国产一区二区| 日欧美一区二区| 4438x成人网最大色成网站| 午夜精品免费在线| 欧美一区二区视频网站| 国内精品视频666| 国产欧美精品区一区二区三区| 福利一区在线观看| 亚洲日本在线视频观看| 日本精品一级二级| 香蕉乱码成人久久天堂爱免费| 欧美疯狂做受xxxx富婆| 麻豆精品久久精品色综合| 久久一夜天堂av一区二区三区| 国产精品自拍av| 亚洲欧美区自拍先锋| 欧美日韩一级黄| 国产尤物一区二区| 亚洲视频小说图片| 制服丝袜激情欧洲亚洲| 国产一区二区三区免费| 亚洲色欲色欲www在线观看| 欧美精选一区二区| 国产在线精品不卡| 亚洲另类在线视频| 精品免费一区二区三区| av资源网一区| 日本色综合中文字幕| 国产三级精品在线| 欧日韩精品视频| 国产一区高清在线| 亚洲综合激情小说| 精品国产区一区| 在线视频国产一区| 国产麻豆欧美日韩一区| 一级精品视频在线观看宜春院 | 欧洲视频一区二区| 黄色小说综合网站| 亚洲午夜一区二区三区| 久久综合五月天婷婷伊人| 91碰在线视频| 国产一区二区三区国产| 亚洲一区二区偷拍精品| 久久精品免费在线观看| 制服丝袜亚洲网站| 91黄视频在线| 国产91色综合久久免费分享| 香蕉加勒比综合久久| 国产精品久久久久9999吃药| 日韩一二三四区| 欧美日韩亚洲综合在线| 99久久久免费精品国产一区二区 | 精品人在线二区三区| 色综合网色综合| 丁香婷婷综合五月| 久久se精品一区精品二区| 亚洲午夜一区二区| 中文字幕一区二区三区四区| 精品国产99国产精品| 欧美美女视频在线观看| 欧美亚洲图片小说| 色综合天天天天做夜夜夜夜做| 极品尤物av久久免费看| 日韩一区欧美二区| 天堂一区二区在线免费观看| 亚洲精品伦理在线| 亚洲欧美偷拍卡通变态| 国产精品久久三| 国产精品毛片高清在线完整版 | 欧美日韩国产免费一区二区 | 一区二区三区精品视频| 国产精品色哟哟| 国产网站一区二区| 国产亚洲成av人在线观看导航| 日韩欧美国产精品| 亚洲精品一区在线观看| 欧美成人video| 欧美电影免费观看高清完整版在线观看 | 欧美日韩国产美女| 欧美日韩国产区一| 在线综合视频播放| 欧美一二三在线| 欧美α欧美αv大片| 欧美精品一区二区三区蜜臀| 精品人伦一区二区色婷婷| 精品久久久久久亚洲综合网| 精品国产伦一区二区三区观看体验| 日韩欧美国产一二三区| 26uuu亚洲| 国产精品理论片| 亚洲品质自拍视频网站| 亚洲成人中文在线| 蜜桃在线一区二区三区| 国产老肥熟一区二区三区| 成人精品电影在线观看| 在线观看国产一区二区| 欧美一区二区女人| 国产欧美日韩在线| 亚洲老司机在线| 婷婷综合久久一区二区三区| 激情综合五月天| 成人激情黄色小说| 欧美日韩高清一区二区| 精品福利av导航| 日韩一区在线看| 五月婷婷另类国产| 国产一区二区不卡老阿姨| 成人av网站免费| 欧美精品在线观看播放| 一级精品视频在线观看宜春院 | 国产视频一区在线观看 | 国产日产亚洲精品系列| 亚洲一区二区三区四区在线观看 | 五月综合激情网| 国产99精品国产| 欧美日韩国产大片| 久久精品人人爽人人爽| 夜夜嗨av一区二区三区网页| 久久国产生活片100| 色www精品视频在线观看| 精品少妇一区二区三区在线播放| 中文字幕av资源一区| 日韩avvvv在线播放| av电影在线不卡| 日韩免费观看高清完整版 | 久久综合色鬼综合色| 一区二区三区日韩精品视频| 国内外成人在线| 欧美美女视频在线观看| 成人免费在线视频| 国产一区二区三区久久悠悠色av| 欧美三日本三级三级在线播放| 日本一区二区三区高清不卡 | 欧美成人精品高清在线播放| 亚洲一区二区欧美激情| 国产69精品久久99不卡| 日韩一二三区视频| 亚洲成人自拍一区| 91丨porny丨在线| 国产欧美一区在线| 激情综合网av| 日韩一级黄色大片| 亚洲va国产天堂va久久en| 成人动漫在线一区| 久久婷婷色综合| 久久99热这里只有精品| 91麻豆精品国产自产在线| 一区二区久久久久| 91亚洲精品久久久蜜桃| 国产精品看片你懂得| 国产91精品入口| 国产精品无遮挡| 国产91丝袜在线播放0| 欧美激情综合在线| 成人免费毛片嘿嘿连载视频| 久久综合久久综合亚洲| 国产在线精品一区二区三区不卡 | 亚洲乱码国产乱码精品精可以看| 豆国产96在线|亚洲| 久久精品人人做人人综合| 国产酒店精品激情| 中文字幕第一区二区| 成人免费黄色大片| 亚洲国产精品精华液2区45|