本文续接上篇:简单模拟操作系统中的文件操作(1)!
下面给出实现的代码:
自定义头文件:
/*Author:WangXiaowei;Date:2012-06-19;Address:石家庄经济学院信息工程学院。*/
/*Explain:操作系统课程设计的题目7《文件操作》的头文件。*/
/*Take care:本程序中的管理员登录方式下的用户名为:administer,密码为:123456.*/
/*由于本程序的下面用到了延时函数Sleep(),所以本程序开始运行(初始化数据)时有点缓慢,请耐心等待。*/
#define CMD 12
//命令的最大长度为CMD
#define N 6
//MFD最大为N栏
#define L 8
//UFD最大为L栏
#define S 5
//UOF最大为S栏
#define F 1000
//文件目录表FAT的最长空间
#define UNL 16
//用户名的最大长度
#define FNL 15
//文件名的最大长度
#define FAT int
//FAT即为int
typedef struct MFD
{
char user_name[UNL];
char ufd_add[FNL];
char uof_add[FNL];
}MFD;
//主文件目录表
typedef struct UFD
{
char file_name[FNL];
int file_pow;
int record_len;
int file_add;
}UFD;
//用户文件目录表
typedef struct UOF
{
char file_name[FNL];
int file_pow;
int record_len;
int file_sta;
int read_p;
int write_p;
}UOF;
//用户已打开文件目录表
typedef struct SORT_ADD
{
int userid;
int fileid;
int start_add;
int end_add;
}SORTADD;
//此结构体是为了存储对用户文件表中的文件地址排序后的起始地址,和结束地址。
//因为在新建文件时,要找到空闲的磁盘块分配,而文件操作中对地址的管理是全局的,是不分用户的。
//所以要在分配前先对文件地址排序。
主文件:
/*Author:WangXiaowei;Date:2012-06-19;Address:石家庄经济学院信息工程学院.*/
/*Explain:操作系统课程设计的题目7《文件操作》的源文件.*/
/*Take care:本程序中的管理员登录方式下的用户名为:administer,密码为:123456.*/
/*由于本程序的下面用到了延时函数Sleep(),所以本程序开始运行(初始化数据)时有点缓慢,请耐心等待.*/
#include<stdio.h>
#include<stdlib.h>
//使用rand()随机数时应使用此头文件.
#include<string.h>
#include<conio.h>
//因为mypassword()函数中用到了,控制台输入输出函数:getch()、kbhit()、cprintf().
#include<time.h>
//调用系统函数返回当前系统时间时用的函数,包含于此头文件中.
#include<windows.h>
//下面用到sleep()延时函数,它包含于此头文件中.
#include"myheadfile.h"
MFD main_file[N],* main_file_p;
UFD user_file[N-1][L],* user_file_p;
//[N-1]是为了排除管理员用户。
UOF user_open_file[N-1][S],* user_open_file_p;
//[N-1]是为了排除管理员用户.
FAT fat[F];
//文件目录表,fat的下标就是地址块号,块号的内容为-1表示记录结束.
SORTADD sor_add[(N-1)*L];
//因为最多有(N-1)个普通用户,L个文件,所以sor_add的大小应为(N-1)*L个.
struct tm *newtime;
long ltime;
int second;
//上面三句定义是为了存储当前系统时间中的秒数。
int initialize_mfd();//初始化主文件目录表(从文件读取).
int initialize_ufd(int);//初始化用户文件目录表(从文件读取).
int ufd_write_uof(int);
//把ufd文件中的数据写入uof文件,构成uof的部分数据。然后利用一般赋值语句,把剩余数据初始化(往文件中写).
int initialize_uof(int);//初始化已打开文件表(从文件读取).
int initialize_fat();//初始化FAT(文件目录)表.
int output_mfd();//输出主文件目录表.
int output_ufd(int);//输出用户文件目录表.
int output_uof(int);//输出用户已打开文件目录表.
int create(int,char * ,int ,int );//建立文件.
int open(int,char * ,int );//打开文件.
int read(int,char * ,int );//读文件.
int write(int,char * ,int );//写文件.
int close(int,char * );//关闭文件.
int delet(int,char * );//撤销文件.
int mypassword(char *);//实现密码的输入.
int log_in();//实现用户身份的验证.
int test_run_command(int);//实现命令的验证并运行.
int soradd();//对所有用户的所有文件的起始地址排序。
int ad_check_out();//管理员用户选择打印MFD、UFD、UOF,且对于UFD和UOF可以选择打印。
int check_out(int);//普通用户选择打印UFD和UOF,无权打印MFD。注意:普通用户只能打印自己的信息。
int main()
{
int i;
//下面获取当前系统时间中的秒数,是为了获取相对较好的伪随机数做准备.
time(<ime);
newtime=gmtime(<ime);
//获取当前系统时间,并存放于结构体newtime中.
second=newtime->tm_sec;
//获取当前系统时间中的秒数,并存放于变量second中.
fat[F]=0;
initialize_mfd();
for(i=0;i<N-1;i++)
//因为要排除最后一个管理员身份,所以i<N-1.
{
initialize_ufd(i);
}
printf("正在进行数据初始化,请您耐心等待!\n");
//由于下面的ufd_write_uof();函数中用到了延时函数。
for(i=0;i<N-1;i++)
//因为要排除最后一个管理员身份,所以i<N-1.
{
ufd_write_uof(i);
}
printf("\n");
for(i=0;i<N-1;i++)
{
initialize_uof(i);
}
initialize_fat();
log_in();
return 0;
}
int initialize_mfd()
{
int i;
char accept;
//由于文本中每一行数据结束的换行符仍留在输入流中,并将被作为下一个字被读入。
//上面这个变量就是为了存储换行符。
FILE * fp;
main_file_p=main_file;
if((fp=fopen("MFD.txt","rt+"))==NULL)
//对MFD.txt,以文本方式,可读.
{
//printf("\nCannot open file strike any key exit!");
printf("\n不能打开此文件,请按任意键退出!\n");
getchar();
//exit(1);
return 0;
}
for(i=0;i<N;i++)
{
//fscanf(fp,"%[^,],%s%c",main_file_p[i].user_name,main_file_p[i].ufd_add,&accept);
fscanf(fp,"%[^,],%[^,],%s%c",main_file_p[i].user_name,main_file_p[i].ufd_add,main_file_p[i].uof_add,&accept);
}
fclose(fp);
//千万别忘了关闭文件。
return 0;
}
int output_mfd()
{
int i;
printf("这是主文件目录表MFD:\n");
printf("----------------------------------------------------------------\n");
printf("用户名\t\t用户文件目录地址\t用户已打开文件目录地址\n");
printf("----------------------------------------------------------------\n");
for(i=0;i<N;i++)
{
//printf("%-15s\t%s\n",main_file[i].user_name,main_file[i].ufd_add);
printf("%-15s\t%s\t\t%s\n",main_file[i].user_name,main_file[i].ufd_add,main_file[i].uof_add);
}
printf("----------------------------------------------------------------\n");
return 0;
}
int initialize_ufd(int number)
{
int i;
char accept;
//由于文本中每一行数据结束的换行符仍留在输入流中,并将被作为下一个字被读入。
//上面这个变量就是为了存储换行符。
FILE * fp;
user_file_p=user_file[number];
if((fp=fopen(main_file[number].ufd_add,"rt+"))==NULL)
//对UFD.txt,以文本方式,可读.
{
//printf("\nCannot open file strike any key exit!");
printf("\n不能打开此文件,请按任意键退出!\n");
getchar();
//exit(1);
return 0;
}
for(i=0;i<L;i++)
{
fscanf(fp,"%[^,],%d,%d,%d%c",user_file_p[i].file_name,&user_file_p[i].file_pow,&user_file_p[i].record_len,&user_file_p[i].file_add,&accept);
}
fclose(fp);
//千万别忘了关闭文件。
return 0;
}
int output_ufd(int number)
{
int i;
printf("\n这是用户%s的文件目录表UFD%d:\n",main_file[number].user_name,number+1);
printf("------------------------------------------------------------\n");
//printf("file_name\tfile_pow\trecord_len\tfile_add\n");
printf("文件名\t\t文件属性\t记录长度\t文件地址\n");
printf("------------------------------------------------------------\n");
for(i=0;i<L;i++)
{
printf("%-15s\t%d\t\t%d\t\t%d\n",user_file[number][i].file_name,user_file[number][i].file_pow,user_file[number][i].record_len,user_file[number][i].file_add);
}
printf("------------------------------------------------------------\n");
return 0;
}
int ufd_write_uof(int number)
{
int i,j,myrand[L]={0};
int flag=0;
//退出标记,为1时退出。
FILE * fp;
if((fp=fopen(main_file[number].uof_add,"wt+"))==NULL)
//对UOF.txt,以文本方式,可读.
{
//printf("\nCannot open file strike any key exit!");
printf("\n不能打开此文件,请按任意键退出!\n");
getchar();
//e