• 大小: 26KB
    文件类型: .c
    金币: 2
    下载: 1 次
    发布日期: 2021-06-23
  • 语言: C/C++
  • 标签: EXT2  linux  文件系统  

资源简介

用文件仿硬盘的C语言程序——模仿linux下的EXT2文件系统,类EXT2文件系统

资源截图

代码片段和文件信息

#define DATA_BLOCK 263680
#define BLOCK_SIZE 512
#define DISK_START 0
#define BLOCK_BITMAP 512
#define INODE_BITMAP 1024
#define INODE_TABLE 1536
#define INODE_SIZE 64
#include 
#include 
#include 
#include 


struct group_desc{
    char bg_volume_name[16]; /*卷名*/
    unsigned short bg_block_bitmap; /*保存块位图的块号*/
    unsigned short bg_inode_bitmap; /*保存索引结点位图的块号*/
    unsigned short bg_inode_table; /*索引结点表的起始块号*/
    unsigned short bg_free_blocks_count; /*本组空闲块的个数*/
    unsigned short bg_free_inodes_count; /*本组空闲索引结点的个数*/
    unsigned short bg_used_dirs_count; /*本组目录的个数*/
    char bg_pad[4]; /*填充(0xff)*/
};
struct inode{
    unsigned short i_mode; /*文件类型及访问权限*/       
    unsigned short i_blocks; /*文件的数据块个数*/
    unsigned long i_size; /*大小( 字节)*/
    unsigned long i_atime; /*访问时间*/
    unsigned long i_ctime; /*创建时间*/
    unsigned long i_mtime; /*修改时间*/
    unsigned long i_dtime; /*删除时间*/
    unsigned short i_block[8]; /*指向数据块的指针*/
    char i_pad[24]; /*填充(0xff)*/
};
struct dir_entry{   //目录项结构
    unsigned short inode; /*索引节点号*/
    unsigned short rec_len; /*目录项长度*/
    unsigned short name_len; /*文件名长度*/
    char file_type; /*文件类型(1: 普通文件, 2: 目录.. )*/
    char name[9]; /*文件名*/
};

char Buffer[512];  //针对数据块的 缓冲区
char tempbuf[4097]; //
unsigned char bitbuf[512]; //位图缓冲区
unsigned short index_buf[256];
short fopen_table[16]; //  文件打开表
unsigned short last_alloc_inode; //  最近分配的节点号
unsigned short last_alloc_block; //  最近分配的数据块号
unsigned short current_dir;   //      当前目录的节点号
struct group_desc super_block[1]; //   组描述符缓冲区
struct inode inode_area[1];  //   节点缓冲区
struct dir_entry dir[32];   //  目录项缓冲区
char current_path[256];    //    当前路径名
unsigned short current_dirlen;
FILE *fp;


/*************************************        alloc          *******************************************************/


void update_group_desc()
{
    fseek(fpDISK_STARTSEEK_SET);
    fwrite(super_blockBLOCK_SIZE1fp);
}
void reload_group_desc()//载入组描述符
{
    fseek(fpDISK_STARTSEEK_SET);
    fread(super_blockBLOCK_SIZE1fp);
}
void update_inode_bitmap()//更新inode位图 
{
    fseek(fpINODE_BITMAPSEEK_SET);
    fwrite(bitbufBLOCK_SIZE1fp);
}
void reload_inode_bitmap()//载入inode位图 
{
    fseek(fpINODE_BITMAPSEEK_SET);
    fread(bitbufBLOCK_SIZE1fp);
}
void update_block_bitmap()//更新block位图 
{
    fseek(fpBLOCK_BITMAPSEEK_SET);
    fwrite(bitbufBLOCK_SIZE1fp);
}
void reload_block_bitmap()//载入block位图 
{
    fseek(fpBLOCK_BITMAPSEEK_SET);
    fread(bitbufBLOCK_SIZE1fp);
}
void update_inode_entry(unsigned short i)//更新第i个inode入口 
{
    fseek(fpINODE_TABLE+(i-1)*INODE_SIZESEEK_SET);
    fwrite(inode_areaINODE_SIZE1fp);
}
void reload_inode_entry(unsigned short i)//载入第i个inode入口
{
    fseek(fpINODE_TABLE+(i-1)*INODE_SIZESEEK_SET);
    fread(inode_areaINODE_SIZE1fp);
}

void reload_dir(unsigned short i)//更新第i个目录 
{
    fs

评论

共有 条评论