?? dfop.c
字號(hào):
#include "stdio.h"
#include "conio.h"
struct filesys_superblk
{ /*文件系統(tǒng)的分區(qū)信息,存放在0#物理塊中*/
unsigned long fs_size; /*整個(gè)分區(qū)的總磁盤物理塊數(shù) */
unsigned long fs_freesize; /*分區(qū)的所有空閑磁盤物理塊數(shù) */
unsigned int fs_blocksize; /*文件系統(tǒng)的物理塊大小(字節(jié))*/
unsigned int fs_fat_start; /*FAT的起始磁盤物理塊號(hào) */
unsigned int fs_fat_size; /*FAT占用的磁盤物理塊數(shù)*/
unsigned int fs_dir_start; /*根目錄的起始磁盤物理塊號(hào)*/
unsigned int fs_dir_size; /*根目錄占用的磁盤物理塊數(shù)*/
unsigned int fs_data_start; /*數(shù)據(jù)區(qū)起始磁盤物理塊號(hào)*/
unsigned long fs_data_size; /*數(shù)據(jù)區(qū)的磁盤物理塊數(shù)*/
};
struct FILE_FCB
{ /*文件控制塊結(jié)構(gòu) */
char f_name[16]; /*文件名(16B)*/
short f_mode; /*文件屬性,-1表示未用 0表示目錄 1表示文件*/
unsigned int f_asize; /*文件分配的大?。ㄎ锢韷K數(shù))*/
unsigned long f_rize; /*文件占用的實(shí)際大?。ㄗ止?jié))*/
unsigned long f_addr; /*文件分配的第一個(gè)物理塊的塊號(hào)*/
unsigned int f_ctime; /*文件創(chuàng)建時(shí)間*/
unsigned int f_mtime; /*文件修改時(shí)間*/
};
struct open_file
{ /*當(dāng)前正在操作文件的幾個(gè)FCB數(shù)據(jù)項(xiàng) */
char f_name[12] ; /*文件名(16B) */
unsigned int f_asize; /*文件分配的大小(物理塊數(shù))*/
unsigned long f_rize; /*文件占用的實(shí)際大?。ㄗ止?jié))*/
unsigned long f_addr; /*文件分配的第一個(gè)物理塊的塊號(hào)*/
};
FILE *filesystem_p; /* 文件系統(tǒng)分區(qū)對(duì)應(yīng)的磁盤文件指針,系統(tǒng)運(yùn)行后文件一直打開,退出系統(tǒng)時(shí)關(guān)閉文件,所有的模擬文件系統(tǒng)操作都在此文件上進(jìn)行。*/
static struct filesys_superblk DiskInfo;/*文件系統(tǒng)的管理信息,系統(tǒng)運(yùn)行時(shí)一直存放在內(nèi)存,提供文件系統(tǒng)操作的參數(shù);*/
static struct FILE_FCB filedir[16]; /*臨時(shí)存放讀取的文件目錄,大小可以自己決定,但至少能夠存儲(chǔ)一個(gè)物理塊的信息,這里設(shè)置的是存儲(chǔ)一個(gè)物理塊的目錄項(xiàng)(實(shí)際的計(jì)算為:fs_blocksize/sizeof(struct FILE_FCB),這里是512/32=16,所以設(shè)置數(shù)組大小為16,也可以設(shè)為32,48,64等),在進(jìn)行建立文件/目錄、刪除文件/目錄、顯示文件/目錄、復(fù)制等文件操作時(shí),都首先將當(dāng)前讀出的目錄信息放到這里,然后進(jìn)行處理,處理完成后再讀取后面的信息再進(jìn)行處理,為簡(jiǎn)化處理,自己也可以把數(shù)組設(shè)置的比較大或采用動(dòng)態(tài)鏈表的方式存儲(chǔ)讀出的目錄信息。*/
static long fat[128]; /* 存放讀入內(nèi)存的FAT表信息,這里僅設(shè)置讀取一個(gè)物理塊的FAT數(shù)據(jù),自己可以設(shè)置的大一些,在進(jìn)行許多文件操作時(shí)都設(shè)計(jì)FAT的操作,設(shè)置小的時(shí)候可能要多次讀取FAT區(qū),大的時(shí)候少一些,也可以采用動(dòng)態(tài)內(nèi)存分配的方式,在系統(tǒng)啟動(dòng)時(shí)將整個(gè)FAT全部裝入內(nèi)存(FAT項(xiàng)數(shù)的計(jì)算公式為:fs_fat_size*256)。FAT的值定義如下:0為鏈的結(jié)束,-1為未使用,其它正值為鏈指針,這里未表示出壞的物理塊,可以自己根據(jù)需要添加。*/
static struct open_file sysopen_file; /* 系統(tǒng)打開文件數(shù)據(jù)結(jié)構(gòu),理論上應(yīng)該是數(shù)組 */
static char ReadBuffer[512]; /*讀數(shù)據(jù)緩沖區(qū);用于讀磁盤數(shù)據(jù)時(shí)的數(shù)據(jù)存儲(chǔ) */
static char WriteBuffer[512]; /*寫數(shù)據(jù)緩沖區(qū);用于寫磁盤數(shù)據(jù)時(shí)的數(shù)據(jù)存儲(chǔ)*/
/*分區(qū)的管理信息到內(nèi)存DiskInfo結(jié)構(gòu), 管理信息在格式化時(shí)存儲(chǔ)到FilesysInfo.dat 開始位置,即0#物理塊的開始處*/
void read_fs_superinfo()
{ /*首先定位到文件開始處,然后直接讀取 */
rewind(filesystem_p);
fread(&DiskInfo,sizeof(struct filesys_superblk),1, filesystem_p);
return;
}
/*建立文件系統(tǒng)對(duì)應(yīng)的分區(qū)文件FilesysInfo.dat,其中要求指出分區(qū)大小和物理塊大小,也可以為簡(jiǎn)單起見,大小設(shè)置為512B,這里2個(gè)都要指出 */
void create_fs_sector()
{ /* 首先輸入分區(qū)大小(單位是KB)和塊大小(單位是B),然后計(jì)算需要向
分區(qū)文件FilesysInfo.dat里寫入的數(shù)據(jù)塊數(shù),執(zhí)行寫操作;數(shù)據(jù)塊數(shù)的計(jì)公式為:物理塊數(shù)=分區(qū)大小/塊大小 */
int i;
unsigned long disksize;
unsigned int blocksize;
unsigned long blknumber;
long blkbuffer[256]; /* 1KB大小的緩沖區(qū) */
for(i=0;i<256;i++) blkbuffer=0; /* 緩沖區(qū)賦0值 */
printf("\n please input size of disk: "); /*輸入分區(qū)大小*/
scanf("%lu", &disksize);
printf("\n please input size of block: "); /*輸入物理塊大小 如果固定大小512B則不需要輸入*/
scanf("%u", & blocksize);
rewind(filesystem_p);
for(i=0;i fwrite(blkbuffer,1024,1,filesystem_p); /* 向文件FilesysInfo.dat里寫入的數(shù)據(jù),建立disksize KB 大小的分區(qū)*/
blknumber=( disksize*1024)/ blocksize ; /*計(jì)算整個(gè)分區(qū)的總物理塊數(shù) */
DiskInfo.fs_size= blknumber; /*設(shè)置分區(qū)信息*/
DiskInfo.fs_freesize =blknumber;
DiskInfo.fs_blocksize= blocksize;
/* 更新磁盤分區(qū)信息到 FilesysInfo.dat*/
rewind(filesystem_p);
fwrite(&DiskInfo,sizeof(struct filesys_superblk),1, filesystem_p);
return;
}
void format_fs_sector()
{ /* 通過分區(qū)大小和物理塊大小計(jì)算出總物理塊數(shù),由此確定需要FAT的項(xiàng)數(shù),進(jìn)而計(jì)算出FAT區(qū)的大小(物理塊數(shù)),最后填寫DiskInfo數(shù)據(jù)結(jié)構(gòu),并寫回FilesysInfo.dat文件,在本例中,根目錄128項(xiàng),F(xiàn)CB占32B,所以根目錄區(qū)大小為128*32B ;另外,0#物理塊作為管理信息塊,所以實(shí)際能夠分配的物理塊從1#開始 */
long temp,i;
unsigned int dirsize;
unsigned int fatsize;
unsigned long blknumber;
/*系統(tǒng)總物理塊數(shù)*/
blknumber =DiskInfo.fs_size;
/*計(jì)算FAT需要占用的物理塊數(shù) */
fatsize= (blknumber*4)/DiskInfo.fs_blocksize + 1;
/*計(jì)算根目錄需要占用的物理塊數(shù) */
dirsize= 128*32/DiskInfo.fs_blocksize;
/*重新設(shè)置分區(qū)的管理信息結(jié)構(gòu)*/
DiskInfo.fs_freesize= blknumber- fatsize - dirsize - 1; /*總空閑物理塊數(shù)*/
DiskInfo.fs_fat_start =1; /*FAT的起始磁盤物理塊號(hào)*/
DiskInfo.fs_fat_size=fatsize; /*FAT占用的磁盤物理塊數(shù)*/
DiskInfo.fs_dir_start=fatsize+1; /*根目錄的起始物理塊號(hào)*/
DiskInfo.fs_dir_size=dirsize; /*根目錄占用的物理塊數(shù)*/
DiskInfo.fs_data_start=fatsize+dirsize+1;/*數(shù)據(jù)區(qū)起始磁盤物理塊號(hào)*/
DiskInfo.fs_data_size= blknumber- fatsize - dirsize-1; /*數(shù)據(jù)區(qū)的磁盤物理塊數(shù)*/
/* 格式化FAT, 直接寫-1*/
temp=-1;
fseek(filesystem_p,DiskInfo.fs_blocksize,0); /* 定位到1#*/
for(i=0;i fwrite(&temp,4,1,filesystem_p);
/* 格式化DIR區(qū), 屬性值為-1*/
filedir[0].f_mode=-1;
fseek(filesystem_p,DiskInfo.fs_dir_start*DiskInfo.fs_blocksize,0); /* 定位*/
for(i=0;i fwrite(&filedir[0],32,1,filesystem_p);
/* 更新磁盤分區(qū)信息到 FilesysInfo.dat*/
rewind(filesystem_p);/* 定位到文件開始處*/
fwrite(&DiskInfo,sizeof(struct filesys_superblk),1, filesystem_p);
return;
}
void filesys_init()
{ if((filesystem_p =fopen("Filesys.dat","rb+"))==NULL) /*文件存在?*/
{
/*不存在,建立模擬文件系統(tǒng)的數(shù)據(jù)文件FilesysInfo.dat*/
if((filesystem_p =fopen("Filesys.dat","wb+"))==NULL)
{ /*不能建立數(shù)據(jù)文件FilesysInfo.dat,結(jié)束程序*/
printf("\nerror on open Filesys.dat!");getch();exit(1);
}
/*能建立數(shù)據(jù)文件Filesys.dat,則由分區(qū)大小和物理塊大小真正建立文件系統(tǒng)分區(qū)*/
create_fs_sector(); /*建立文件系統(tǒng)分區(qū)*/
format_fs_sector();/*格式化文件系統(tǒng)分區(qū)*/
}
read_fs_superinfo();/*取文件系統(tǒng)分區(qū)的管理信息到內(nèi)存的DiskInfo中;*/
}
/* 讀物理塊到緩沖區(qū) */
read_block(long num, char *buf)
{
fseek(filesystem_p,num*DiskInfo.fs_blocksize,0); /* 定位num號(hào)物理塊到在文件中的位置*/
fread(&buf, DiskInfo.fs_blocksize ,1, filesystem_p); /* 讀物理塊到內(nèi)存緩沖區(qū)*/
}
/* 寫緩沖區(qū)數(shù)據(jù)到物理塊 */
write_block(long num, char *buf)
{
fseek(filesystem_p,num*DiskInfo.fs_blocksize,0); /*定位num號(hào)物理塊到在文件中的位置*/
fwrite(&buf, DiskInfo.fs_blocksize ,1 , filesystem_p); /* 寫內(nèi)存緩沖區(qū)到物理塊*/
}
main()
{
filesys_init();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -