关于文件系统的设计

colorwu 2004-02-26 04:06:47
我的实验是要在unix下写一个文件系统,但是完全没有头绪,请各位大侠指教一下!
最好能够提供一个模板,谢谢
...全文
331 点赞 收藏 22
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
王伟晔 2004-09-29
void writeinfile(){
char a[9],b[4],c[]="..";
printf("Input File Name:");
scanf("%s",&a);
printf("Input File Style Name");
scanf("%s",&b);
if(a[0]=='\0')return;
if(b[0]=='f')return;
struct filefloderhead *p=(struct filefloderhead *)(*flod).filestart;
for(unsigned int n=0;n<(((*flod).lenthoffile)/32);n++){
if(strcmp((char*)((*p).filename),&a[0])==0&&strcmp((char*)((*p).stylenam),&b[0])==0){
if((*p).filestart==NULL){
printf("input \'@\'stop edit\n");
int cbe=findfreeblock();
(*p).filestart=(char*)(simdisk+cbe);
mark(cbe);

}
char *chin=(*p).filestart,ch[512];
unsigned int *av=(unsigned int*)&((*p).lenthoffile);
int cc;

while((*av)<512){
scanf("%s",&ch);
cc=0;
do{
if(*(ch+cc)=='@')return;
if(*(ch+cc)=='\0'){*chin=' ';chin++;(*av)++;break;}
*chin=*(ch+cc);
chin++;
(*av)++;
cc++;
}while((*av)<511);
}
return;
}
p++;
}
}

void deletefile(){
char a[9],b[4];
int macc=0;
printf("Input File Name:");
scanf("%s",&a);
printf("Input File Style Name");
scanf("%s",&b);
if(a[0]=='\0')return;
if(b[0]=='f')return;
struct filefloderhead *p=(struct filefloderhead *)(*flod).filestart;
for(unsigned int n=0;n<(((*flod).lenthoffile)/32);n++){
if(macc==1)(*(p-1))=(*p);
if(strcmp((char*)((*p).filename),&a[0])==0&&strcmp((char*)((*p).stylenam),&b[0])==0){
macc=1;
(*(struct filefloderhead *)((*p).gid)).lenthoffile-=sizeof(struct filefloderhead);
if((*p).filestart!=NULL){
reset((int)(((long)(*p).filestart)-(long)simdisk)/512);
}
}

p++;
}
if(macc==1){
(*(p-1))=(*p);
//char aemty[]="\0";
(*p).filename[0]='\0';
(*p).stylenam[0]='\0';

}
}
int usrlogin(){
thisusr=NULL;
thisusr=(struct usr*)malloc(sizeof(struct usr));
printf("Usr I.D.:");
scanf("%s",&((*thisusr).usrid));
printf("Usr Password:");
scanf("%s",&((*thisusr).usrpw));
struct usr* lc=thisusr;
thisusr=(struct usr*)readusrfromfile(diskusr,thisusr);
free(lc);
if(thisusr!=NULL){
char a[9],b[4];
if((*thisusr).root==NULL){
int t=findfreeblock();
(*thisusr).root=(char*)(simdisk+t);
mark(t);
flod=rootf=(struct filefloderhead *)createfile("root","/0",(*thisusr).root,(char *)diskusr);
}//printf("hi!");
else flod=rootf=(struct filefloderhead *)(*thisusr).root;
int cd=0;
do{
cd=0;
//printf("%s",&((*thisusr).usrid));
printf("----------------------------------------------\n");
printf("0.Logout;\n");
printf("1.Create File.\n");
printf("2.Show File Info.\n");
printf("3.Show what in File or in floder.\n");
printf("4.write in file.\n");
printf("5.delete file.\n");
printf("%s@%s>",&(*thisusr).usrid,&(*flod).filename);
scanf("%d",&cd);
switch(cd){
case 0:return 0;break;
case 1:
printf("Input File Name:");
scanf("%s",&a);
printf("Input File Style Name or input 'f' to buile folder:");
scanf("%s",&b);
if(a=='\0')break;
if(b[0]=='f')b[0]='\0';
if((*rootf).filestart==NULL)(*rootf).filestart=(char*)(rootf+sizeof(struct filefloderhead));
createfile(a,b,(*flod).filestart+(*flod).lenthoffile,(char *)flod);
(*flod).lenthoffile=(*flod).lenthoffile+sizeof(struct filefloderhead);
printf("One file or folder buildied\n");
//(struct filefloderhead *)createfile(a,b,,NULL);
break;
case 2:seefileinfo();break;
case 3:showinfile();break;
case 4:writeinfile();break;
case 5:deletefile();break;
default:printf("Bad Command!\n");
}
}while(cd!=0);
}else printf("Bad Usr!\n");
return 0;
}

int mainmenu(){
int cd=0;
printf("----------------------------------------------\n");
printf("0.Exit System;\n");
printf("1.Login System.\n");
printf("root@root>");
scanf("%d",&cd);
switch(cd){
case 0:printf("Thank you!");return 0;break;
case 1:do{}while(usrlogin()!=0);break;
default:printf("Bad Command!\n");
}
return -1;
}
/*void test(){
char qbc[]="c.c";
FILE *q=fopen(qbc,"w");
char *p=(char*)&(*simdisk).data;
for(int n=0;n<512;n++){
fputc(*p,q);
printf("%c",*p++);
}
fclose(q);
}*/

void main(){
printf("Computer Science and Technology Department\n");
printf("OnLine Education College\n");
printf("South China University of Technology\n");
initialize();
//test();
do{}while(mainmenu()!=0);
//char p[10]="Exit\0",q[]="Exit\0";
//scanf("%s",&p);
//if(strcmpear(p,q)!=-1)printf("asdf");
shut();
}
/*
char a[3][9];
scanf("%s %s",&a[0],&a[1],&a[2]);
printf("%s",&a[1]);*/
回复
王伟晔 2004-09-29
void reset(int n){
if(n<513){
struct binarystroy *p=(struct binarystroy*)&((*simdisk).data[n/8]);
switch(n%8){
case 0:(*p).b0=(*p).b0&0;break;
case 1:(*p).b1=(*p).b1&0;break;
case 2:(*p).b2=(*p).b2&0;break;
case 3:(*p).b3=(*p).b3&0;break;
case 4:(*p).b4=(*p).b4&0;break;
case 5:(*p).b5=(*p).b5&0;break;
case 6:(*p).b6=(*p).b6&0;break;
case 7:(*p).b7=(*p).b7&0;break;
}
}
}
void stringcopy(char *p,char q[],int n){
for(int m=0;m<n;m++){
*(p++)=*(q++);
}

}
int findfreeblock(){
struct binarystroy *p=(struct binarystroy *)&(*simdisk).data;
for(int n=0;n<64;n++){
if((*p).b0==0){
return n*8+0;
break;
}
if((*p).b1==0){
return n*8+1;
break;
}
if((*p).b2==0){
return n*8+2;
break;
}
if((*p).b3==0){
return n*8+3;
break;
}
if((*p).b4==0){
return n*8+4;
break;
} if((*p).b2==0){
return n*8+0;
break;
}
if((*p).b5==0){
return n*8+5;
break;
}
if((*p).b6==0){
return n*8+6;
break;
}
if((*p).b7==0){
return n*8+7;
break;
}
}
return -1;
}
struct filefloderhead * writeusrtofile(struct filefloderhead * filep,struct usr *p){
struct usr *q=(struct usr *)(*filep).filestart;
if(q==NULL){
int n=findfreeblock();
(*filep).filestart=(char*)(simdisk+n);
mark(n);
q=(struct usr *)(*filep).filestart;
}
(*(struct usr *)((*filep).filestart+(*filep).lenthoffile))=(*p);
if(((*filep).lenthoffile)!=0)(*((struct usr *)((*filep).filestart+(*filep).lenthoffile)-1)).nexusr=(struct usr *)((*filep).filestart+(*filep).lenthoffile);
//printf("%x\n%s",q+(*filep).lenthoffile,(*p).usrid);
(*filep).lenthoffile+=sizeof(struct usr);
return filep;
}

char * readusrfromfile(struct filefloderhead * filep,struct usr *p){
struct usr *q=(struct usr *)(*filep).filestart;
printf("%c",(*q).usrid[1]);
for(int n=0;n<8;n++){
if((*p).usrid[3]==(*q).usrid[3] &&(*p).usrpw[0]==(*q).usrpw[0])return (char*)q;
q++;
}
//(*p).nexusr=
return NULL;
}
//char* openfil(){
//}
char* createfile(char filn[],char styn[],char *h,char *gid){
struct filefloderhead *nf=(struct filefloderhead *)h;
for(int n=0;n<9;n++){
(*nf).filename[n]=filn[n];
}
for(n=0;n<4;n++){
(*nf).stylenam[n]=styn[n];
}
(*nf).filestart=NULL;
(*nf).gid=gid;
(*nf).lenthoffile=0;
(*nf).read='\0';
(*nf).write='\0';
return h;
}


void initialize()
{
simdisk=(struct block*)calloc(sizeof(struct block),512);
struct block* opdiskblock=simdisk;
char *tchar=(char*)simdisk;
for(int n=1;n<512;n++){
*tchar='\0';tchar++;
}
for(n=1;n<512;n++)*(opdiskblock+n)=*(opdiskblock+n-1);
mark(0);
diskusr=(struct filefloderhead *)createfile("diskusr","sys",&((*simdisk).data[64]),NULL);
(*diskusr).filestart=(char *)(diskusr+1);
struct usr nusr;
nusr.root=NULL;
stringcopy(&nusr.usrid[0],"usr1",8);
stringcopy(&nusr.usrpw[0],"1",8);writeusrtofile(diskusr,&nusr);
stringcopy(&nusr.usrid[0],"usr2",8);
stringcopy(&nusr.usrpw[0],"2",8);writeusrtofile(diskusr,&nusr);
stringcopy(&nusr.usrid[0],"usr3",8);
stringcopy(&nusr.usrpw[0],"3",8);writeusrtofile(diskusr,&nusr);
stringcopy(&nusr.usrid[0],"usr4",8);
stringcopy(&nusr.usrpw[0],"4",8);writeusrtofile(diskusr,&nusr);
stringcopy(&nusr.usrid[0],"usr5",8);
stringcopy(&nusr.usrpw[0],"5",8);writeusrtofile(diskusr,&nusr);
stringcopy(&nusr.usrid[0],"usr6",8);
stringcopy(&nusr.usrpw[0],"6",8);writeusrtofile(diskusr,&nusr);
stringcopy(&nusr.usrid[0],"usr7",8);
stringcopy(&nusr.usrpw[0],"7",8);writeusrtofile(diskusr,&nusr);
stringcopy(&nusr.usrid[0],"usr8",8);
stringcopy(&nusr.usrpw[0],"8",8);writeusrtofile(diskusr,&nusr);
}
//释放资源
void shut()
{
//struct block *p=simdisk;
//free(simdisk);
//for(int n=0;n<512;n++)free(p++);
}

void seefileinfo(){
struct filefloderhead *p=(struct filefloderhead *)(*flod).filestart;
for(unsigned int n=0;n<((*flod).lenthoffile/sizeof(struct filefloderhead));n++){
printf("%s.%s\t %d\n",&((*p).filename),&((*p).stylenam),(*p).lenthoffile);p++;
}
}
void showinfile(){
char a[9],b[4],c[]="..";
printf("Input File Name:");
scanf("%s",&a);
printf("Input File Style Name or input 'f' to goto folder:");
scanf("%s",&b);
if(a[0]=='\0')return;
if(b[0]=='f')b[0]='\0';
if(strcmp(&c[0],&a[0])==0){flod=(struct filefloderhead *)(*flod).gid;return;}
struct filefloderhead *p=(struct filefloderhead *)(*flod).filestart;
for(unsigned int n=0;n<(((*flod).lenthoffile)/32);n++){
if(strcmp((char*)((*p).filename),&a[0])==0){
if(b[0]=='\0'){
flod=(struct filefloderhead *)p;
if((*p).filestart==NULL){
int cbe=findfreeblock();
(*p).filestart=(char*)(simdisk+cbe);
mark(cbe);
return;
}
}
if(strcmp((char*)((*p).stylenam),&b[0])==0){
char *ch=(*p).filestart;
unsigned int cc=0;
while(cc<((*p).lenthoffile)){
putchar(*(ch+cc));
cc++;
}
putchar('\n');
}
}
p++;
}

}

回复
王伟晔 2004-09-29
#include "stdio.h"
#include "string.h"
#include "malloc.h"
struct usr{
char usrid[8];
char usrpw[8];
struct usr *nexusr;
char *root;
//char *shell;
};
struct block{
char data[512];
};
struct binarystroy{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
};
struct filefloderhead{
char filename[9];
char stylenam[4];
char *gid;
char *filestart;
char read;
char write;
unsigned int lenthoffile;
};
struct block *simdisk;
struct filefloderhead *diskusr;//*diskinfo,
struct usr *thisusr;
struct filefloderhead *rootf,*flod;
//初始化硬盘
void mark(int n){
if(n<513){
struct binarystroy *p=(struct binarystroy*)&((*simdisk).data[n/8]);
switch(n%8){
case 0:(*p).b0=(*p).b0|1;
break;
case 1:(*p).b1=(*p).b1|1;break;
case 2:(*p).b2=(*p).b2|1;break;
case 3:(*p).b3=(*p).b3|1;break;
case 4:(*p).b4=(*p).b4|1;break;
case 5:(*p).b5=(*p).b5|1;break;
case 6:(*p).b6=(*p).b6|1;break;
case 7:(*p).b7=(*p).b7|1;break;
}
}
}
回复
Andy84920 2004-09-21
http://www.lslnet.com/linux/docs/linux-3609.htm

http://chinaunix.net/jh/23/332958.html

回复
qigang_liu 2004-09-21
楼主死定了!
回复
dfwzy 2004-09-19
这么麻烦
回复
王伟晔 2004-09-19
这是华工网院的操作系统大作业。详细题目如下:
“计算机操作系统”课程设计
一、题目: 模拟UNIX文件系统的设计及实现

即:多用户、多目录的文件系统的设计------对模拟文件系统的管理

参考教材或课件上的有关文件系统的章节(教材和课件的第8章和第9章、教材上的第13章或教材上的第14章)。

二、目的

通过OS子系统的设计、增强OS设计的技巧,达到提高解决实际OS的设计能力的提高。

三、内容

多用户的多级目录的文件系统设计。

四、要求

1. 多用户 :usr1,usr2,usr3,……,usr8 (1-8个用户)

2. 多级目录:可有多级子目录;

3. 具有login (用户登录)

4. 系统初始化(建文件卷、提供登录模块)

5. 文件的创建: create

6. 文件的打开:open

7. 文件的读:read

8. 文件的写:write

9. 文件关闭:close

10. 删除文件:delete

11. 创建目录(建立子目录):mkdir

12. 改变当前目录:cd

13. 列出文件目录:dir

14. 退出:logout

五、课程设计说明书的要求

1. 设计思想说明

2. 文件系统结构的说明

3. 数据结构的说明

4. 各模块的算法流程图

5. 程序清单:注意加注释(包含关键字、方法、变量等),在每个模块前加注释;

6. 使用说明书(即用户手册)(内容包含如何登录、退出、读、写、等操作说明)

7. 体会,建议

六、提示

1. 设计手段

申请1M 内存空间来作为文件系统的空间,考虑用malloc()或calloc()申请;

2. 文件卷的组织:将文件卷分块、用位示图来管理;块的大小可设成512字节,块数为512块,可用第0#块的前半部存作为位示图;

3. 系统结构

(1) 块管理层:

分块分配、块回收、块读、块写等

(2) 文件控制块层(FCB)

目录查找namei(),iget(),iput()

(3) 文件管理层

具有打开文件 open( ),close( )等;

(4) 命令解释层

4. 数据结构

(1) 目录结构

(2) FCB结构

(3) 打开文件结构

(4) 用户结构

七、注意问题

1. 不能用系统原来的文件系统的功能。
回复
王伟晔 2004-09-19
这里水淹~!一看又是一个华工网院的。×.×
回复
expert2000 2004-07-23
学习,帮顶,楼主给点分我就能提高。^!^
回复
kaphoon 2004-07-23
难啊~
回复
sharkhuang 2004-04-25
有必要吗?unix本来就有!你说你移植到没有平台上差不多.
回复
Beover1984 2004-04-25
还要涉及到硬件存储的部分吧?这个好象很难
回复
新自由呼吸 2004-04-24
那可是真的复杂的
自己能力不足,帮你UP下
回复
colorwu 2004-04-23
如果是做一个模拟它功能的系统,其实还是挺简单,但是如果实际涉及到它的存储机制的话,我能力不够,呵呵!
回复
SeekTruth 2004-04-03


参考开源OS的代码.
回复
skywater 2004-04-02
文件系统,个人觉得无非就是一些对文件的管理和操作,实现这些应该就可以了吧。
例如:目录管理——新建,删除,重命名,文件管理——新建,删除,重命名等等,
回复
yjh1982 2004-04-02
gz
回复
autoegg 2004-04-02
linux源代码不是开放的吗?找其中的代码段看一下吧。不过个人认为比较麻烦。
回复
柯本 2004-03-31
linux不是有全套系统代码吗?可参考一下,不过写一个文件确不是件简单的事
回复
yeswelkin 2004-03-31
曾经做过,不过自己做得不好。
回复
加载更多回复
相关推荐
基于java的企业人事管理系统设计--软件工程课程设计(含源码与论文设计).rar 1 引言 4 1.1 课程设计目标 4 1.2 编程工具(编程环境)介绍 4 1.3 实施时间及主要实施步骤 4 2 需求分析 5 3 系统总体设计 6 4 数据库设计 6 5 主要功能模块的设计与实现 10 5.1 功能模块1详细设计(综合查询员工信息)..........................................................10 5.1.1 详细设计.......................................................................................................10 5.1.2 算法流程........................................................................................................15 5.1.3 界面设计及测试结果.....................................................................................15 6 调试分析 15 7 用户手册 16 8 测试结果 17 8.1 员工信息的添加...................................................................................................17 8.2 员工信息的修改...................................................................................................17 8.3 员工信息的删除...................................................................................................18 8.4 员工信息的综合查询...........................................................................................18 8.5 员工信息按性别统计的结果................................................................................19 8.6 员工信息按状态统计的结果...............................................................................19 8.7 员工信息按职称统计的结果................................................................................20 9 结论 20 10 参考文献 20
发帖
工具平台和程序库
创建于2007-09-28

2.4w+

社区成员

C/C++ 工具平台和程序库
申请成为版主
帖子事件
创建了帖子
2004-02-26 04:06
社区公告
暂无公告