操作系统课程设计文件系统模拟毕业设计(论文)word格式.doc
《操作系统课程设计文件系统模拟毕业设计(论文)word格式.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计文件系统模拟毕业设计(论文)word格式.doc(46页珍藏版)》请在三一办公上搜索。
1、操作系统课程设计-文件系统模拟默认分类 2010-01-10 16:51:02 阅读102 评论0 字号:大中小 设计内容:在Windows 2000/XP环境下,在U盘上创建一个数据文件来模仿微型计算机磁盘存储器,在此基础上建立磁盘文件系统。要求模拟编写完成模拟链接存储结构文件系统的一个文件复制命令(要求可以单个和成批复制文件)。#include #include #include #include #define NAMELENGTH 21 /文件名的最大长度#define MAXFILE 20 /最大能拥有的文件个数#define PATH G:disk.txt /当作磁盘的文件disk
2、.txt保存路径#define INT_NUM 250 /位示图有INT_NUM个int单元,这里可保存250 * 32 = 8000个记录块using namespace std;class FCB/文件控制块类public:FCB(char *filename = NULL, int ID = -1, int p = -1, int inum = 0);void Setfilename(char *filename);void SetID(int ID);void Setfp(int fp);void Setnotenum(int inum = 0); /设置inotenum int Ge
3、tnotenum(); /返回inotenumvoid Notenum_addone(); /inotenum加1char* Getfilename();int GetID();int Getfp();private: char sFilenameNAMELENGTH; /文件名 int iID; /ID号 int fp; /头指针 int inotenum; /占用记录块个数;FCB:FCB(char *filename, int ID, int p, int inum) /构造函数if (filename != NULL)strcpy(sFilename, filename);elsest
4、rcpy(sFilename, *);iID = ID;fp = p;inotenum = inum;void FCB:Setnotenum(int inum) /设置该文件已占用的文件记录块数,默认形参值为0 inotenum = inum;void FCB:Notenum_addone() /该文件已占用的记录块数加1inotenum +;int FCB:Getnotenum() /返回该文件已占用的记录块数return inotenum;char* FCB:Getfilename()/ 返回文件名return sFilename;int FCB:GetID()/返回文件ID号return
5、 iID;int FCB:Getfp()/返回文件头指针return fp;void FCB:Setfilename(char *filename) /设置文件名if (filename != NULL)strcpy(sFilename, filename);elsesFilename0 = 0;void FCB:SetID(int ID) /设置IDiID = ID;void FCB:Setfp(int p) /设置fpfp = p;class Filenoteblock /文件记录块类public: char scontent10; /内容 int next; /块指针;class FCB
6、Table /文件控制块表类public:FCBTable();int Search_free_note(unsigned &uflag, unsigned &n); /返回可用块地址void Setbitmap(unsigned uflag, unsigned n); /修改位示图, 占有空闲块void Freebitmap(int ip); /修改位示图, 释放空间FCB stTableMAXFILE; /文件控制块表int iFilenum; /已有文件控制块int iusednum; /已占用的记录块数private: int ibitmapINT_NUM; /位示图, 最多可存入IN
7、I_NUM * 32个记录块;FCBTable:FCBTable() /构造函数int i, n, mod, k, j;unsigned uflag;iFilenum = 0; /初始化为0 iusednum = 0;for (i=0; iINT_NUM; i+) ibitmapi = 0;/将位示图的前n位置为1, dist.txt文件的前n个记录块用来存放文件控制块表 n = sizeof(FCBTable) / sizeof(Filenoteblock);if (sizeof(FCBTable) % sizeof(Filenoteblock) != 0)n +;i = n / 32;mo
8、d = n % 32;if (mod != 0)/不能整除 i +; for (k=0; ki-1; k+) uflag = 1;for (j=0; j32; j+) ibitmapk = ibitmapk | uflag; uflag = uflag 1; uflag = 1; for (j=0; jmod; j+) ibitmapi-1 = ibitmapi-1 | uflag; uflag = uflag 1; else /整除for (k=0; ki; k+)uflag = 1;for (j=0; j32; j+) ibitmapk = ibitmapk | uflag;uflag =
9、 uflag 1;void FCBTable:Setbitmap(unsigned uflag, unsigned n) /修改位示图,占有空闲块ibitmapn = ibitmapn | uflag;void FCBTable:Freebitmap(int ip) /释放空间 unsigned uflag; int i, j, k;i = ip / 32;j = ip % 32;uflag = 1;for (k=0; kj; k+)uflag = uflag * 2; uflag = uflag; ibitmapi = ibitmapi & uflag;int FCBTable:Search
10、_free_note(unsigned &uflag, unsigned &n) /寻找空闲块unsigned i, j;for (i=0; i250; i+)n = i;uflag = 1;for (j=0; j32; j+) if (ibitmapi & uflag) = 0) return (i * 32 + j); uflag = uflag 1;return -1;/寻找空闲的文件控制块, 若找到返回其它位置,否则返回-1int Search_free_FCB(FCBTable ftable) int i; for (i=0; iMAXFILE; i+) if (strcmp(fta
11、ble.stTablei.Getfilename(), *) = 0) return i; return -1;int Createfile(FCBTable &ftable, char *filename)/创建一个文件 int Fileexist(FCBTable ftable, char *name); FILE *fp; char buff10, c; int i, ip1, ip2; int iFCBlocate; /标记某文件在文件控制块表中的位置或空闲块位置 bool bFirsttime; Filenoteblock note1, note2; /文件记录块 unsigned
12、uflag, n; if (filename = NULL) cout无文件名, 文件创建失败!endl; return -1; if (Fileexist(ftable, filename) != -1) cout文件 filename 已存在, 创建失败!endl; return -1; if (ftable.iFilenum = MAXFILE -1) cout打开文件数已达到最大数量,文件创建失败!endl; return -1; if (ftable.Search_free_note(uflag, n) = -1) /判断是否还有一空闲块 cout无空闲空间, 文件创建失败!endl
13、; return -1; if (fp = fopen(PATH, rb+) = NULL) /打开作为磁盘的文件 if (fp = fopen(PATH, wb) = NULL) cout文件创建失败!endl; return -1; fclose(fp); if (fp = fopen(PATH, rb+) = NULL) cout文件创建失败!endl; return -1; iFCBlocate = Search_free_FCB(ftable); /找到一个空闲块,上面保证了有 ftable.stTableiFCBlocate.Setfilename(filename); /注册文件
14、名 ftable.stTableiFCBlocate.SetID(iFCBlocate);/注册文件ID cout 下面请输入文件内容, 以 # 结束文件输入: endl; fflush(stdin); c = getchar(); i = 0; bFirsttime = 1; ip1 = 0; while (c != #) buffi = c; if (i = 9) if (ip1 = ftable.Search_free_note(uflag, n) != -1) /寻找一个空闲块 ftable.Setbitmap(uflag, n);ftable.iusednum +;ftable.st
15、TableiFCBlocate.Notenum_addone(); /此文件占用记录块加1, 构造函数初始化其为0 else cout外部空间已满, 不能再保存数据!endl;break; if (bFirsttime = 1)ftable.stTableiFCBlocate.Setfp(ip1); /设置头指针elsenote2.next = ip1;fseek(fp, ip2 * sizeof(Filenoteblock), 0);fwrite(¬e2, sizeof(Filenoteblock), 1, fp);strcpy(note1.scontent, buff); note2
16、 = note1;ip2 = ip1;i = 0; bFirsttime = 0; /if else i +; c = getchar(); /while /因无空闲块而退出循环,将上一块数据保存.上面已保证至少有一块空闲块 if (ip1 = -1) note2.next = -1; fseek(fp, ip2 * sizeof(Filenoteblock), 0); fwrite(¬e2, sizeof(Filenoteblock), 1, fp); fclose(fp); ftable.iFilenum +; return 1; /不是因为无空闲块而退出循环 if (i != 0)
17、 /不刚好为10个字符 if (ip1 = ftable.Search_free_note(uflag, n) != -1) /寻找一个空闲块, 且有 ftable.Setbitmap(uflag, n); ftable.iusednum +; ftable.stTableiFCBlocate.Notenum_addone(); /此文件占用记录块加1 strcpy(note1.scontent, buff); note1.scontenti = 0; if (bFirsttime = 1) /第一个记录块 ftable.stTableiFCBlocate.Setfp(ip1); /设置头指针
18、 note1.next = -1; fseek(fp, ip1 * sizeof(Filenoteblock), 0); fwrite(¬e1, sizeof(Filenoteblock), 1, fp); else /不为第一个记录块 /将上一块写入disk.txt文件 note2.next = ip1; fseek(fp, ip2 * sizeof(Filenoteblock), 0); fwrite(¬e2, sizeof(Filenoteblock), 1, fp); /将最后一块写入disk.txt文件 note1.next = -1; fseek(fp, ip1 * s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 文件系统 模拟 毕业设计 论文 word 格式
链接地址:https://www.31ppt.com/p-4024816.html