1、#define ROOT_DISK_SIZE sizeof(struct Direct) /根目录大小 196#define LOGIN 15#define NAME_LONG 1#define NOT_EXSIT -1#define NOT_OPEN -1#define DIR_FULL -2#define OPEN_FULL -3#define ALREADY -4 #define NOT_R_W -4#define DISK_FULL -5#define NOT_EXIT -1struct FatItem / size 8 int item; /存放文件下一个磁盘的指针 char em_
2、disk; /磁盘块是否空闲标志位, 0 空闲;struct Direct struct FCB char name8; /文件/目录名 8位 char property; /属性 1位目录 0位普通文件 int size; /文件/目录字节数、盘块数) int firstDisk; /文件/目录 起始盘块号 int next; /子目录起始盘块号 int sign; /1是根目录 0不是根目录 directItemMSD+2; /最大子目录 5 ;struct OpenTable struct OpenTableItem char name9; /文件名 int firstdisk; /起始
3、盘块号 /文件的大小 char open_flag; /文件打开标志:1:打开。0未打开 openitemMOFN; /最大文件打开数 5 int cur_size; /当前打文件的数目struct FatItem *fat; /FAT表struct Direct *root; /根目录struct Direct *cur_dir; /当前目录struct OpenTable user_openTable; /文件打开表int fd=-1; /文件打开表的序号char *bufferdir; /记录当前路径的名称char *fdisk; /虚拟磁盘起始地址int cur_user;int fi
4、nd_N = 0;void init();void format();void enter();void assign();int create(char *name);int open(char *name);int close(char *name);int rename();int write(int fd,char *buf,int len,char *name);int read(int fd,char *buf,char *name);int del(char *name);void dir();int login();void helpMenu();void currentPat
5、h();2、FileSystem.cpp#includestdlib.h#includeconio.h#include FileSystem.hstring.hint statue=0;char user20=li;char password20=123int main() FILE *fp; char ch;char cmd13; char name10; int i,flag; char *contect; helpMenu(); while(flag=login()!=LOGIN) printf(密码不正确!n); printf(请输入正确的用户名和密码! contect = (char
6、 *)malloc(MAX_WRITE*sizeof(char); if(fp=fopen(disk.bat,rb)=NULL) /创建一个文件 Will you initialize the disk? (y or n) scanf(%s,&ch); if(ch=y) init(); printf( Initialize Succeed! n else return 0; enter(); /分析命令 while(1)%s/,bufferdir);,cmd); if(strcmp(cmd,help) = 0 | strcmp(cmd,?) = 0) helpMenu(); else if(s
7、trcmp(cmd,model printf(需要修改密码么(y/n) scanf( if (ch= printf(请输入密码b scanf(password); printf(修改成功 else printf(退出修改密码n login while (login()!请输入正确的用户名或密码n else if(strcmp(cmd,quit free(contect); exit(1); return 0;create) = 0) scanf(,name); flag = create(name); /关于创建文件共实现四个判断 if(flag=NAME_LONG) /文件名太长Error:
8、 n 文件的名称太长 ! else if(flag=DIR_FULL) /目录下文件数超 n 该目录下的文件和目录数已满 ! else if(flag=ALREADY) /重名 n 该目录下已存在该文件 ! else if(flag=DISK_FULL) /磁盘空间满 n 磁盘空间已满! 成功创建文件!open) =0) statue=1; fd = open(name); if(fd = NOT_EXSIT) n 所要打开的文件不存在!打开成功!write statue=2; if(fd = NOT_OPEN) n 该文件没有打开,请打开后再写入 n 请输入文件的内容: ,contect);
9、 /connect为一个长度为128字节的变量值 flag=write(fd,contect,strlen(contect),name); if(flag = 0) /每个盘块可写入最多128字节 printf(已成功写入! elsen 硬盘空间不足,无法写入!read statue=3;n 不存在该文件,不能读! else if (fd = NOT_OPEN) 该文件已经打开! flag = read(fd,contect,name); if(flag = 0) for(i=0;i=MOFN)n 该文件没有打开,无需关闭! /清空该文件的用户打开表项 strcpy(user_openTabl
10、e.openitemi.name, user_openTable.openitemi.firstdisk = -1; user_openTable.openitemi.size = 0; user_openTable.openitemi.open_flag = user_openTable.cur_size-;close success! continue; else if (strcmp(cmd,rename if (statue=1)打开文件不能重命名 else%d,statue); flag=rename(); if (flag=NOT_EXIT)文件不存在n else n 指令错误!i
11、nt login() char inuser20; char inpassword20; int j=0; printf(请输入用户名n scanf(,inuser); while(strcmp(inuser,user)!=0)该用户不存在!*n请输入正确的用户名:请输入密码n while(ch=getch()!=13) /将输入的密码转换成字符* putchar(* inpasswordj=ch; j+; inpasswordj=0 /字符数组的最后一位为,故要加该语句 /printf(您输入的密码是:,inpassword); getchar(); if (strcmp(inuser,us
12、er)=0)&(strcmp(inpassword,password)=0) bufferdir=wang return LOGIN; else return 0;void init() fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char); /分配空间void format() int i; FILE *fp; fat = (struct FatItem *)(fdisk+DISKSIZE); /FAT 1M /*-初始化FAT表 fat1-fat7-*/ for(i=1;ROOT_DISK_NO-1;i+) /for(i=1;8; fati.item
13、=i+1; fati.em_disk= for(i=ROOT_DISK_NO;DISK_NUM;i+) /for(8;1024; fati.item = -1; /item为-1即表示还没有使用 fati.em_disk = root = (struct Direct *)(fdisk+DISKSIZE+FATSIZE); /根目录的地址 1k+8k root-directItem0.sign = 1;directItem0.firstDisk = ROOT_DISK_NO ; / = 9; /第9个盘块开始 strcpy(root-directItem0.name,. /定义其文件名为 .d
14、irectItem0.next = root-directItem0.firstDisk; /子目录的起始盘块是根目录所在第一个盘块,即未出 /第一块directItem0.property = /1根目录directItem0.size = ROOT_DISK_SIZE; /即一个根目录项的空间大小 196字节 /*指向上一级目录的目录项-回指指针*/directItem1.sign = 1;directItem1.firstDisk = ROOT_DISK_NO;directItem1.name,.directItem1.next = root-directItem1.property =
15、 directItem1.size = ROOT_DISK_SIZE; for(i=2;MSD+2; /子目录最大只有5个表项 root-directItemi.sign = 0;directItemi.firstDisk = -1; strcpy(root-directItemi.name,directItemi.next = -1;directItemi.property = directItemi.size = 0; if(fp = fopen(wb)=NULL)n Cant Open The File n return; /虚拟到物理 if(fwrite(fdisk,MEM_D_SIZ
16、E,1,fp)!=1) n 文件写入错误! fclose(fp);void enter() /重新回到初始空间-虚拟中操作 /申请 1M空间 /判断disk文件是否存在 if(fp=fopen(n 打开文件出错! if(!fread(fdisk,MEM_D_SIZE,1,fp) /把磁盘文件disk.dat 读入虚拟磁盘空间(内存) /回到新申请的fdisk中n 不能读文件! exit(0); /最多能打开5个文件 for(i=0; strcpy(user_openTable.openitemi.name, user_openTable.openitemi.firstdisk = -1; us
17、er_openTable.openitemi.size = 0; user_openTable.cur_size = 0; cur_dir = root; bufferdir = (char *)malloc(DIR_LENGTH*sizeof(char); strcpy(bufferdir,Root:int create(char *name) int i,j; /文件名超过8字符 if(strlen(name)8) /文件名大于 8位 return(NAME_LONG); /重名check for(j=2;jdirectItemj.name,name) & cur_dir-directItemj.pro
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1