操作系統(tǒng)課程設(shè)計Linux二級文件系統(tǒng)設(shè)計
《操作系統(tǒng)課程設(shè)計Linux二級文件系統(tǒng)設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《操作系統(tǒng)課程設(shè)計Linux二級文件系統(tǒng)設(shè)計(25頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 操作系統(tǒng)課程設(shè)計報告 專 業(yè):軟件工程 學(xué) 號: 姓 名:馬 提交日期:2017/1/10 【設(shè)計目的】 1、 通過一個簡單多用戶文件系統(tǒng)的設(shè)計,加深理解文件系統(tǒng)的內(nèi)部功能和內(nèi)部實現(xiàn) 2、 結(jié)合數(shù)據(jù)結(jié)構(gòu)、程序設(shè)計、計算機原理等課程的知識,設(shè)計一個二級文件系統(tǒng),進一步理解操作系統(tǒng) 3、通過對實際問題的分析、設(shè)計、編程實現(xiàn),提高學(xué)生實際應(yīng)用、編程的能力 【設(shè)計內(nèi)容】 為Linux系統(tǒng)設(shè)計一個簡單的二級文件系統(tǒng)。要求做到以下幾點: 1.可以實現(xiàn)下列幾條命令: login
2、 用戶登錄 dir 列目錄 create 創(chuàng)建文件 delete 刪除文件 open 打開文件 close 關(guān)閉文件 read 讀文件 write 寫文件 cd 進出目錄 2.列目錄時要列出文件名,物理地址,保護碼和文件長度 3.源文件可以進行讀寫保護 【實驗環(huán)境】 C++ DevCpp 【設(shè)計思路】 本文件系統(tǒng)采用兩級目錄,其中第一級對應(yīng)于用戶賬號,第二級對應(yīng)于用戶帳號下的文件。另外,為了簡便文件系統(tǒng)未考慮文件共享
3、,文件系統(tǒng)安全以及管道文件與設(shè)備文件等特殊內(nèi)容。 首先應(yīng)確定文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):主目錄、子目錄及活動文件等。主目錄和子目錄都以文件的形式存放于磁盤,這樣便于查找和修改。用戶創(chuàng)建的文件,可以編號存儲于磁盤上。如:file0,file1,file2…并以編號作為物理地址,在目錄中進行登記。 結(jié)構(gòu)體: typedef struct /*the structure of OSFILE*/ { int fpaddr; /*file physical address*/ int flength; /*file le
4、ngth*/ int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write; 3-Protect;*/ char fname[MAXNAME]; /*file name*/ } OSFILE; //存放重要信息 typedef struct /*the structure of OSUFD*/ { char ufdname[MAXNAME]; /*ufd name*/ OSFILE ufdfile[MAXC
5、HILD]; /*ufd own file*/ }OSUFD; //用戶下面的文件 typedef struct /*the structure of OSUFDLOGIN*/ { char ufdname[MAXNAME]; /*ufd name*/ char ufdpword[8]; /*ufd password*/ } OSUFD_LOGIN; typedef struct /*file open mode*/ { int ifopen;
6、 /*ifopen:0-close,1-open*/ int openmode; /*0-read only,1-write only,2-read and write,3-initial*/ }OSUFD_OPENMODE; 主要的函數(shù)說明: void LoginF(); /*LOGIN FileSystem用戶登錄*/ void DirF(); /*Dir FileSystem列目錄*/ void CdF(); /*Change Dir改變目錄*/ void CreateF(); /*Create File創(chuàng)建文件*/ void DeleteF(
7、); /*Delete File刪除文件*/ void ModifyFM(); /*Modify FileMode修改*/ void OpenF(); /*Open File打開文件*/ void CloseF(); /*Close File關(guān)閉文件*/ void ReadF(); /*Read File讀文件*/ void WriteF(); /*Write File寫文件*/ void QuitF(); /*Quit FileSystem離開文件系統(tǒng)*/ void help(); 其他重要函數(shù): void clrscr() //清屏 int ExistD(cha
8、r *dirname) /*Whether DirName Exist,Exist-i,Not Exist-0*/ int ExistF(char *filename) /*Whether FileName Exist,Exist-i,Not Exist-0*/ int FindPANo() /*find out physical address num*/ void SetPANo(int RorW) /*Set physical address num,0-read,1-write*/ void InputPW(char *password) /*input passw
9、ord,use * replace*/ char *ltrim(char *str) /*remove the heading blanks.去除左空白*/ char *rtrim(char *str) /*remove the trailing blanks.去除右空白*/ int WriteF1() /*write file相當(dāng)于置換文件*/ 程序流程說明: 整體流程: 開始 Login(Name/Pw/Cpw) 創(chuàng) 建 文件 打開文件 刪除
10、文件 寫 文件 更改目錄 修改文件屬性 讀文件 關(guān)閉文件 退出系統(tǒng) 清屏 添加 覆蓋 結(jié)束 各部分功能流程: Open: 開始 Open 獲取文件名 文件是否存在? (file>0) 文件名不存在 獲取文件 置為打開狀態(tài) 并獲取文件模式 打開文件成功 結(jié)束
11、 N N Y Delete: 開始 Delete 主目錄是否為空? Y 確認刪除文件在用戶目錄下! N 用戶是否在用戶目錄下? N 只能修改用戶目錄下的文件! Y 接收刪除文件名 獲取文件 文件被打開或被保護? Y 打開或被保護狀態(tài)不可刪除 N 刪除文件,文件
12、數(shù)減一 刪除文件成功! 結(jié)束 Write: 開始 Write 用戶是否在目錄下? N 文件不存在! Y 獲取文件 文件權(quán)限為只寫或讀寫 N 文件為只讀和保護,不允許寫! Y 獲取路徑 1 0 追加 文件寫入成功! 結(jié)束 Close: 開始 Close N 用戶是否在目錄下? 請確認要關(guān)閉的文件是在用戶目錄下!
13、Y 羅列已經(jīng)打開的文件 獲取文件名 獲取物理地址 文件是否處于關(guān)閉狀態(tài)? Y 該文件已被關(guān)閉 N 關(guān)閉文件 文件成功關(guān)閉 結(jié)束 【源程序清單】 Open: void OpenF() /*Open File*/ { printf("\n\nC:\\%s>",strupr(dirname)); //顯示當(dāng)前路徑 int fcoun, i; //定義兩個整形
14、變量 char fname[MAXNAME], fmode[25]; //定義兩個字符串變量 int fmod; //文件模式 printf("\nPlease input FileName:"); gets(fname); //接收打開文件的文件名 ltrim(rtrim(fname)); //去除左右空白 if(ExistF(fname)<0)
15、 //判斷文件是否存在 { //不存在 printf("\nError.文件名 \%s\不存在\n", fname); wgetchar=1; } else { //存在 i=ExistD(username); //獲取用戶物理信息 for(int a=0; a < fcount[i]; a++) //遍歷用戶文件 { if(str
16、cmp(fname, ufd[i]->ufdfile[a].fname)==0) //找到文件 { fcoun=a; break; } } ifopen[i][fcoun].ifopen=1; //將文件狀態(tài)置為打開狀態(tài) printf("Please input OpenMode(0-Read Only, 1-Write Only, 2-Read and Write, 3-Protect)
17、:"); //打開文件模式 gets(fmode); //獲取模式 fmod=atoi(fmode); //將字符串轉(zhuǎn)換為整型 ifopen[i][fcoun].openmode=fmod; //將文件的模式置為
18、OpenMode printf("\nOpen Successed"); wgetchar=1; } } Delete: void DeleteF() /*Delete File*/ { printf("\n\nC:\\%s>",strupr(dirname)); //顯示路徑 char fname[MAXNAME], str[50], str1[50]; //定義三個字符串變量 int i, k, j; int fpaddrno1;
19、 //記錄文件物理地址塊號 if(strcmp(strupr(ltrim(rtrim(dirname))), "")==0){ //判斷主目錄是否為空 printf("\nError.請確認您要刪除的是否在用戶目錄下!\n"); wgetchar=1; } if(strcmp(strupr(dirname), strupr(username))!=0){ //判斷用戶是否在用戶目錄下 printf("\nError.您只能刪除修改自己用戶目錄下的文件哦!\n"); wge
20、tchar=1; } else { printf("\nPlease input FileName:"); gets(fname); //接收刪除的文件名 ltrim(rtrim(fname)); //去除文件名的左右空白 i=ExistF(fname); //用戶文件位置 if(i>=0){ k=ExistD(username); //獲取用戶所在存儲位置
21、 if(ifopen[k][i].ifopen==1){ //文件狀態(tài)處于打開狀態(tài),不許刪除 printf("\n Error.\%s\ 處于打開狀態(tài)!請先關(guān)閉喲!\n", fname); wgetchar=1; } else { if(ufd[k]->ufdfile[i].fmode==3){ //保護文件,不可刪除 prin
22、tf("\nError.\%s\處于被保護狀態(tài)!請先關(guān)閉喲!\n", fname);
wgetchar=1;
} else {
fpaddrno1=ufd[k]->ufdfile[i].fpaddr; //獲取文件的物理地址塊號
fpaddrno[fpaddrno1]=0; //回收物理地址塊號
for(j=i; j 23、 //將文件都向前移動
{
ufd[k]->ufdfile[j]=ufd[k]->ufdfile[j+1]; //將j+1位置為j
}
strcpy(str , "c:\\osfile\\file\\");
itoa(fpaddrno1, str1, 10); //將整數(shù)轉(zhuǎn)化為字符串
strcat 24、(str, str1);
strcat(str, ".txt"); //連接
remove(str); //刪除物理文件
fcount[k--]; //文件個數(shù)減一
printf("\n\%s\is deleted successfully.\n", fname);
wgetchar=1;
25、 }
}
} else {
printf("\nError.\%s\文件不存在!\n", fname); //文件不存在
wgetchar=1;
}
}
}
Write:
void WriteF() /*Write File*/
{
printf("\n\nC:\\%s>",strupr(dirname)); //顯示用戶路徑
int i, k, m=0; // 26、定義整形變量
int length; //定義長度整形變量
char fname[MAXNAME]; //定義文件名字符串
char str[255], str1[255]; //定義兩個字符串變量
if(strcmp(strupr(dirname), strupr(username))!=0) { //判斷用戶是否在用戶目錄下
printf("\nError!請確認您要寫的在用戶目錄下!\n");
wgetch 27、ar=1;
return;
}
printf("\n請先打開文件!\n");
printf("Opened File(s) List:\n");
k=ExistD(dirname); //獲取用戶文件信息
for(i=0; i 28、k]->ufdfile[i].fname);
m++;
}
if(m%4 == 0 && m!=0) //每創(chuàng)建4個文件換一行
printf("\n");
}
printf("\n%d 文件已經(jīng)打開啦!\n", m);
if(m == 0)
wgetchar=1;
if(m!=0) //創(chuàng)建文件
{
printf("\nPle 29、ase input FileName:");
gets(fname); //接收文件名
ltrim(rtrim(fname)); //去除左右空白
i=ExistF(fname); //獲取文件物理地址
if(i>=0) { //文件存在
if(ifopen[k][i].ifopen==1) { //文件處于打開狀態(tài)
if(i 30、fopen[k][i].openmode==1 || ifopen[k][i].openmode==2) { //文件權(quán)限是只寫或讀寫
itoa(ufd[k]->ufdfile[i].fpaddr, str, 10); //獲取文件路徑
strcpy(str1, "file");
strcat(str1, str);
strcpy(str, "c:\\osfile\\file\\") 31、;
strcat(str, str1);
strcat(str, ".txt"); //文件路徑
char str2[3];
int choice=3;
strcpy(str2,"ab");
printf("You can choise [0-Covered W] [1-Additonal W]:"); //選擇追加還是覆蓋
scanf(" %d", &choice);
if( 32、choice == 0) //0-覆蓋
strcpy(str2, "wb");
fp_file=fopen(str, str2); //打開文件
length=WriteF1();
ufd[k]->ufdfile[i].flength=ufd[k]->ufdfile[i].flength+length; //修改文件長度
33、
if(choice == 0)
ufd[k]->ufdfile[i].flength=length;
printf("\n\nYou have write file successfully!!!");
fclose(fp_file); //關(guān)閉文件
wgetchar=0;
} else if(ifopen[k][i].openmode==0) { 34、 //文件處于只讀狀態(tài),不允許寫
printf("\nError.\%s\ 文件以只讀狀態(tài)打開,不允許寫!\n", fname);
wgetchar=1;
} else {
printf("\nError.\%s\ 文件處于關(guān)閉狀態(tài),請先打開!\n", fname);
wgetchar=1;
}
}
} else {
p 35、rintf("\nError.\%s\ 文件不存在!\n", fname); //文件不存在
wgetchar=1;
}
}
}
Close:
void CloseF() /*Close File*/
{
printf("\n\nC:\\%s>",strupr(dirname)); //顯示路徑
char fname[MAXNAME]; //定義字符串變量
int i, k, n=0;
if(strcmp(strupr( 36、dirname), strupr(username))!=0) //關(guān)閉用戶文件需在用戶目錄下
{
printf("\nError!請確認您要關(guān)閉的是在用戶目錄下!\n");
} else {
printf("\n\nOpened File(s) List:\n"); //羅列已處于打開的文件
k=ExistD(dirname);
for(i=0;i 37、en[k][i].openmode==0) ||(ifopen[k][i].openmode==2)) //只讀或者讀寫狀態(tài)
{
printf("%15s",ufd[k]->ufdfile[i].fname);
n++;
}
if((n%4==0)&&(n!=0)) printf("\n");
}
printf("\n%d 文件已被打開!\n",n);
if (n==0) wgetchar=1;
printf("\nPlease input FileName:") 38、;
gets(fname); //接收關(guān)閉文件的文件名
ltrim(rtrim(fname)); //除去首尾空格
i=ExistF(fname); //獲取文件物理地址
if(i >= 0)
{
k=ExistD(username); //獲取用戶文件信息
if(ifopen[k][i].ifopen==0) //文件處于關(guān)閉狀態(tài)
{
39、 printf("\nError!\%s\文件已經(jīng)被關(guān)閉!\n", fname);
} else { //將文件關(guān)閉
ifopen[k][i].ifopen=0;
ifopen[k][i].openmode=4;
printf("\%s\ has been closed successfully!", fname);
}
} else {
prin 40、tf("\nError.\%s\文件不存在\n", fname);
}
}
}
【測試結(jié)果】
(此部分請同學(xué)們自己動手操作)
Login:
Help:
Create:
Open:
Read:
Write:
1—additional
添加后變?yōu)椋?
0—covered
覆蓋后變?yōu)椋?
Close:
Attrib:
Delete:
Dir:
Cls:(清屏)
Exit:
【設(shè)計總結(jié)】
首先通過這次的操作系統(tǒng)課程設(shè)計,讓我認識到了實際的編程操作并不難,難的是對過程的設(shè) 41、計,功能的定義以及最后的程序流程圖的設(shè)計。
其次說一下我的認識,這次的課程設(shè)計使我對一些東西有了更加深刻的認知和了解,更重要的是鞏固了新學(xué)的知識,以及對舊的知識進行了復(fù)習(xí)與了解,對一些細節(jié)方面的東西也有了更深刻的理解,所以這一次實踐的機會,讓我體會到了自己的不足之處,在以后的學(xué)習(xí)過程中,會加倍的認真努力。讓我對文件的操作更加熟練了,并且對Linux有了初步的了解。
其實這次課程設(shè)計,不能說很困難:老師已經(jīng)把大體的架構(gòu)給我們了,我們需要添加的僅是四個功能的設(shè)計(open、write、delete、close)但是它又不是很容易,我們需要把整個的程序弄清,各個變量以及語句都要明白記住,這會關(guān)聯(lián)到我們所定義的四個功能。
總算是把這次的課程設(shè)計搞定了,最讓我開心的是課設(shè)完成之后看著自己的作品。程序完整運行成功的那一瞬間最令我激動。
總之,這次的課設(shè)使我重新認識了不少,以后我會更加努力!
【參考文獻】
計算機操作系統(tǒng)教程(第三版). 張堯?qū)W 史美林 張高
計算機操作系統(tǒng),西安電子科技大學(xué)出版社,方敏主編,2004.8
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結(jié)+在機關(guān)“弘揚憲法精神推動發(fā)改工作高質(zhì)量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊教研組工作總結(jié)
- 2024年小學(xué)高級教師年終工作總結(jié)匯報
- 2024-2025年秋季第一學(xué)期初中物理上冊教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報告
- 2025年學(xué)校元旦迎新盛典活動策劃方案
- 2024年學(xué)校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報告