版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 專 業(yè):計算機科學與技術(shù)</p><p> 學 號:********</p><p> 姓 名:***</p><p> 提交日期:2013-3-8</p><p><b> 【設(shè)計目的】</b></p><p> ?。?)本實驗的目的是通過一個簡單
2、多用戶文件系統(tǒng)的設(shè)計,加深理解文件系統(tǒng)的內(nèi)部功能和內(nèi)部實現(xiàn)。</p><p> (2)結(jié)合數(shù)據(jù)結(jié)構(gòu)、程序設(shè)計、計算機原理等課程的知識,設(shè)計一個二級文件系統(tǒng),進一步理解操作系統(tǒng)。</p><p> (3)通過分對實際問題的分析、設(shè)計、編程實現(xiàn),提高學生實際應(yīng)用、編程的能力</p><p><b> 【設(shè)計內(nèi)容】</b></p>
3、<p><b> 二級文件系統(tǒng)設(shè)計</b></p><p><b> 【實驗環(huán)境】</b></p><p><b> C++/VC++</b></p><p><b> 【相關(guān)知識綜述】</b></p><p><b> 1
4、.背景知識</b></p><p><b> ?。?)外存管理</b></p><p> 文件系統(tǒng)是一個含有大量的文件及其屬性,對文件進行操作、管理的軟件,以及向用戶提供使用文件的接口的一個集合。在邏輯上它的層次結(jié)構(gòu)是這樣的:</p><p> 作為產(chǎn)品的操作系統(tǒng)有各自的文件系統(tǒng)。比如MS的WINDOWS系列使用的是FAT16、
5、FAT32或NTFS的文件系統(tǒng)、LINUX使用的是EXT2、EXT3文件系統(tǒng)等等。</p><p> ?。?)linux的EXT2文件系統(tǒng)</p><p> linux使用一個叫虛擬文件系統(tǒng)的技術(shù)從而可以支持多達幾十種的不同文件系統(tǒng),而EXT2是linux自己的文件系統(tǒng)。它有幾個重要的數(shù)據(jù)結(jié)構(gòu),一個是超級塊,用來描述目錄和文件在磁盤上的物理位置、文件大小和結(jié)構(gòu)等信息。inode也是一個重
6、要的數(shù)據(jù)結(jié)構(gòu)。文件系統(tǒng)中的每個目錄和文件均由一個inode描述。它包含:文件模式(類型和存取權(quán)限)、數(shù)據(jù)塊位置等信息。</p><p> 一個文件系統(tǒng)除了重要的數(shù)據(jù)結(jié)構(gòu)之外,還必須為用戶提供有效的接口操作。比如EXT2提供的OPEN/CLOSE接口操作。</p><p> ?。?)用內(nèi)存來模擬外存</p><p> 真正的文件系統(tǒng)對外存進行管理,涉及到許多硬件、
7、設(shè)備管理方面的底層技術(shù),一方面這些技術(shù)不屬于操作系統(tǒng)核心內(nèi)容,一方面過多的內(nèi)容不免造成實驗者顧此失彼,所以這里推薦一種使用內(nèi)存來模擬外存的方式,可以跳過這些硬件技術(shù)而直接把精力放在數(shù)據(jù)結(jié)構(gòu)設(shè)計和操作算法設(shè)計上面。</p><p> 假定pInode是一個指向inode結(jié)構(gòu)的指針,而且它已經(jīng)放入的需要放入的數(shù)值了,現(xiàn)在需要將其寫入到特定位置??捎萌缦麓a:</p><p><b>
8、; ……</b></p><p> fd=fopen(“filesystem”,”w+b”); //fd是FILE指針類型,w便是寫方式,b表示二進制</p><p> fseek(fd, specific_area,SEEK_SET);// fd是文件指針;specific_area為整形,</p><p> // 為需要入p
9、Inode的位置</p><p> fwrite(pInode, sizeof(inode), 1,fd); // 寫入pInode信息</p><p><b> 2、原理算法</b></p><p> 本文件系統(tǒng)采用兩級目錄,其中第一級對應(yīng)于用戶賬號,第二級對應(yīng)于用戶帳號下的文件。另外,為了簡便文件系統(tǒng)未考慮文件共享,文件系統(tǒng)安全以及管
10、道文件與設(shè)備文件等特殊內(nèi)容。</p><p> 首先應(yīng)確定文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):主目錄、子目錄及活動文件等。主目錄和子目錄都以文件的形式存放于磁盤,這樣便于查找和修改。</p><p> 用戶創(chuàng)建的文件,可以編號存儲于磁盤上。如:file0,file1,file2…并以編號作為物理地址,在目錄中進行登記。</p><p><b> 【設(shè)計思路】<
11、/b></p><p><b> 1、數(shù)據(jù)結(jié)構(gòu)</b></p><p> #define MAXNAME 25 /*mfdname,ufdname,filename的最大長度*/</p><p> #define MAXCHILD 50 /*最大的子文件個數(shù)*/</p><p> #define MAX
12、(MAXCHILD*MAXCHILD) /*物理地址計數(shù)fpaddrno的最大長度*/</p><p> typedef struct /*結(jié)構(gòu)體OSFILE(文件)*/</p><p><b> {</b></p><p> int fpaddr; /*文件的物理地址號0,1,2...*/</p&
13、gt;<p> int flength; /*文件的長度*/</p><p> int fmode; /*文件模式:0-Read Only;1-Write Only;2-Read and Write;3-protrcted;*/</p><p> char fname[MAXNAME]; /*文件名*/</p>
14、<p><b> } OSFILE;</b></p><p> typedef struct /*結(jié)構(gòu)體OSUFD(用戶目錄)*/</p><p><b> {</b></p><p> char ufdname[MAXNAME]; /*ufd的名字*/</p><p>
15、; OSFILE ufdfile[MAXCHILD]; /*ufd自己的文件*/</p><p><b> }OSUFD;</b></p><p> typedef struct /*結(jié)構(gòu)體OSUFD'LOGIN(用戶注冊)*/</p><p><b> {</b></p><p&
16、gt; char ufdname[MAXNAME]; /*ufd的名字*/</p><p> char ufdpword[8]; /*ufd的密碼*/</p><p> } OSUFD_LOGIN;</p><p> typedef struct /*文件打開模式*/</p><p><
17、b> {</b></p><p> int ifopen; /*打開情況:0-close,1-open*/</p><p> int openmode; /*讀寫模式0-read only,1-write only,2-read and write*/</p><p> }OSUFD_OPENMODE;</p>&
18、lt;p> OSUFD *ufd[MAXCHILD]; /*ufd及ufd自己的文件(指針型)*/</p><p> OSUFD_LOGIN ufd_lp; /*建立了一個OSUFD_LOGIN型的 ufd_lp*/</p><p> int ucount=0; /*mfd的ufd的個數(shù)*/</p><p> int fcount[MAX
19、CHILD]; /*ufd自己的文件個數(shù)*/</p><p> int loginsuc=0; /*是否成功登陸,1成功*/</p><p> char username[MAXNAME]; /*記錄注冊的用戶名*/</p><p> char dirname[MAXNAME];/*記錄文件當前的目錄*/</p><p> int
20、 fpaddrno[MAX]; /*記錄文件的物理地址num*/</p><p> OSUFD_OPENMODE ifopen[MAXCHILD][MAXCHILD]; /*創(chuàng)建一個OSUFD_OPENMODE型的數(shù)組用于記錄每個文件的打開情況和讀寫模式*/</p><p> FILE *fp_mfd,*fp_ufd,*fp_file_p,*fp_file; /*定義FILE * 型
21、的文件指針,用于讀文件*/</p><p><b> 2、主要的函數(shù)說明</b></p><p> void LoginF() /*用戶注冊登錄*/</p><p> void DirF() /*顯示文件系統(tǒng)的所有文件*/</p><p> void CdF() /*改變路徑*/</p>&l
22、t;p> void CreateF() /*創(chuàng)建文件*/</p><p> void DeleteF() /*刪除文件*/</p><p> void ModifyFM() /*改變文件模式*/</p><p> void OpenF() /*打開文件*/</p><p> void CloseF() /*關(guān)閉文件*/&
23、lt;/p><p> void ReadF() /*讀文件*/</p><p> void WriteF() /*寫文件*/</p><p> void QuitF() /*退出文件系統(tǒng)*/</p><p> void clrscr() /*清屏*/</p><p> void help(void) /*幫助*
24、/</p><p><b> 其他重要輔助函數(shù):</b></p><p> char *rtrim(char *str) /*移除最右邊的空格*/</p><p> char *ltrim(char *str) /*移除最左邊的空格*/</p><p> void SetPANo(int RorW) /*設(shè)
25、置物理地址號(表示該地址號是否被用了0-未用,1-已用),RorW是0-read,1-write*/</p><p> void InputPW(char *password) /*輸入密碼并使用'*'代替*/</p><p> int ExistD(char *dirname) /*目錄是否存在,存在返回第i個,不存在返回0*/</p><p&
26、gt; int ExistF(char *filename) /*文件是否存在,返回返回第i個,不存在返回0*/</p><p> int FindPANo() /*找出要分配的物理地址號*/</p><p> int WriteF1() /*創(chuàng)建文件中的寫文件*/</p><p> 3、程序流程設(shè)計:對于自己實現(xiàn)的4個功能:</p>&
27、lt;p> ?。?)open():</p><p> ?。?)close():</p><p> (3)write():</p><p><b> ?。?)delete</b></p><p><b> 【源程序清單】</b></p><p> #include
28、"stdio.h"</p><p> #include "string.h"</p><p> #include "conio.h"</p><p> #include "stdlib.h"</p><p> #define MAXNAME 25 /*m
29、fdname,ufdname,filename的最大長度*/</p><p> #define MAXCHILD 50 /*最大的子文件個數(shù)*/</p><p> #define MAX (MAXCHILD*MAXCHILD) /*物理地址計數(shù)fpaddrno的最大長度*/</p><p> typedef struct /*結(jié)構(gòu)體OSFILE(文件)*/&
30、lt;/p><p><b> {</b></p><p> int fpaddr; /*文件的物理地址號0,1,2...*/</p><p> int flength; /*文件的長度*/</p><p> int fmode; /*文件模式:0-R
31、ead Only;1-Write Only;2-Read and Write;3-protrcted;*/</p><p> char fname[MAXNAME]; /*文件名*/</p><p><b> } OSFILE;</b></p><p> typedef struct /*結(jié)構(gòu)體OSUFD(用戶目錄)
32、*/</p><p><b> {</b></p><p> char ufdname[MAXNAME]; /*ufd的名字*/</p><p> OSFILE ufdfile[MAXCHILD]; /*ufd自己的文件*/</p><p><b> }OSUFD;</b></
33、p><p> typedef struct /*結(jié)構(gòu)體OSUFD'LOGIN(用戶注冊)*/</p><p><b> {</b></p><p> char ufdname[MAXNAME]; /*ufd的名字*/</p><p> char ufdpword[8]; /
34、*ufd的密碼*/</p><p> } OSUFD_LOGIN;</p><p> typedef struct /*文件打開模式*/</p><p><b> {</b></p><p> int ifopen; /*ifopen:0-close,1-open*/</p><
35、;p> int openmode; /*0-read only,1-write only,2-read and write,3-protected*/</p><p> }OSUFD_OPENMODE;</p><p> OSUFD *ufd[MAXCHILD]; /*ufd及ufd自己的文件(指針型)*/</p><p> OSUFD_LOG
36、IN ufd_lp; /*建立了一個OSUFD_LOGIN型的 ufd_lp*/</p><p> int ucount=0; /*mfd的ufd的個數(shù)*/</p><p> int fcount[MAXCHILD]; /*ufd自己的文件個數(shù)*/</p><p> int loginsuc=0; /*是否成功登陸*/</p><
37、;p> char username[MAXNAME]; /*記錄注冊的用戶名*/</p><p> char dirname[MAXNAME];/*記錄文件當前的目錄*/</p><p> int fpaddrno[MAX]; /*記錄文件的物理地址num*/</p><p> OSUFD_OPENMODE ifopen[MAXCHILD][MAX
38、CHILD]; /*創(chuàng)建一個OSUFD_OPENMODE型的數(shù)組用于記錄每個文件的狀態(tài)(打開/關(guān)閉)*/</p><p> FILE *fp_mfd,*fp_ufd,*fp_file_p,*fp_file; /*定義FILE * 型的文件指針,用于讀文件*/</p><p> void clrscr() /*清屏*/</p><p><b> {&
39、lt;/b></p><p> system("cls");</p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> int i,choice1; /*cho
40、ice錄選擇的命令的號*/</p><p> char choice[50]; /*選擇表達式:dir,create,delete,open,delete,modify,read,write*/</p><p> int choiceend=1; /*是否選擇結(jié)束*/</p><p> char *rtrim(char *str); /*移除最右邊的空格
41、*/</p><p> char *ltrim(char *str); /*移除最左邊的空格*/</p><p> void LoginF(); /*用戶注冊登錄*/</p><p> void DirF(); /*顯示文件系統(tǒng)的所有文件*/</p><p> void CdF(); /*改變路徑*/</p>&
42、lt;p> void CreateF(); /*創(chuàng)建文件*/</p><p> void DeleteF(); /*刪除文件*/</p><p> void ModifyFM(); /*改變文件模式*/</p><p> void OpenF(); /*打開文件*/</p><p> void CloseF(); /*關(guān)
43、閉文件*/</p><p> void ReadF(); /*讀文件*/</p><p> void WriteF(); /*寫文件*/</p><p> void QuitF(); /*退出文件系統(tǒng)*/</p><p> void help();</p><p> if((fp_mfd=fopen(&quo
44、t;c:\\osfile\\mfd","rb"))==NULL) /*rb表示二進制讀的方式打開,看他是否為空*/ </p><p><b> {</b></p><p> fp_mfd=fopen("c:\\osfile\\mfd","wb"); /*rb表示二進制寫的方式打開,沒有
45、相當于新創(chuàng)建一個mfd*/ </p><p> fclose(fp_mfd);</p><p><b> }</b></p><p> for(i=0;i<MAX;i++) </p><p> fpaddrno[i]=0; /*初始的時候?qū)⑽锢淼刂穘um設(shè)為0*/</p><p>
46、; clrscr(); /*清屏*/</p><p> LoginF(); /*用戶注冊登錄*/</p><p> clrscr();</p><p> if(loginsuc==1) /*登陸成功*/</p><p><b> {</b></p><p><b>
47、 while (1)</b></p><p><b> {</b></p><p> if (choiceend==1) /*正確命令*/</p><p><b> {</b></p><p> printf("\n\nC:\\%s>",str
48、upr(dirname));</p><p><b> }</b></p><p> else printf("Bad command or file name.\nC:\\%s>",strupr(username)); /*錯誤命令*/</p><p> gets(choice);</p>&l
49、t;p> strcpy(choice,ltrim(rtrim(strlwr(choice)))); /*strlwr把輸入的choice變?yōu)樾懭サ艨崭窈罂截惖絚hoice*/</p><p> if (strcmp(choice,"dir")==0) /*根據(jù)用戶不同的命令輸入獲得不同的choice1值*/</p><p> choice1=1;&
50、lt;/p><p> else if(strcmp(choice,"create")==0) choice1=2;</p><p> else if(strcmp(choice,"delete")==0) choice1=3;</p><p> else if(strcmp(choice,"attrib"
51、)==0)choice1=4;</p><p> else if(strcmp(choice,"open")==0) choice1=5;</p><p> else if(strcmp(choice,"close")==0) choice1=6;</p><p> else if(strcmp(choice,&quo
52、t;read")==0) choice1=7;</p><p> else if(strcmp(choice,"write")==0)choice1=8;</p><p> else if(strcmp(choice,"exit")==0)choice1=9;</p><p> else if(strcmp(c
53、hoice,"cls")==0) choice1=10;</p><p> else if(strcmp(choice,"cd")==0) choice1=11;</p><p> else if(strcmp(choice,"help")==0) choice1=20;</p><p> else
54、choice1=12;</p><p> switch(choice1) /*根據(jù)不同的輸入的命令對應(yīng)相應(yīng)的命令*/</p><p><b> {</b></p><p> case 1:DirF();choiceend=1;break;</p><p> case 2:CreateF();choice
55、end=1;break;</p><p> case 3:DeleteF();choiceend=1;break;</p><p> case 4:ModifyFM();choiceend=1;break;</p><p> case 5:choiceend=1;OpenF();break;</p><p> case 6:choic
56、eend=1;CloseF();break;</p><p> case 7:choiceend=1;ReadF();break;</p><p> case 8:choiceend=1;WriteF();break;</p><p> case 9:printf("\nYou have exited this system.\n");Q
57、uitF();exit(0);break; /*退出系統(tǒng)*/</p><p> case 10:choiceend=1;clrscr();break;</p><p> case 11:CdF();choiceend=1;break;</p><p> case 20:help();choiceend=1;break;</p><p>
58、 default:choiceend=0; /*其他錯誤命令則選擇結(jié)束*/</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> else printf("\nAccess d
59、enied.\n"); /*登陸不成功*/</p><p><b> }</b></p><p> void help(void) /*幫助*/</p><p><b> {</b></p><p> printf("\nThe Command List\n"
60、;);</p><p> printf("\nCd Dir Attrib Create write Read Open Cls Delete Exit Close\n");</p><p><b> }</b></p><p> char *rtrim(char *str) /*移除右邊的空格*/
61、</p><p><b> {</b></p><p> int n=strlen(str)-1; /*n為串長-1*/</p><p> while(n>=0)</p><p><b> {</b></p><p> if(*(str+n)!='
62、') /*不是空格了,則下一個置為/0結(jié)束符*/</p><p><b> {</b></p><p> *(str+n+1)='\0';</p><p><b> break;</b></p><p><b> }</b></p>
63、<p> else /*是空格,繼續(xù)往回退*/</p><p><b> n--;</b></p><p><b> }</b></p><p> if (n<0) /*空串*/</p><p> str[0]='\0';</p><
64、;p> return str;</p><p><b> }</b></p><p> char *ltrim(char *str) /*移除左邊的空格*/</p><p><b> {</b></p><p> char *rtrim(char *str);</p>
65、<p> strrev(str); /*將str字符串反轉(zhuǎn)*/</p><p> rtrim(str); /*移除右邊的空格*/</p><p> strrev(str); /*將str字符串再反轉(zhuǎn)回來*/</p><p> return str;</p><p><b> }</b></
66、p><p> void LoginF() /*用戶注冊登錄*/</p><p><b> {</b></p><p> char loginame[MAXNAME],loginpw[9],logincpw[9],str[50]; </p><p> int i,j,flag=1;</p><
67、p> char a[25];</p><p> int findout; /*注冊用戶是否存在 1為存在*/</p><p> char *rtrim(char *str); /*移除右邊的空格*/</p><p> char *ltrim(char *str); /*移除左邊的空格*/</p><p> void Inp
68、utPW(char *password); /*輸入密碼并使用'*'代替*/</p><p> void SetPANo(int RorW); /*設(shè)置物理地址num*/</p><p><b> while(1)</b></p><p><b> {</b></p><p&g
69、t; findout=0; </p><p> printf("\n\nLogin Name:");</p><p> gets(loginame);</p><p> ltrim(rtrim(loginame)); /*移除空格*/</p><p> fp_mfd=fopen("c:\\o
70、sfile\\mfd","rb"); /*rb表示以二進制讀的方式打開mfd*/</p><p> for(i=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;i++) /*fread是從mfd中讀,是否有用戶可以讀出,有4個參數(shù)分別是讀出的存儲緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/</p>&l
71、t;p><b> {</b></p><p> if (strcmp(strupr(ufd_lp.ufdname),strupr(loginame))==0) /*檢測轉(zhuǎn)為大寫的用戶名是否存在*/</p><p><b> {</b></p><p> findout=1; /*用戶已存在*/</p
72、><p> strcpy(logincpw,ufd_lp.ufdpword); /*把已存在的密碼ufd_lp.ufdpword拷貝到logincpw*/</p><p><b> }</b></p><p><b> }</b></p><p> fclose(fp_mfd); /*關(guān)閉
73、文件*/</p><p> if (findout==1) /*用戶已存在的情況*/</p><p><b> {</b></p><p> printf("Login Password:");</p><p> InputPW(loginpw); /*輸入密碼并使用'*'代
74、替*/</p><p> if (strcmp(loginpw,logincpw)==0) /*如果用戶輸入的密碼和已存在的相同*/ </p><p><b> {</b></p><p> strcpy(username,strupr(loginame)); /*把輸入的用戶名轉(zhuǎn)成大寫拷貝到username*/</p&g
75、t;<p> strcpy(dirname,username); /*把用戶名拷貝到dirname*/</p><p> fp_mfd=fopen("c:\\osfile\\mfd","rb"); /*以二進制讀的方式打開文件*/</p><p> for(j=0;fread(&ufd_lp,sizeof(OSUFD
76、_LOGIN),1,fp_mfd)!=0;j++)/*fread是從mfd中讀,是否有用戶可以讀出,有4個參數(shù)分別是讀出的存儲緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/</p><p><b> {</b></p><p> strcpy(str,"c:\\osfile\\");</p><p> strcat(s
77、tr,ufd_lp.ufdname); /*str為用戶目錄的路徑*/</p><p> ufd[j]=(OSUFD*)malloc(sizeof(OSUFD)); /*分配建立一個新的ufd*/</p><p> strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdname)); /*ufdname寫入ufd結(jié)構(gòu)體的ufdname*/</p
78、><p> fp_ufd=fopen(str,"rb"); /*打開這個用戶目錄文件*/</p><p> fcount[j]=0; /*新創(chuàng)建的ufd中的文件的個數(shù)為0*/</p><p> for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,f
79、count[j]++)/*fread是從mfd中讀,是否有用戶可以讀出,有4個參數(shù)分別是讀出的存儲緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/</p><p> { /*j用戶的文件個數(shù)也要+1*/</p><p> ifopen[j][i].ifopen=0
80、; </p><p> ifopen[j][i].openmode=4; /*初始化所有的文件打開模式(不是文件自身的模式)*/</p><p><b> }</b></p><p> fclose(fp_ufd); /*關(guān)閉這個ufd*/</p><p><b> }</b&g
81、t;</p><p> fclose(fp_mfd); /*關(guān)閉mfd*/</p><p> ucount=j; /*mfd中的ufd個數(shù)*/</p><p> SetPANo(0); /*設(shè)置物理地址號(表示該地址號是否被用了0-未用,1-已用)*/</p><p> printf("\n\nLogin succes
82、sful! Welcome to this FileSystem\n\n");</p><p> loginsuc=1; /*登陸成功*/</p><p><b> return;</b></p><p><b> }</b></p><p> else /*輸入密碼不正確*/
83、</p><p><b> {</b></p><p> printf("\n\n");</p><p> flag=1; /*標記*/</p><p> while(flag)</p><p><b> {</b></p>&l
84、t;p> printf("Login Failed! Password Error. Try Again(Y/N):");</p><p><b> gets(a);</b></p><p> ltrim(rtrim(a)); </p><p> if (strcmp(strupr(a),"Y&q
85、uot;)==0) /*判斷是否重新輸入*/</p><p><b> {</b></p><p> loginsuc=0;flag=0;</p><p><b> }</b></p><p> else if(strcmp(strupr(a),"N")==0)&
86、lt;/p><p><b> {</b></p><p> loginsuc=0;flag=0;return;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b>&
87、lt;/p><p><b> }</b></p><p> else /*用戶不存在的情況*/</p><p><b> {</b></p><p> printf("New Password(<=8):");</p><p> InputP
88、W(loginpw); /*輸入新密碼并用'*'代替*/</p><p> printf("\nConfirm Password(<=8):"); </p><p> InputPW(logincpw); /*再次輸入密碼并用'*'代替*/</p><p> if (strcmp(loginpw,lo
89、gincpw)==0) /*兩次輸入的密碼相同*/</p><p><b> {</b></p><p> strcpy(ufd_lp.ufdname,strupr(loginame));</p><p> strcpy(ufd_lp.ufdpword,loginpw); /*把輸入的用戶名、密碼記錄到ufd_lp*/</p&
90、gt;<p> fp_mfd=fopen("c:\\osfile\\mfd","ab"); /*以二進制接著寫的方式打開mfd*/</p><p> fwrite(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd); /*把ufd_lp指向的內(nèi)容接著寫入到mfd中*/</p><p> fclo
91、se(fp_mfd);</p><p> strcpy(username,strupr(loginame));</p><p> strcpy(dirname,loginame);</p><p> strcpy(str,"c:\\osfile\\");</p><p> strcat(str,username);
92、 /*形成路徑c:\\osfile\\用戶名*/</p><p> if((fp_ufd=fopen(str,"rb"))==NULL) /*以二進制讀的方式打開,如果為空*/</p><p><b> {</b></p><p> fp_ufd=fopen(str,"wb"); /*以二進制寫
93、的方式打開,即新創(chuàng)建用戶名文件*/</p><p> fclose(fp_ufd);</p><p><b> }</b></p><p> fp_mfd=fopen("c:\\osfile\\mfd","rb"); /*以讀的方式打開mfd*/</p><p> for
94、(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++) /*fread是從mfd中讀,是否有用戶可以讀出,有4個參數(shù)分別是讀出的存儲緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/</p><p><b> {</b></p><p> strcpy(str,"c:\\osfile\\&qu
95、ot;);</p><p> strcat(str,ufd_lp.ufdname); /*str為用戶目錄的路徑*/</p><p> ufd[j]=(OSUFD*)malloc(sizeof(OSUFD)); /*分配建立一個新的ufd*/</p><p> strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdnam
96、e)); /*ufdname寫入ufd結(jié)構(gòu)體的ufdname*/</p><p> fp_ufd=fopen(str,"rb");</p><p> for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++)/*fread是從mfd中讀,是否有用戶可以讀
97、出,有4個參數(shù)分別是讀出的存儲緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/</p><p> {/*j用戶的文件個數(shù)也要+1*/</p><p> ifopen[j][i].ifopen=0; /*初始化所有的文件打開模式(不是文件自身的模式)*/</p><p> ifopen[j][i].openmode=4
98、;</p><p><b> }</b></p><p> fclose(fp_ufd);</p><p><b> }</b></p><p> fclose(fp_mfd); /*關(guān)閉mfd*/</p><p> ucount=j; /*mfd中的ufd個
99、數(shù)*/</p><p> SetPANo(0); /*設(shè)置物理地址號(表示該地址號是否被用了0-未用,1-已用)*/</p><p> printf("\n\nLogin successful! Welcome to this FileSystem\n\n");</p><p> loginsuc=1; /*登陸成功*/</p>
100、;<p><b> return;</b></p><p><b> }</b></p><p> else /*兩次輸入的密碼不同*/</p><p><b> {</b></p><p> printf("\n\n");<
101、/p><p><b> flag=1;</b></p><p> while(flag)</p><p><b> {</b></p><p> printf("Login Failed! Password Error. Try Again(Y/N):");</p>
102、;<p><b> gets(a);</b></p><p> ltrim(rtrim(a));</p><p> if (strcmp(strupr(a),"Y")==0) </p><p><b> {</b></p><p> loginsuc=0;
103、</p><p><b> flag=0;</b></p><p><b> }</b></p><p> else if(strcmp(strupr(a),"N")==0)</p><p><b> {</b></p><p&g
104、t; loginsuc=0;</p><p><b> flag=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b&
105、gt; }</b></p><p><b> }</b></p><p><b> }</b></p><p> void SetPANo(int RorW) /*設(shè)置物理地址號(表示該地址號是否被用了0-未用,1-已用),RorW是0-read,1-write*/</p><p&
106、gt;<b> {</b></p><p><b> int i,j;</b></p><p> if (RorW==0) /*以讀的方式,已存在的用戶*/</p><p><b> {</b></p><p> if((fp_file_p=fopen("c
107、:\\osfile\\file\\file_p","rb"))==NULL) /*如果以二進制讀的方式打開file_p文件找不到*/</p><p><b> {</b></p><p> fp_file_p=fopen("c:\\osfile\\file\\file_p","wb"); /*
108、以二進制寫的方式打開,即創(chuàng)建一個file_p*/</p><p> fclose(fp_file_p);</p><p><b> }</b></p><p> fp_file_p=fopen("c:\\osfile\\file\\file_p","rb"); /*以二進制讀的方式打開file_p*
109、/</p><p> for(i=0;fread(&j,sizeof(int),1,fp_file_p)!=0;i++) /*fread是從fp_file中讀,是否有文件號可以讀出,有4個參數(shù)分別是讀出的存儲緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/</p><p> fpaddrno[j]=1; /*將第j個文件物理地址號置為1,已經(jīng)用了*/</p>
110、<p><b> }</b></p><p> else /*以寫的方式*/</p><p><b> {</b></p><p> fp_file_p=fopen("c:\\osfile\\file\\file_p","wb"); /*以二進制寫的方式打開*/&
111、lt;/p><p> for(i=0;i<MAX;i++)</p><p> if (fpaddrno[i]==1) /*第i個文件已存在*/</p><p> fwrite(&i,sizeof(int),1,fp_file_p); /*記錄物理地址號到fp_file*/</p><p><b> }<
112、;/b></p><p> fclose(fp_file_p);</p><p><b> }</b></p><p> void InputPW(char *password) /*輸入密碼并使用'*'代替*/</p><p><b> {</b></p>
113、;<p><b> int j; </b></p><p> for(j=0;j<=7;j++) /*8位密碼*/</p><p><b> {</b></p><p> password[j]=getch(); /*依次讀入*/</p><p> if ((i
114、nt)(password[j])!=13) /*!=回車*/ </p><p><b> {</b></p><p> if((int)(password[j])!=8) /*!=退格*/ </p><p> putchar('*'); </p><p> else /*=退格*/
115、</p><p><b> {</b></p><p> if (j>0) </p><p><b> {</b></p><p><b> j--;</b></p><p><b> j--;</b><
116、/p><p> putchar('\b');</p><p> putchar(' ');</p><p> putchar('\b');</p><p><b> }</b></p><p><b> else j--;</b
117、></p><p><b> }</b></p><p><b> }</b></p><p> else /*=回車,密碼輸入結(jié)束*/ </p><p><b> {</b></p><p> password[j]='\0
118、';</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> password[j]='\0';</p><p><b>
119、}</b></p><p> void DirF() /*顯示文件系統(tǒng)的所有文件*/</p><p><b> {</b></p><p> int i,j,count=0;</p><p> char sfmode[25],sfpaddr[25],str[25];</p><p
120、> int ExistD(char *dirname); /*目錄是否存在,存在-i個,不存在-0*/</p><p> clrscr(); /*清屏*/</p><p> if (strcmp(strupr(ltrim(rtrim(dirname))),"")!=0) /*dirname不為空,顯示的是當前用戶的所有文件*/</p>&l
121、t;p><b> {</b></p><p> printf("\n\nC:\\%s>dir\n",dirname);</p><p> printf("\n%10s%15s%14s%8s%18s\n","FileName","FileAddress","Fil
122、eLength","Type","FileMode");</p><p> j=ExistD(dirname); /*該目錄是第幾個目錄*/</p><p> for(i=0;i<fcount[j];i++) </p><p><b> {</b></p>&l
123、t;p> if ((i%16==0)&&(i!=0)) /*滿16個清屏*/</p><p><b> {</b></p><p> printf("\nPress any key to continue..");</p><p><b> getch();</b><
124、;/p><p><b> clrscr();</b></p><p> printf("\n%10s%15s%14s%8s%18s\n","FileName","FileAddress","FileLength","Type","FileMode")
125、;</p><p><b> }</b></p><p> itoa(ufd[j]->ufdfile[i].fpaddr,str,10); /*將整形轉(zhuǎn)換為字符串型*/</p><p> strcpy(sfpaddr,"file");</p><p> strcat(sfpaddr,s
126、tr); /*連接成為物理地址 file x */</p><p> if (ufd[j]->ufdfile[i].fmode==0) </p><p> strcpy(sfmode,"Read Only");</p><p> else if(ufd[j]->ufdfile[i].fmode==1) </p>
127、<p> strcpy(sfmode,"Write Only");</p><p> else if(ufd[j]->ufdfile[i].fmode==2)</p><p> strcpy(sfmode,"Read And Write");</p><p><b> else </b
128、></p><p> strcpy(sfmode,"Protect");</p><p> printf("%10s%15s%14d%8s%18s\n",ufd[j]->ufdfile[i].fname,sfpaddr,ufd[j]->ufdfile[i].flength,"<FILE>",sfm
129、ode);</p><p><b> }</b></p><p> printf("\n %3d file(s)\n",fcount[j]);</p><p><b> }</b></p><p> else /*dirname為空,顯示的是上一層目錄(主目錄)的所有文件
130、(各個用戶文件夾)*/</p><p><b> {</b></p><p> printf("\n\nC:\\>dir\n");</p><p> printf("\n%14s%18s%8s\n","DirName","OwnFileCount",&q
131、uot;Type"); /*包括3個項*/</p><p> for(i=0;i<ucount;i++)</p><p><b> {</b></p><p> if ((i%16==0)&&(i!=0)) /*滿16個清屏*/</p><p><b> {<
132、/b></p><p> printf("\nPress any key to continue...");</p><p><b> getch();</b></p><p><b> clrscr();</b></p><p> printf("\n%
133、14s%18s%8s\n","DirName","OwnFileCount","Type");</p><p><b> }</b></p><p> printf("%14s%18d%8s\n",ufd[i]->ufdname,fcount[i],"<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計linux二級文件系統(tǒng)設(shè)計
- 操作系統(tǒng)課程設(shè)計二級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計二級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計----二級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--二級文件系統(tǒng)設(shè)計
- 操作系統(tǒng)課程設(shè)計--二級文件系統(tǒng)(java)
- 操作系統(tǒng)課程設(shè)計--簡單二級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--為linux系統(tǒng)設(shè)計一個簡單的二級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計報告--多級文件系統(tǒng).doc
- 操作系統(tǒng)課程設(shè)計--模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--樹形目錄文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計---文件系統(tǒng)的模擬
- 操作系統(tǒng)課程設(shè)計---模擬文件系統(tǒng)
- 操作系統(tǒng)課程設(shè)計-模擬文件系統(tǒng)
- 操作系統(tǒng)文件系統(tǒng)的設(shè)計與實現(xiàn)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計簡單文件系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設(shè)計--基于linux的模擬文件系統(tǒng)的設(shè)計與實現(xiàn)
評論
0/150
提交評論