简单的文件系统实现

简单的文件系统实现
简单的文件系统实现

/*-----文件控制快信息-----*/

struct FCB

{

char name[9]; /*文件/目录名8位*/

char property; /*属性1位目录0位普通文件*/

int size; /*文件/目录字节数(原注释位盘块数)*/

int firstdisk; /*文件/目录起始盘块号*/

int next; /*子目录起始盘块号*/

int sign; /*1是根目录0不是根目录*/

}directitem[MSD+2];

};

/*------------------文件打开表项结构--------------------------*/ struct opentable /* size 104*/

{

struct openttableitem /* size 20*/

{

char name[9]; /*文件名*/

int firstdisk; /*起始盘块号*/

int size; /*文件的大小*/

}openitem[MOFN];

int cur_size; /*当前打文件的数目*/

};

/*-------------------------------------------------------------------*/ struct fatitem *fat; /*FAT表*/

struct direct *root; /*根目录*/

struct direct *cur_dir; /*当前目录*/

struct opentable u_opentable; /*文件打开表*/

int fd=-1; /*文件打开表的序号*/

char *bufferdir; /*记录当前路径的名称*/

char *fdisk; /*虚拟磁盘起始地址*/

void initfile();

void format();

void enter();

void halt();

int create(char *name);

int open(char *name);

int close(char *name);

int write(int fd,char *buf,int len);

int read(int fd,char *buf);

int del(char *name);

int mkdir(char *name);

int rmdir(char *name);

void dir();

int cd(char *name);

void print();

void show();

/*----------------------------------------------------------------------------------------------*/

/*------------------------------------------初始化文件系统--------------------------------------*/ void initfile()

{

fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请1M空间*/

format();

free(fdisk);

}

/*----------------------------------------------------------------------------------------------*/

/*------------------------------------------格式化----------------------------------------------*/

void format()

{

int i;

FILE *fp;

fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT表地址(为什么向后偏移1k)*/ /*-----初始化FAT表------------*/

fat[0].item=-1; /*引导块*/

fat[0].em_disk='1';

for(i=1;i

{

fat[i].item=i+1;

fat[i].em_disk='1';

}

fat[ROOT_DISK_NO-1].item=-1;

fat[ROOT_DISK_NO-1].em_disk='1';

fat[ROOT_DISK_NO].item=-1; /*存放根目录的磁盘块号*/

fat[ROOT_DISK_NO].em_disk='1';

for(i=ROOT_DISK_NO+1;i

{

fat[i].item = -1;

fat[i].em_disk = '0';

}

/*-----------------------------------------------*/

root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目录的地址*/ /*初始化目录*/

/*---------指向当前目录的目录项---------*/

root->directitem[0].sign = 1;

root->directitem[0].firstdisk = ROOT_DISK_NO;

strcpy(root->directitem[0].name,".");

root->directitem[0].next = root->directitem[0].firstdisk;

root->directitem[0].property = '1';

root->directitem[0].size = ROOT_DISK_SIZE;

/*-------指向上一级目录的目录项---------*/

root->directitem[1].sign = 1;

root->directitem[1].firstdisk = ROOT_DISK_NO;

strcpy(root->directitem[1].name,"..");

root->directitem[1].next = root->directitem[0].firstdisk;

root->directitem[1].property = '1';

root->directitem[1].size = ROOT_DISK_SIZE;

for(i=2;i

{

root->directitem[i].sign = 0;

root->directitem[i].firstdisk = -1;

strcpy(root->directitem[i].name,"");

root->directitem[i].next = -1;

root->directitem[i].property = '0';

root->directitem[i].size = 0;

}

/*-------测试写入文件的数据---------

for(i=0;i

{

printf("%d,%d/n",fat[i].item,fat[i].em_disk);

}

for(i=0;i

{

printf("%d,%s,%d,%c,%d,%d/n",root->directitem[i].firstdisk, root->directitem[i].name,root->directitem[i].next,

root->directitem[i].property,root->directitem[i].sign,

root->directitem[i].size);

}

for(i=0;i

{

fread(&fat[i],sizeof(struct fatitem),1,fp);

printf("%d,%d/n",fat[i].em_disk,fat[i].item);

}

for(i=0;i

{

fread(&root->directitem[i],sizeof(struct FCB),1,fp);

printf("%d,%s,%d,%c,%d,%d/n",root->directitem[i].firstdisk, root->directitem[i].name,root->directitem[i].next,

root->directitem[i].property,root->directitem[i].sign,

root->directitem[i].size);

}

------test end-----*/

if((fp = fopen("disk.dat","wb"))==NULL)

{

printf("Error:/n Cannot open file /n");

return;

}

if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*把虚拟磁盘空间保存到磁盘文件中*/

{

printf("Error:/n File write error! /n");

}

fclose(fp);

}

/*----------------------------------------------------------------------------------------------*/

/*--------------------------------进入文件系统--------------------------------------------------*/

void enter()

{

FILE *fp;

int i;

fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申请1M空间*/

if((fp=fopen("disk.dat","rb"))==NULL)

{

printf("Error:/nCannot open file/n");

return;

}

if(!fread(fdisk,MEM_D_SIZE,1,fp)) /*把磁盘文件disk.dat 读入虚拟磁盘空间(内存)*/ {

printf("Error:/nCannot read file/n");

exit(0);

}

fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/

root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/

fclose(fp);

/*--------------初始化用户打开表------------------*/

for(i=0;i

{

strcpy(u_opentable.openitem[i].name,"");

u_opentable.openitem[i].firstdisk = -1;

u_opentable.openitem[i].size = 0;

}

u_opentable.cur_size = 0;

cur_dir = root; /*当前目录为根目录*/

bufferdir = (char *)malloc(DIR_LENGTH*sizeof(char));

strcpy(bufferdir,"Root:"); /*显示根目录为E:*/

}

/*----------------------------------------------------------------------------------------------*/

/*------------------------------------退出文件系统----------------------------------------------*/

void halt()

{

FILE *fp;

int i;

if((fp=fopen("disk.dat","wb"))==NULL)

{

printf("Error:/nCannot open file/n");

return;

}

if(!fwrite(fdisk,MEM_D_SIZE,1,fp)) /*把虚拟磁盘空间(内存)内容读入磁盘文件disk.dat */

{

printf("Error:/nFile write error!/n");

}

fclose(fp);

free(fdisk);

free(bufferdir);

for(i=0;i

strcpy(u_opentable.openitem[i].name,"");

u_opentable.openitem[i].firstdisk = 0;

u_opentable.openitem[i].size = 0;

}

u_opentable.cur_size = 0; /*用户打开文件数清零*/

return;

}

/*----------------------------------------------------------------------------------------------*/

/*----------------------------------------创建文件----------------------------------------------*/ int create(char *name)

{

int i,j;

if(strlen(name)>8) /*文件名大于8位*/

return(-1);

for(i=2;i

{

if(cur_dir->directitem[i].firstdisk==-1)

break;

}

for(j=2;j

{

if(!strcmp(cur_dir->directitem[j].name,name))

break;

if(i>=MSD+2) /*无空目录项*/

return(-2);

if(u_opentable.cur_size>=MOFN) /*打开文件太多(第五层)*/

return(-3);

if(j

return(-4);

for(j=ROOT_DISK_NO+1;j

if(fat[j].em_disk=='0')

break;

}

if(j>=DISK_NUM)

return(-5);

fat[j].em_disk = '1'; /*将空闲块置为已经分配*/

/*-----------填写目录项-----------------*/

strcpy(cur_dir->directitem[i].name,name);

cur_dir->directitem[i].firstdisk = j;

cur_dir->directitem[i].size = 0;

cur_dir->directitem[i].next = j;

cur_dir->directitem[i].property = '0';

/*cur_dir->directitem[i].sign 丢失*/

/*---------------------------------*/

fd = open(name); /*打开所创建的文件*/

return 0;

}

/*----------------------------------------------------------------------------------------------*/

/*----------------------------------------打开文件----------------------------------------------*/ int open(char *name)

{

int i, j;

for(i=2;i

{

if(!strcmp(cur_dir->directitem[i].name,name))

break;

}

if(i>=MSD+2) /*文件不存在*/

return(-1);

/*--------是文件还是目录-----------------------*/

if(cur_dir->directitem[i].property=='1')/*是目录,不可打开读写*/ return(-4);

/*--------文件是否打开-----------------------*/

for(j=0;j

{

if(!strcmp(u_opentable.openitem[j].name,name)) break;

}

if(j

return(-2);

if(u_opentable.cur_size>=MOFN) /*文件打开太多*/

return(-3);

/*--------查找一个空闲用户打开表项-----------------------*/

for(j=0;j

{

if(u_opentable.openitem[j].firstdisk==-1)

break;

}

/*--------------填写表项的相关信息------------------------*/

u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk;

strcpy(u_opentable.openitem[j].name,name);

u_opentable.openitem[j].size = cur_dir->directitem[i].size;

u_opentable.cur_size++;

/*----------返回用户打开表表项的序号--------------------------*/

return(j);

}

/*----------------------------------------------------------------------------------------------*/

/*----------------------------------------关闭文件----------------------------------------------*/ int close(char *name)

{

int i;

for(i=0;i

{

if(!strcmp(u_opentable.openitem[i].name,name))

break;

}

if(i>=MOFN) /*--文件没有打开-*/

return(-1);

/*-----------清空该文件的用户打开表项的内容---------------------*/

strcpy(u_opentable.openitem[i].name,"");

u_opentable.openitem[i].firstdisk = -1;

u_opentable.openitem[i].size = 0;

u_opentable.cur_size--;

fd = -1; /*文件打开表的序号为-1 */

return 0;

}

/*----------------------------------------------------------------------------------------------*/

/*----------------------------------------写文件------------------------------------------------*/ int write(int fd, char *buf, int len)

{

char *first;

int item, i, j, k;

int ilen1, ilen2, modlen, temp;

/*----------用$ 字符作为空格# 字符作为换行符-----------------------*/

char Space = 32; /*SPACE的ASCII码值*/

char Endter= '/n';

for(i=0;i

{

if(buf[i] == '$') /*用$ 字符作为空格*/

buf[i] = Space;

else if(buf[i] == '#')

buf[i] = Endter;

}

/*----------读取用户打开表对应表项第一个盘块号-----------------------*/

item = u_opentable.openitem[fd].firstdisk;

/*-------------找到当前目录所对应表项的序号-------------------------*/

for(i=2;i

{

if(cur_dir->directitem[i].firstdisk==item)

break;

}

temp = i; /*-存放当前目录项的下标-*/

/*------找到的item 是该文件的最后一块磁盘块-------------------*/

while(fat[item].item!=-1)

{

item =fat[item].item; /*-查找该文件的下一盘块--*/

}

/*-----计算除该文件的最末地址-------*/

first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;

/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/

if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len)

{

strcpy(first,buf);

u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;

cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;

}

else

{

for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++)

{/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/

first[i] = buf [i];

}

/*-----计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-------*/

ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);

ilen2 = ilen1/DISKSIZE;

modlen = ilen1%DISKSIZE;

if(modlen>0)

ilen2 = ilen2+1; /*--还需要多少块磁盘块-*/

/*调试时特别注意*/

for(j=0;j

{

for(i=ROOT_DISK_NO+1;i

{

if(fat[i].em_disk=='0')

break;

}

if(i>=DISK_NUM) /*--如果磁盘块已经分配完了-*/

return(-1);

first = fdisk+i*DISKSIZE; /*--找到的那块空闲磁盘块的起始地址-*/

if(j==ilen2-1) /*--如果是最后要分配的一块-*/

{

for(k=0;k

first[k] = buf[k];

}

else/*-如果不是要最后分配的一块--*/

{

for(k=0;k

first[k] =buf[k];

}

fat[item].item = i; /*--找到一块后将它的序号存放在上一块的指针中-*/

fat[i].em_disk = '1'; /*--置找到的磁盘快的空闲标志位为已分配-*/

fat[i].item = -1; /*--它的指针为-1 (即没有下一块)-*/

}

/*--修改文件打开表用户的长度-*/

u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;

/*--修改目录项的文件长度-*/

cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;

}

return 0;

}

/*----------------------------------------------------------------------------------------------*/

/*----------------------------------------读文件------------------------------------------------*/

int read(int fd, char *buf)

{

int len = u_opentable.openitem[fd].size;

char *first;

int i, j, item;

int ilen1, modlen;

item = u_opentable.openitem[fd].firstdisk;

if(len>u_opentable.openitem[fd].size) /*--欲读出的文件长度比实际文件长度长-*/ return(-1);

ilen1 = len/DISKSIZE;

modlen = len%DISKSIZE;

if(modlen!=0)

ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/

first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/

for(i=0;i

{

if(i==ilen1-1) /*--如果在最后一个磁盘块-*/

{

for(j=0;j

buf[i*DISKSIZE+j] = first[j];

}

else /*--不在最后一块磁盘块-*/

{

for(j=0;j

buf[i*DISKSIZE+j] = first[j];

item = fat[item].item; /*-查找下一盘块-*/

first = fdisk+item*DISKSIZE;

}

}

return 0;

}

/*----------------------------------------------------------------------------------------------*/

/*----------------------------------------删除文件----------------------------------------------*/ int del(char *name)

{

int i,cur_item,item,temp;

for(i=2;i

{

if(!strcmp(cur_dir->directitem[i].name,name))

break;

}

cur_item = i; /*--用来保存目录项的序号,供释放目录中-*/

if(i>=MSD+2) /*--如果不在当前目录中-*/

return(-1);

if(cur_dir->directitem[cur_item].property!='0') /*--如果删除的(不)是目录-*/ return(-3);

for(i=0;i

{

if(!strcmp(u_opentable.openitem[i].name,name))

return(-2);

}

item = cur_dir->directitem[cur_item].firstdisk;/*--该文件的起始盘块号-*/

while(item!=-1) /*--释放空间,将FAT表对应项进行修改-*/

{

temp = fat[item].item;

fat[item].item = -1;

fat[item].em_disk = '0';

item = temp;

}

/*-----------------释放目录项-----------------------*/

cur_dir->directitem[cur_item].sign = 0;

cur_dir->directitem[cur_item].firstdisk = -1;

strcpy(u_opentable.openitem[cur_item].name,"");

cur_dir->directitem[cur_item].next = -1;

cur_dir->directitem[cur_item].property = '0';

cur_dir->directitem[cur_item].size = 0;

return 0;

}

/*----------------------------------------------------------------------------------------------*/

/*---------------------------------------创建子目录---------------------------------------------*/ int mkdir(char *name)

{

int i,j;

struct direct *cur_mkdir;

if(strchr(name,'//'))/*如果目录名中有'/'字符*/

return(-4);

if(!strcmp(name,"."))

return(-6);

if(!strcmp(name,".."))

return(-6);

if(strlen(name)>8) /*-如果目录名长度大于8位-*/

return(-1);

for(i=2;i

{

if(cur_dir->directitem[i].firstdisk==-1)

break;

}

if(i>=MSD+2) /*-目录/文件已满-*/

return(-2);

for(j=2;j

{

if(!strcmp(cur_dir->directitem[j].name,name))

break;

}

if(j

return(-3);

for(j=ROOT_DISK_NO+1;j

{

if(fat[j].em_disk=='0')

break;

}

if(j>=DISK_NUM)

return(-5);

fat[j].em_disk='1'; /*-将该空闲块设置为已分配-*/

/*-------------填写目录项----------*/

strcpy(cur_dir->directitem[i].name,name);

cur_dir->directitem[i].firstdisk=j;

cur_dir->directitem[i].size=ROOT_DISK_SIZE;

cur_dir->directitem[i].next=j; /*-指向子目录(其实就是其本身)的起始盘块号-*/ cur_dir->directitem[i].property='1';

/*-sign=1为根标志,这里可以省略-*/

/*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/

cur_mkdir=(struct direct *)(fdisk+cur_dir->directitem[i].firstdisk*DISKSIZE);

/*-初始化目录-*/

/*-指向当前目录的目录项-*/

cur_mkdir->directitem[0].sign=0;

cur_mkdir->directitem[0].firstdisk=cur_dir->directitem[i].firstdisk;

strcpy(cur_mkdir->directitem[0].name,".");

cur_mkdir->directitem[0].next=cur_mkdir->directitem[0].firstdisk;

cur_mkdir->directitem[0].property='1';

cur_mkdir->directitem[0].size=ROOT_DISK_SIZE;

/*-指向上一级目录的目录项-*/

cur_mkdir->directitem[1].sign=cur_dir->directitem[0].sign;/*-指向上一级目录的目录项-*/ cur_mkdir->directitem[1].firstdisk=cur_dir->directitem[0].firstdisk;

strcpy(cur_mkdir->directitem[1].name,"..");

cur_mkdir->directitem[1].next=cur_mkdir->directitem[1].firstdisk;

cur_mkdir->directitem[1].property='1';

cur_mkdir->directitem[1].size=ROOT_DISK_SIZE;

for(i=2;i

{

cur_mkdir->directitem[i].sign=0;

cur_mkdir->directitem[i].firstdisk=-1;

strcpy(cur_mkdir->directitem[i].name,"");

cur_mkdir->directitem[i].next=-1;

cur_mkdir->directitem[i].property='0';

cur_mkdir->directitem[i].size=0;

}

return 0;

}

/*----------------------------------------------------------------------------------------------*/

/*---------------------------------------删除子目录---------------------------------------------*/

int rmdir(char *name)

{

int i,j,item;

struct direct *temp_dir;

/*-检查当前目录项中有无该目录-*/

for(i=2;i

{

if(!strcmp(cur_dir->directitem[i].name,name))

break;

}

if(cur_dir->directitem[i].property!='1')/*-删除的不是目录-*/

return(-3);

if(i>=MSD+2) /*-没有这个文件或目录-*/

return(-1);

/*-判断要删除的目录有无子目录-*/

/*-要删除的目录起始地址-*/

temp_dir=(struct direct *)(fdisk+cur_dir->directitem[i].next*DISKSIZE); for(j=2;j

{

if(temp_dir->directitem[j].next!=-1)

break;

}

if(j

return(-2); /*-有关联则报错,也可以采取级联删除,像Windows-*/

/*------------找到起始盘块号,并将其释放----------------*/

item=cur_dir->directitem[i].firstdisk;

fat[item].em_disk='0';

/*-修改目录项-*/

cur_dir->directitem[i].sign=0;

cur_dir->directitem[i].firstdisk=-1;

strcpy(cur_dir->directitem[i].name,"");

cur_dir->directitem[i].next=-1;

cur_dir->directitem[i].property='0';

cur_dir->directitem[i].size=0;

return 0;

}

模拟文件系统的设计与实现

中北大学 操作系统课程设计 说明书 学院、系:软件学院 专业:软件工程 学生姓名:xxx 学号:xxx 设计题目:模拟文件系统的设计与实现 起迄日期: 2015年12月28日- 2016年1月8日指导教师:xxx 2016 年1月8日

1需求分析 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。 模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。 2总体设计 结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。 文件的创建: create 文件关闭:close 文件的打开:open 文件的读:read 文件的写:write 文件关闭:close 删除文件:delete 创建子目录:mkdir 删除子目录:rmdir 列出文件目录:dir 退出:exit 系统执行流程图 开始 选择操作 创建文件删 除 文 件 读 文 件 写 文 件 创 建 文 件 夹 删 除 文 件 夹 删 除 子 目 录 显示 当前 子目 录 创 建 子 目 录 更 改 目 录 退 出

退出 3.详细设计 主要数据结构: #define MEM_D_SIZE 1024*1024 //总磁盘空间为1M #define DISKSIZE 1024 //磁盘块的大小1K #define DISK_NUM 1024 //磁盘块数目1K #define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号#define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小 #define DIR_MAXSIZE 1024 //路径最大长度为1KB #define MSD 5 //最大子目录数5 #define MOFN 5 //最大文件深度为5 #define MAX_WRITE 1024*128 //最大写入文字长度128KB struct fatitem /* size 8*/ { int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位 0 空闲*/ }; struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目录名 8位*/ char property; /*属性 1位目录 0位普通文件*/ int size; /*文件/目录字节数、盘块数)*/

简单文件系统的实现

简单文件系统的实现 Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT

第三章简单文件系统的实现 设计目的和内容要求 1.设计目的 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。 2.内容要求 (1)在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。 (2)文件存储空间的分配可采用显式链接分配或其他的办法。 (3)空闲磁盘空间的管理可选择位示图或其他的办法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT 中。 (4)文件目录结构采用多级目录结构。为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。 (5)要求提供以下操作命令: my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。

●my_mkdir:用于创建子目录。 ●my_rmdir:用于删除子目录。 ●my_ls:用于显示目录中的内容。 ●my_cd:用于更改当前目录。 ●my_create:用于创建文件。 ●my_open:用于打开文件。 ●my_close:用于关闭文件。 ●my_write:用于写文件。 ●my_read:用于读文件。 ●my_rm:用于删除文件。 ●my_exitsys:用于退出文件系统。 3.学时安排 授课2学时,上机9学时。 4.开发平台 C或C++均可。 5.思考 (1)我们的数据结构中的文件物理地址信息是使用C语言的指针类型、还是整型,为什么 (2)如果引入磁盘索引结点,上述实现过程需要作哪些修改 (3)如果设计的是一个单用户多任务文件系统,则系统需要进行哪些扩充(尤其要考虑读写指针问题)如果设计的是一个多用户文件系统,则又要进行哪些扩充

文件管理系统课程设计

课程名称:操作系统 实验题目:文件管理系统 1、课程设计选题 (3) 1.1主要设计内容 3 1.2主要设计思路 3 2、课程设计需求分析 3 3、概要设计 (4) 3.1整体设计框架 4 3.2各模块的基本功能 4 4、系统实现 5 4.1原理 6 4.2各模块算法思想 6 4.3流程图描述 9 4.4代码描述 10 5、系统测试 11

5.1系统主界面 11 5.2子系统功能测试 11 6、总结 19 7、参考文献样式 19 1、课程设计选题 1.1主要设计内容 本课程设计主要是用C语言编写,设计的是一个模拟的多用户多级目录的文 件管理系统。通过具体的文件存储空间的管理、文件的物理结构、目录结构和文 件操作的实现,加深对文件系统内部功能和实现过程的理解。 1.2主要设计思路 首先系统要完成初始化的任务,建立起整个系统,等待用户注册,注册成功后,用户登录模块,对用户的用户名进行验证,如果用户登录成功,则系统进入 等待用户输入的状态,用户选择相应指令后,系统按照即定方式处理用户请求, 用户退出后,系统转入登录模块,等待下一位用户的登录。 2、课程设计需求分析 本系统为多用户多级目录的文件管理系统,用户可以根据所注册的用户名登 陆来对文件或是文件进行操作。多用户功能可以满足不同用户不同的需求,同时 也起到了很好的保密作用。 文件系统为用户提供了按名存取的功能,以使得用户能透明地存储访问文

件。为了实现按名存取,文件需要对文件存储设备进行合理的组织,分配;对存储在文件存储设备上的文件进行保护,保密和提供共享的手段。另外,文件系统还要提供检索文件或文件中记录的手段,文件系统就是完成上述功能的一组软件和数据结构的集合。 模拟一个文件管理系统,要完成对文件的基本操作,文件的基本操作有文件、文件夹的打开、新建、删除和读取写入文件,创建更改目录,列出目录内容等信息。系统建立了文件目录树,存储文件系统中的所有文件。对于用户名下的文件,用文件目录树的分枝来存贮。 采用命令行操作界面很直观,也方便用户进行操作,用户只要按照操作界面所显示的命令来操作就行了。 因为存在着同一个目录下不能有同名文件的问题。所以在进行文件的基本操作时要考虑到在已经有的文件中是否有同名文件,有的话则输出提示信息。 3、概要设计 3.1整体设计框架 系统初始化界面是由用户注册,用户登录,退出系统三个模块组成。用户登录模块再由创建用户,进入目录,删除用户,显示所有用户,显示位示图,修改用户资料几大模块组成。然后各个模块再由一些小模块组成。其中创建文件,打开关闭文件,读写文件等文件操作模块包括在进入目录模块里面。 3.2各模块的基本功能 3.21系统初始化 系统的初始化包括初始化了磁盘的空间即位示图、一个管理员用户 3.22用户注册模块 用户可以在这里注册,用户名和密码的最大长度都为10个字节,如果用户名不重复的话,则注册成功,用户的权限默认为一般用户。

模拟简单二级文件管理系统

操作系统课程设计 模拟简单二级文件管理系统 姓名:王馨萍 学号: 系别:计算机学院 专业:网络工程 年级:16级 指导教师: 2019年05 月11 日

一、课程设计项目介绍(含项目介绍及设计目的) 1、设计目的: 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。 2、项目介绍: 为LINUX 设计一个简单的二级文件系统。本文件系统采用类似DOS系统的文件管理方式,每次调用该文件系统时,首先申请一定的内存空间,然后对该内存空间进行分配。将申请到的空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。每次调用该文件系统时自动为其分配空间,并将上次操作的结果从硬盘上调入内存;当结束调用时则将操作的结果重新存入硬盘,以便下次调用。(每次使用都会自动搜索文件系统,以此确定是否是第一次使用;若是则格式化生成文件系统,否则读取已存在的文件系统。)本项目通过VC编写简单的二级文件系统的代码,实现文件管理方式,使用者只需要给出相应的文件操作命令就可以分别得到各类文件操作的相应,并且可以选择登陆或注销不同用户。

二、总体设计(含系统的总体结构、原理框图或各模块介绍等) 1、系统总体结构图:

2、模块介绍 (1)、主函数部分:在主函数系统接受输入信息,包括登陆用户和注册用户,登陆完成后选择相应的文件操作,可以选择创建目录、浏览目录、修改目录、创建文件等操作,如果选择错误就会出现相应的提示信息。 (2)、命令解释层函数:在命令解释层函数cmdexp()里加了一些选择和操作功能,增加程序实现的功能,如原来程序只有显示当前目录和文件、创建目录和修改目录的功能,把它拓展到系统所要求的全部功能,并在原有的程序的基础上进行相应的修改,使程序更加完善。 (3)、文件系统格式化函数:该函数首先建立文件,申请空间,在设置成功时将其空间写入filesystem.dat,使filesystem.dat为1M。接着设置磁盘i节点缓冲区,DIEMPTY表示空闲,设计成第1盘块存储用户名表,第2盘块用于存储根目录,第3盘块用于根目录下的子目录。 (4)、空闲盘块分配、回收函数:首先排除磁盘已满,无空闲盘块,或者已经是栈底的情况,接着设置栈指针下移一位,则空闲盘块少1。如果是空闲盘块堆栈已满状态,则把空闲盘块数据写入缓冲区,栈指针指向栈底,缓冲区内容写入新回收的盘块。最后是回收盘块,回收完毕后空闲盘块多1。 (5)、节点分配和释放函数:若没有空闲磁盘i节点,则显示相应提示信息;若空闲磁盘i节点栈空,则分为空闲磁盘i节点数可装满空闲i节点栈和剩下的空闲磁盘i节点不能装满栈区两种情况来考虑。接着初始化磁盘i节点、分配内存i节点,并从磁盘i节点读取数据到内存i节点。

实验六 文件系统设计结果

实验六文件系统设计 1.目的和要求 本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。 2.实验内容 为DOS系统设计一个简单的二级文件系统,可以实现下列几条命令DIR 列文件目录 CREATE 创建文件 DELETE 删除文件 MODIFY 修改文件 OPEN 打开文件 CLOSE 关闭文件 列目录时要列出文件名,物理地址,保护码和文件长度。 3.实验环境 ①PC兼容机 ②Windows、DOS系统、Turbo c 2.0 ③C语言 4.实验提示 ①首先应确定文件系统的数据结构:主目录、活动文件等。主目录文件的形式存放于磁盘,这样便于查找和修改。 主目录结构: Ufdname 用户名 Ufdfile 指向用户的活动文件 活动文件结构: Fpaddr 文件物理地址 Flength 文件长度 Fmode 文件属性(file mode:0-Read Only;1-Write Only;2-Read and Write(default)) Fname 文件名称 ②用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并

以编号作为物理地址,在目录中进行登记。

③本程序需要在c:下建一个名为osfile的目录及一个名为file的子目录,在利用程序创建了文件系统后,可以在这个文件夹下查看到相关的内容。5.实验程序 #include "stdio.h" #include "string.h" #include "conio.h" #include "stdlib.h" #define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/ #define MAXCHILD 50 /*the largest child*/ #define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/ typedef struct /*the structure of OSFILE*/ { int fpaddr; /*file physical address*/ int flength; /*file length*/ int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write(default);*/ char fname[MAXNAME]; /*file name*/ } OSFILE; typedef struct /*the structure of OSUFD*/ { char ufdname[MAXNAME]; /*ufd name*/ OSFILE ufdfile[MAXCHILD]; /*ufd own file*/ }OSUFD; typedef struct /*the structure of OSUFD'LOGIN*/ { char ufdname[MAXNAME]; /*ufd name*/ char ufdpword[8]; /*ufd password*/ } OSUFD_LOGIN; typedef struct /*file open mode*/ { int ifopen; /*ifopen:0-close,1-open*/ int openmode; /*0-read only,1-write only,2-read and write,3-initial*/ }OSUFD_OPENMODE; OSUFD *ufd[MAXCHILD]; /*ufd and ufd own files*/ OSUFD_LOGIN ufd_lp;

文件管理系统设计方案和对策

文件管理系统设计方案 传统的管理和保存文件的方式是人工生成和保管文件(包括:生成、传阅、审批、进入受控状态等),文件通常是保存在文件柜中的。 由于文件数量多,版本复杂,在实际使用中经常出现问题,例如:文件版本不一致、文件查找困难、文件管理处理历史记录报表工作量过大等。本方案旨在解决单位对大量工程和技术文件的管理,达到并确保工作人员手中文件版本的一致性、文件更改的可追溯性,同时以实现电子公告、电子通知、电子邮件、公文收发等功能来提高单位日常办公及管理的自动化。 一、文件管理系统的建设目标和意义 目标: 满足企业对文件信息进行集中管理、查询的需要 通过文件的集中管理,使企业实现资料共享,资料同步更新 企业重要文档的使用权限设置,一方面节约了资本,另一方面自动化管理,保证了资料的保密性和安全性 简化了员工查找和使用资料的工作步骤,使员工把时间放在其他更有价值的工作上,减少重复劳动,提高工作效率,为企业争取更多 利润 把无纸化办公和自动化办公结合起来,实现了无纸化和物理化文档管理的有机组合 把先进的数据库技术运用于文档管理,促进企业信息化管理的进步文件管理系统建设意义: 1、分类、管理企业文件 文件管理系统通过数据库管理,对企业纷杂的文件内容进行分门别类的管理,按照不同的介质(图片、影音、word、excel、ppt、pdf等)进行存放管理。 文件管理系统通过权限管理,对不同的员工开放不同级别的文件库,最大程

度保证企业的文件安全。 2、共享、学习企业文件 文件管理系统通过内部网络将文件资本进行共享,让更多的人分享到企业文件资本,拓宽部门和员工的知识范围。 3、应用、增值文件资本 文件管理平台构建面向企业业务流程的文件管理系统,使得工作过程中显形知识结构化,隐形知识显形化。 通过文件的不断重复应用,实现文件增值。有效的规避了人员升迁流动所造成了关键业务领域的损失,让业务运行不辍。 4、提升企业竞争力 创造企业新竞争价值,增加企业利润,降低企业成本,提高企业效率。建立企业新文化,鼓励思想自由,培育创新精神。 通过减少反应时间来提高为客户服务的水平,通过快速向市场提供产品和服务来增加收入。 二、文件管理系统的建设要求 首先是支持的文件内容要全面,从文件管理的内容角度,至少应该包括: ?对信息的发布,比如直接发布各种内容 ?对文档的管理,如各类DOC、XLS、PPT等文件 ?对数据信息的管理,如各类报表等等 有利于充分利用文件: ?对链接的处理:在内容中可以互相链接,它是有效利用文件的非常重要的环节 ?强有力的索引能力,特别是全文检索 ?对于动态数据的强有力查询能力,比如可以根据各种条件进行查询

简单文件系统的实现

第三章简单文件系统的实现 3.1 设计目的和内容要求 1. 设计目的 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。 2.内容要求 (1) 在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。 (2) 文件存储空间的分配可采用显式链接分配或其他的办法。 (3) 空闲磁盘空间的管理可选择位示图或其他的办法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT中。 (4) 文件目录结构采用多级目录结构。为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。 (5) 要求提供以下操作命令: my_format :对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。 my_mkdir :用于创建子目录。 my_rmdir :用于删除子目录。 my_ls :用于显示目录中的内容。 my_cd :用于更改当前目录。 my_create :用于创建文件。 my_open :用于打开文件。 my_close :用于关闭文件。 my_write :用于写文件。 my_read :用于读文件。

my_rm :用于删除文件。 my_exitsys:用于退出文件系统。 3 ?学时安排 授课2学时,上机9学时。 4.开发平台 C或C++均可。 5 .思考 (1)我们的数据结构中的文件物理地址信息是使用C语言的指针类型、还是整型,为什 么? (2)如果引入磁盘索引结点,上述实现过程需要作哪些修改? (3)如果设计的是一个单用户多任务文件系统,则系统需要进行哪些扩充(尤其要考虑读写指针问 题)?如果设计的是一个多用户文件系统,则又要进行哪些扩充? 3.2预备知识 3.2.1 FAT文件系统介绍 1?概述 FAT文件系统是微软公司在其早期的操作系统MS-DOS及Windows9x中采用的文件系 统,它被设计用来管理小容量的磁盘空间。FAT文件系统是以他的文件组织方式一一文件分 配表(file allocation table, FAT命名的,文件分配表的每个表项中存放某文件的下一个盘块号,而该文 件的起始盘块号则保存在它的文件控制块FCB中。在文件分配表中,一般用FFFF来标识文件的结束;用0000来标识某个逻辑块未被分配,即是空闲块。为了提高文件系统的可靠性,在逻辑磁盘上通常设置两张文件分配表,它们互为备份。此外,文件分配表 必须存放在逻辑磁盘上的固定位置,而根目录区通常位于FAT2之后,以便操作系统在启动 时能够定位所需的文件,其磁盘布局如图3-1所示: 上述磁盘布局中,引导块中主要存放了用于描述分区的各种信息,包括逻辑块的大小、 文件分配表的大小及位置、根目录的大小及位置等。除此之外,用于加载操作系统内核的引

模拟一个简单二级文件管理系统

模拟一个简单二级文件管理系统 设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。 设计内容:模拟一个简单二级文件管理系统 一、实验内容描述 1 实验目标 本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现. 2 实验要求 为DOS系统设计一个简单的二级文件系统.要求做到以下几点: ①可以实现下列命令: login 用户登录 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 ②列目录时要列出文件名、物理地址、保护码和文件长度. ③源文件可以进行读写保护. 二、程序主要内容 1设计思路 程序中要求每个用户在登陆后才可对其拥有的文件进行操作,用户对于其他用户的文件无操作权.文件操作包括浏览、创建、删除、打开、关闭、阅读、写入、修改模式.其他操作包括新建用户、帮助、用户登入、用户登出、退出系统. 在程序文件夹下有个名为“file”的系统根目录,此目录下包括:一个名为“mfd”的文件,记录所有注册过的帐号及密码;用户文件,以用户名作为文件名,内容为其拥有的文件名及属性;一个名为“keiji”的文件夹.“keiji”文件夹中包括:“”指针文件,记录所有已用的物理地址;一些以物理地址为名的文件,内容为文件内容. 2 数据结构 file结构体系统文件数据结构: fpaddrint,文件的物理地址、flengthint,文件长度、fmodeint,文件模式 0.只读;1.可写;2.可读写;3.保护、 fname[]char,文件名; filemode结构体文件状态数据结构: isopenint,文件当前状态,0.关闭;1.打开、modeint,文件模式 0.只读;1.可写;2.可

操作系统课程设计-模拟文件系统

目录 第1章需求分析 (1) 第2章概要设计 (1) 系统的主要功能 (1) 系统模块功能结构 (1) 运行环境要求 (2) 数据结构设计 (2) 第3章详细设计 (3) 模块设计 (3) 算法流程图 (3) 第4章系统源代码 (4) 第5章系统测试及调试 (4) 运行结果及分析 (4) 系统测试结论 (5) 第6章总结与体会 (6) 第7章参考文献 (6) 附录 (7)

第1章需求分析 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。 模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。 第2章概要设计 系统的主要功能 1) 系统运行时根据输入的用户数目创建主目录 2) 能够实现下列命令: Login 用户登录 Create 建立文件 Read 读取文件 Write 写入文件 Delete 删除文件 Mkdir 建立目录 Cd 切换目录 Logout 退出登录 系统模块功能结构

运行环境要求 操作系统windows xp ,开发工具vc++ 数据结构设计 用户结构:账号与密码结构 typedef struct users { char name[8]; char pwd[10]; }users; 本系统有8个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。 users usrarray[8] = { "usr1","usr1", "usr2","usr2", "usr3","usr3", "usr4","usr4",

人力资源管理系统设计文档

企业管理信息系统-----人力资源管理系统设计文档人力资源管理系统设计文档图1:人力资源系统架构图 ................................................................................................ 2 一. 概述......................................................................................................... ......................... 3 1.绪论 ........................................................................................................ ........................ 3 2.背景 ........................................................................................................ ........................ 3 3.功能分析 ........................................................................................................ ................. 3 二. 业务流程 ........................................................................................................ .................... 4 1.人力资源数据流图如下: (4) 2.人力资源ER图如下: ..................................................................................................... 5 三. 信息采集与各部门的使用权限............................................................................................. 6 四. 系统模块描述 ........................................................................................................ ............. 6 1.岗位信

操作系统简单文件系统设计及实现

简单文件系统的设计及实现 一、实验目的: 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解 2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二、实验内容: 1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作 4、算法与框图 ?因系统小,文件目录的检索使用了简单的线性搜索。 ?文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 ?程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD); 打开文件目录( AFD)(即运行文件目录) 文件系统算法的流程图如下

三、工具/准备工作: 在开始本实验之前,请回顾教科书的相关内容。并做以下准备: 1) 一台运行Windows 2000 Professional或Windows 2000 Server的操作系统的计算机。 2) 计算机中需安装Visual C++ 6.0专业版或企业版 四、实验要求: (1)按照学校关于实验报告格式的要求,编写实验报告(含流程图); (2)实验时按两人一组进行分组,将本组认为效果较好的程序提交检查。

图书管理系统设计文档(DOC)

摘要 随着科学技术的进步和计算机行业的迅速发展,人们的工作效率得到大大提高。计算机信息处理系统的引进已彻底改变了许多系统的经营管理。 图书管理系统是学校管理机制中的重要组成部分,通过对图书馆管理系统的运行管理机制进行调查和研究,开发了此图书馆管理系统。本文中主要介绍了图书馆管理事务中的常见基本问题等研究背景,进行了全面的可行性分析,详细论证了系统的需求分析、系统设计、系统实现和系统测试过程。 本系统使用JSP进行网页界面的设计,使用MVC设计模式,通过JDBC驱动和数据库进行无缝连接。 系统实现了用户登录、图书管理、借书证管理、图书借阅管理等功能模块。用户登录模块实现用户的登录和权限判定;图书管理模块实现了对图书的添加、删除、修改、查询等功能;借书证管理模块实现了对学生的添加、删除、修改、查询等功能;图书借阅管理模块实现了学生对图书的借阅、还书和所借图书的查看等功能。 测试结果表明,本系统实现了图书馆图书管理的主要功能,基本满足图书管理的需要。

1 绪论 图书管理系统的主要功能是实现图书馆图书的借阅和归还的管理自动化,图书新增及销毁的及时化,用户及图书信息的更新,围绕这些主要功能,本系统涉及到以下核心功能:借阅管理,归还管理,图书管理,学生管理。除了这些核心功能外,还包括一些基本和辅助的功能,它们是:图书信息管理,查询功能等。 该系统设计的主要目标是: 设计一个图书馆管理系统,该系统主要功能分为图书查询、图书借阅归还和图书管理三大部分。在图书查询模块中要求用户能在浏览器中分别书名、著译者、类型等条件查询;在图书管理模块中要求能完成如办理借书证(即添加新的学生)、新书录入、借书还书登记、图书修改等日常管理功能。 (1)网站前台设计:前台供学生使用,学生登录后有如下权利 ①图书查询:用户可以按多种方式对图书库中的图书进行查询; ②借阅信息查询:用户可以查看自己的历史借阅信息。 (2)网站后台设计:后台是供管理员使用的,管理员登陆后有如下权利 ①办理借阅证:将学生信息填写完整,在数据库中注册新用户; ②书籍的录入及删除:可以对现有图书库中的图书进行删除,也可以添加新书; ③借书还书登记:普通用户借阅或归还图书时,管理员将在借阅信息表中添加相应的记录; ④图书修改:管理员可以对现有图书的详细信息进行修改。

一个简单的文件系统的详细设计操作系统课程设计

计算机系综合性实验告实验报 课程名称操作系统实验报告 一个简单地文件系统地详细设计. 一个简单地文件系统地详细设计一、实验目地 (1)阅读并调试一个简单地文件系统,模拟文件管理地工作过程.从而对各种文件操作命令地实质内容和执行过程有比较深入地了解. (2)了解设计一个n个用户地文件系统,每个用户可以保存M个文件.用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write 等命令. 二、实验要求 1、根据流程图阅读所给文件系统源程序,并对源程序加以注释(注释量达70%以上). 2、修改、完善该系统,指出程序地bug. 三、文件系统功能设计 1. 功能设计 该文件系统是一个多用户、多任务地文件系统.对用户和用户地文件数目并没有上限.也就是说该系统允许任何用户申请空间,而且在其目录下地文件数目并不做任何地限制. 该系统可以支持地操作命令如下: ①bye——用户注销命令.当使用该命令时,用户退出系统,注销该用户功能设计并回到登陆界面. 命令格式:bye ②close——删除用户注册信息命令.执行该命令后,用户在系统中地所有信息,包括该用户目录下地所有文件都被删除.命令执行完成后返回登陆界面. 命令格式:close ③create——在当前目录下创建一个文件,且该文件不能跟当前已有地文件重名.该文件地管理信息登记在用户文件信息管理模块中.执行完该命令后回到执行命令行. 命令格式:create>file1 其中:“>”符为提示符,file1为要创建地文件名. ④delete——删除当前用户目录下地一个文件,命令执行完毕返回至命令行. 命令格式:delete>file1 其中:file1为要删除地文件名.

操作系统原理课程设计文件管理系统方案

操作系统原理课程设计 文件管理系统 院系:计算机学院三系 班级:计软05–1班 姓名:韩宇 学号:35号 指导教师:益民 2007年7 月4 日

操作系统原理课程设计任务书 一、题目:文件系统管理 二、设计要求 (1)由鲁建成,韩宇,肖鹏完成设计与实现。 (2)查阅相关资料,自学具体课题中涉及到的新知识。 (3)采用结构化、模块化程序设计方法,功能要完善,具有一定的创新。 (4)所设计的程序应有输入、输出。 一. (5)按要求写出课程设计报告,并于设计结束后1周提交。其主要容包括:封 皮、课程设计任务书,指导教师评语与成绩、目录、概述、需求分析、 概要设计、详细设计、软件的调试、总结、启谢、附录:带中文注释的程 序清单、参考文献。报告一律用 A4 纸打印,中文字体为宋体,西文字体用 Time New Roma,一律用小四号字,行距采用“固定值” 18 磅,首行缩进 2 字符。总体设计应配合软件总体模块结构图来说明软件应具有的功能。详 细设计应用传统或 N-S 流程图和屏幕抓图说明,调试的叙述应配合出错场 景的抓图来说明出现了哪些错误,如何解决的。 三、课程设计工作量 由于是设计小组团结协作完成设计任务,一般每人的程序量在200 行有效程序行左右,不得抄袭。 四、课程设计工作计划 2007 年 6 月 18 日,指导教师讲课,学生根据题目准备资料; 2007 年 6 月 19 日,进行总体方案设计; 2007 年 6 月 20 日~ 2007 年 6 月 25 日,完成程序模块并通过独立编译; 2007 年 6 月 26 日~ 2007 年 6 月 27 日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行; 2007 年 6 月 27 日~ 2007 年 6 月 29 日,验收、撰写报告; 2007 年 6 月 29 日下午,验收或总结。 指导教师签章: 教研室主任签章

如何实现一个文件系统

如何实现一个文件系统 本文作者: 康华:计算机硕士,主要从事Linux操作系统内核、Linux技术标准、计算机安全、软件测试等领域的研究与开发工作,现就职于信息产业部软件与集成电路促进中心所属的MII-HP Linux软件实验室。如果需要可以联系通过kanghua151@https://www.360docs.net/doc/a216377648.html,联系他。 摘要:本文目的是分析在Linux系统中如何实现新的文件系统。在介绍文件系统具体实现前先介绍文件系统的概念和作用,抽象出了文件系统概念模型。熟悉文件系统的内涵后,我们再近一步讨论Linux系统中和文件系统的特殊风格和具体文件系统在Linux中组成结构,为读者勾画出Linux中文件系统工作的全景图。最后,我们再通过Linux中最简单的Romfs 作实例分析实现文件系统的普遍步骤。(我们假定读者已经对Linux文件系统初步了解) 什么是文件系统 首先要谈的概念就是什么是文件系统,它的作用到底是什么。 文件系统的概念虽然许多人都认为是再清晰不过的了,但其实我们往往在谈论中或多或少地夸大或片缩小了它的实际概念(至少我时常混淆),或者说,有时借用了其它概念,有时说的又不够全面。 比如在操作系统中,文件系统这个术语往往既被用来描述磁盘中的物理布局,比如有时我们说磁盘中的“文件系统”是EXT2或说把磁盘格式化成FAT32格式的“文件系统”等——这时所说的“文件系统”是指磁盘数据的物理布局格式;另外,文件系统也被用来描述内核中的逻辑文件结构,比如有时说的“文件系统”的接口或内核支持Ext2等“文件系统”——这时所说的文件系统都是内存中的数据组织结构而并非磁盘物理布局。还有些时候说“文件系统”负责管理用户读写文件——这时所说的“文件系统”往往描述操作系统中的“文件管理系统”,也就是文件子系统。 虽然上面我们列举了混用文件系统的概念的几种情形,但是却也不能说上述说法就是错误的,因为文件系统概念本身就囊括众多概念,几乎可以说在操作系统中自内存管理、系统调度到I/O系统、设备驱动等各个部分都和文件系统联系密切,有些部分和文件系统甚至未必能明确划分——所以不能只知道文件系统是系统中数据的存储结构,一定要全面认识文件系统在操作系统中的角色,才能具备自己开发新文件系统的能力。 为了澄清文件系统的概念,必须先来看看文件系统在操作系统中处于何种角色,分析文件系统概念的内含外延。所以我们先抛开Linux文件系统的实例,而来看看操作系统中文件系统的普遍体系结构,从而增强对文件系统的理论认识。 下面以软件组成的结构图1[1]的方式描述文件系统所涉及的内容。 图1 :文件系统体系结构层次图 1[1]请参见OPERATION SYSTEMS INTERNALS AND DESIGN PRINCIPLES一书第12章

操作系统精髓与设计原理-第12章-文件管理

第12章文件管理 复习题: 12.1、域和记录有什么不同? 答:域(field)是基本数据单位。一个域包含一个值。记录(record)是一组相关的域的集合,它可以看做是应用程序的一个单元。 12.2、文件和数据库有什么不同? 答:文件(file)是一组相似记录的集合,它被用户和应用程序看做是一个实体,并可以通过名字访问。数据库(database)是一组相关的数据集合,它的本质 特征是数据元素间存在着明确的关系,并且可供不同的应用程序使用。 12.3、什么是文件管理系统? 答:文件管理系统是一组系统软件,为使用文件的用户和应用程序提供服务。12.4、选择文件组织时的重要原则是什么? 答:访问快速,易于修改,节约存储空间,维护简单,可靠性。 12.5、列出并简单定义五种文件组织。 答:堆是最简单的文件组织形式。数据按它们到达的顺序被采集,每个记录由一串数据组成。顺序文件是最常用的文件组织形式。在这类文件中,每个记录 都使用一种固定的格式。所有记录都具有相同的长度,并且由相同数目、长度 固定的域按特定的顺序组成。由于每个域的长度和位置已知,因此只需要保存 各个域的值,每个域的域名和长度是该文件结构的属性。索引顺序文件保留 了顺序文件的关键特征:记录按照关键域的顺序组织起来。但它还增加了两个 特征:用于支持随机访问的文件索引和溢出文件。索引提供了快速接近目标记 录的查找能力。溢出文件类似于顺序文件中使用的日志文件,但是溢出文件中 的记录可以根据它前面记录的指针进行定位。索引文件:只能通过索引来访 问记录。其结果是对记录的放置位置不再有限制,只要至少有一个索引的指针 指向这条记录即可。此外,还可以使用长度可变的记录。直接文件或散列 文件:直接文件使用基于关键字的散列。 12.6、为什么在索引顺序文件中查找一个记录的平均搜索时间小于在顺序文件中的平均 搜索时间? 答:在顺序文件中,查找一个记录是按顺序检测每一个记录直到有一个包含符合条件的关键域值的记录被找到。索引顺序文件提供一个执行最小穷举搜索的索引 结构。 12.7、对目录执行的典型操作有哪些? 答:搜索,创建文件,删除文件,显示目录,修改目录。 12.8、路径名和工作目录有什么关系? 答:路径名是由一系列从根目录或主目录向下到各个分支,最后直到该文件的路径 中的目录名和最后到达的文件名组成。工作目录是一个这样的目录,它是含有用 户正在使用的当前目录的树形结构。 12.9、可以授予或拒绝的某个特定用户对某个特定文件的访问权限通常有哪些? 答:无(none),知道(knowledge),执行(execution),读(reading),追加(appending), 更新(updating),改变保护(changing protection),删除(deletion)。 12.10、列出并简单定义三种组块方式。 答:固定组块(fixed blocking):使用固定长度的记录,并且若干条完整的记录被保存在一个块中。在每个块的末尾可能会有一些未使用的空间,称为内部碎片。

简单文件系统的实现实验报告

操作系统课程设计报告简单文件系统的实现 专业: 班级: 姓名: 学号: 老师:

一、课程设计的目的 1. 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。 二、课程设计要求 1. 在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。2文件存储空间的分配可采用显式链接分配或其他的办法。 3空闲磁盘空间的管理可选择位示图或其他的办法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT中。 文件目录结构采用多级目录结构。为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。 要求提供以下有关的操作命令: my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。 my_mkdir:用于创建子目录。 my_rmdir:用于删除子目录。 my_ls:用于显示目录中的内容。 my_cd:用于更改当前目录。 my_create:用于创建文件。 my_open:用于打开文件。 my_close:用于关闭文件。 my_write:用于写文件。 my_read:用于读文件。 my_rm:用于删除文件。 my_exitsys:用于退出文件系统。 三、程序的设计细想和框图 1.打开文件函数fopen() (1)格式:FILE *fopen(const char *filename,const char *mode) (2)功能:按照指定打开方式打开指定文件。 (3)输入参数说明: filename:待打开的文件名,如果不存在就创建该文件。 mode:文件打开方式,常用的有: "r":为读而打开文本文件(不存在则出错)。 "w":为写而打开文本文件(若不存在则创建该文件;反之,则从文件起始位置写,原内容将被覆盖)。 "a":为在文件末尾添加数据而打开文本文件。(若不存在则创建该文件;反之,在原文件末尾追加)。 "r+":为读和写而打开文本文件。(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变) 。 "w+":首先建立一个新文件,进行写操作,随后可以从头开始读。(若文件存在,原内容将全部消失) 。 "a+":功能与"a"相同;只是在文件末尾添加新的数据后,可以从头开始读。 另外,上述模式字符串中都可以加一个“b”字符,如rb、wb、ab、rb+、wb+、ab+等组合,

相关文档
最新文档