操作系統(tǒng)實(shí)驗(yàn)三--文件管理_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)三--文件管理_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)三--文件管理_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)三--文件管理_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)三--文件管理_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、4二幺at計(jì)算機(jī)操作系統(tǒng)課程實(shí)驗(yàn)報(bào)告題目文件管理學(xué)院:計(jì)算機(jī)學(xué)院專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)姓 名班 級(jí)學(xué) 號(hào)2016年12月22日實(shí)驗(yàn)三 文件管理1. 實(shí)驗(yàn)?zāi)康模壕帉懸粋€(gè)簡(jiǎn)單的二級(jí)文件系統(tǒng)實(shí)現(xiàn)程序, 加深對(duì)文件系統(tǒng)的內(nèi)部功能和內(nèi)部實(shí)現(xiàn)的理解。 要求模擬采用二級(jí)目錄結(jié)構(gòu)的磁盤文件系統(tǒng)的文件操作能實(shí)現(xiàn)相應(yīng)的命令,用輸入命令來(lái)模擬用戶程序中調(diào)用的文件操作。2. 實(shí)驗(yàn)內(nèi)容:最基本的文件操作( 1)創(chuàng)建文件在創(chuàng)建一個(gè)新文件時(shí),系統(tǒng)首先要為新文件分配必要的外存空間,并在文件系統(tǒng)的目錄中, 為之建立一個(gè)目錄項(xiàng)。 目錄項(xiàng)中應(yīng)該記錄新文件的文件名及其在外存的地址等屬性。( 2)刪除文件當(dāng)已不再需要某文件時(shí),可將它從

2、文件系統(tǒng)中刪除。在刪除時(shí),系統(tǒng)應(yīng)該先從目錄中找到要?jiǎng)h除的文件的目錄項(xiàng), 使之成為空項(xiàng), 然后回收該文件所占用的存儲(chǔ)空間。( 3)讀文件在讀一個(gè)文件時(shí), 須在相應(yīng)的系統(tǒng)調(diào)用中給出文件名和應(yīng)該讀入的內(nèi)存目標(biāo)地址。此時(shí),系統(tǒng)同樣要查找目錄,找到制定的目錄項(xiàng),從中得到被讀文件在外存中的位置。在目錄項(xiàng)中,還有一個(gè)指針用于對(duì)文件的讀/ 寫。( 4)寫文件在寫一個(gè)文件時(shí), 須在相應(yīng)的系統(tǒng)調(diào)用中給出該文件名及該文件在內(nèi)存中的(源)地址。為此,也同樣須先查找目錄,找到指定文件的目錄項(xiàng),在利用目錄中的寫指針進(jìn)行寫操作。( 5)截?cái)辔募绻粋€(gè)文件的內(nèi)容已經(jīng)陳舊而需要全部更新文件的內(nèi)容時(shí), 一種方法是將此文件刪除,

3、 再重新創(chuàng)建一個(gè)新文件。 但如果文件名及其屬性均無(wú)改變時(shí), 則可采取另一種所謂的截?cái)辔募姆椒?,此即將原有文件的長(zhǎng)度設(shè)置為0,或說(shuō)放棄原有的文件內(nèi)容。( 6)設(shè)置文件的讀/ 寫位置前述的文件讀/寫操作,都只提供了對(duì)文件順序存取的手段,即每次都是從文件的始端讀或?qū)憽TO(shè)置文件讀/寫位置的操作,用于設(shè)置文件讀/寫指針的位置,以便每次讀/寫文件時(shí),不是從其始端而是從所設(shè)置的位置開始操作。也正因如此,才能改順序存取為隨機(jī)存取。3.設(shè)計(jì)實(shí)現(xiàn):1)流程圖RFn音看close 關(guān)用旭出保春當(dāng)前文fl目錄打印當(dāng)前文件目錄2)詳細(xì)設(shè)計(jì)源代碼#include <stdio.h>#include <

4、string.h>#include <conio.h>#include <stdlib.h>#include <time.h>#define MaxUser 100 /定義最多有100個(gè)用戶定義磁盤空間大小#define MaxDisk 512*1024 / #define commandAmount / 對(duì)文件操作的指令數(shù)/ 存儲(chǔ)空間管理有關(guān)結(jié)構(gòu)體和變量char diskMaxDisk;模才5 512K的磁盤存儲(chǔ)空間typedef struct distTable /磁盤塊結(jié)構(gòu)體int maxlength;int start;int useFlag;

5、distTable *next;diskNode;diskNode *diskHead;typedef struct / 文件快結(jié)構(gòu)體char 10;int start; /文件在磁盤存儲(chǔ)空間的起始地址int length; /文件內(nèi)容長(zhǎng)度int maxlength;/ 文件的最大長(zhǎng)度char 3;/ 文件的屬性- 讀寫方式struct tm *timeinfo;bool openFlag;/ 判斷是否有進(jìn)程打開了文件;int used = 0;/ 定義 MFD 目錄中用已有的用戶數(shù)/ 兩級(jí)目錄結(jié)構(gòu)體typedef struct user_ / 用戶文件目錄文件UFD*file;user_ *

6、next;UFD;typedef struct master_ / 主目錄文件char userName10;char password10;UFD *user;MFD;MFD userTableMaxUser;int userID = -1; / 用戶登錄的 ID 號(hào),值為 -1 時(shí)表示沒有用戶登錄/ 文件管理void ();/創(chuàng)建文件void (); / 刪除文件void ();/寫文件void ();/讀文件void ();/重命名文件void ();/查詢文件void ();/顯示某一用戶所有文件void ();/關(guān)閉已打開的文件void ();/修改文件的讀寫方式int reques

7、tDist(int &stratPostion, int maxlength);/磁盤分配查詢void initDisk();/ 初始化磁盤void freeDisk(int startPostion);/磁盤空間釋放void diskShow();/ 顯示磁盤使用情況void initFile();/ 用戶管理void userCreate();int login();void userDelet();void userFind();/ 用戶登陸主界面void webUser();/ 用戶內(nèi)部界面void webFile();int main()initDisk();initFile

8、();webUser();return 0;void webUser()int i;while (1)printf("*n");printf("1.創(chuàng)建用戶2.登陸用戶n");printf("3. 刪除用戶4.查看用戶n");printf("0. 退出系統(tǒng)n");printf("*n");printf(" 請(qǐng)輸入操作號(hào) n");scanf("%d", &i);switch (i) case 0:exit(0); break;case 1:userC

9、reate(); break;case 2:userID = login();if (userID != -1)webFile();break;case 3:userDelet(); break;case 4:userFind(); break;default:printf(" 您輸入的命令有誤,請(qǐng)重新選擇n");system("pause");system("cls");break;void userCreate()char c;char userName10;int i;if (used<MaxUser)printf(&qu

10、ot; 請(qǐng)輸入用戶名: ");for (i = 0; c = _getch(); i+)if (c = 13) break;elseuserNamei = c;printf("%c", c);userNamei = '0'for (i = 0; i<used; i+)if (!strcmp(userTablei.userName, userName)printf("n");printf(" 該用戶名已存在 , 創(chuàng)建用戶失敗n");system("pause");system(&quo

11、t;cls");return;strcpy(userTableused.userName, userName);printf("n");printf(" 請(qǐng)輸入密碼: ");for (i = 0; c = _getch(); i+)if (c = 13) break;elseuserTableused.passwordi = c;printf("*");userTableuserID.passwordi = '0'printf("n");printf(" 創(chuàng)建用戶成功 n&quo

12、t;);used+;system("pause");system("cls");elseprintf(" 創(chuàng)建用戶失敗,用戶已達(dá)到上限n");system("pause");system("cls");fflush(stdin);int login()char name10, psw10;char c;int i, times;printf(" 請(qǐng)輸入用戶名 :");for (i = 0; c = _getch(); i+)if (c = 13) break;elsename

13、i = c;printf("%c", c);namei = '0'for (i = 0; i < used; i+)if (!strcmp(userTablei.userName, name) break;if (i = used)printf("n 您輸入的用戶名不存在 n");system("pause");system("cls");return -1;for (times = 0; times<3; times+)memset(psw, '0', sizeof(p

14、sw);printf("n 請(qǐng)輸入密碼:");for (i = 0; c = _getch(); i+)if (c = 13) break;elsepswi = c;printf("*");printf("n");for (i = 0; i<used; i+)if (!strcmp(psw, userTablei.password) printf(" 用戶登錄成功n");system("pause");system("cls");break;if (i = used)p

15、rintf(" 您輸入的密碼錯(cuò)誤,您還有%d 次輸入機(jī)會(huì)n", 2 - times);if (times = 2) exit(0);else break;fflush(stdin);return i;void userDelet()int statePos;UFD *q;char name10, psw10;char c;int i, times, j;printf(" 請(qǐng)輸入用戶名 :");for (i = 0; c = _getch(); i+)if (c = 13) break;elsenamei = c;printf("%c"

16、, c);namei = '0'for (i = 0; i < used; i+)if (!strcmp(userTablei.userName, name) break;if (i = used)printf("n 您輸入的用戶名不存在 n");system("pause");system("cls");elseq = userTablei.user->next;while (q)if (q-> NULL)statePos = q->file->start;freeDisk(stateP

17、os);q = q->next;for (i, j = i+1; i <= used; j+, i+)userTablei = userTablej;printf("n 用戶刪除成功 n");system("pause");system("cls");used-;void userFind()int i;printf(" 用戶列表: n");for (i = 0; i < used; i+)printf("%sn", userTablei.userName);system(&q

18、uot;pause");system("cls");void webFile()int i;char name10, kind3;printf(" 1.創(chuàng)建2.刪除n");printf(" 3.寫入文件4.查看文件內(nèi)容n");printf(" 5.重命名6.查看文件屬性n");printf(" 7.查看用戶文件8.關(guān)閉文件n");printf(" 9.修改文件權(quán)限10.查看磁盤使用情況n");printf(" 11.返回上級(jí)目錄12.退出系統(tǒng)n"

19、);printf("*n");printf("*printf(" 請(qǐng)輸入操作號(hào): ");scanf("%d", &i);while (1) switch (i)case 1:();break;case 2:();break;case 3:();break;case 4:();break;case 5:();break;case 6:();break;case 7:();break;case 8:();break;case 9:();break;case 10:diskShow();break;case 11:syst

20、em("cls");webUser();break;case 12:exit(0);break;default:printf(" 輸入錯(cuò)誤請(qǐng)重新輸入 :");break;scanf("%d", &i);void () time_t rawtime;int startPos;char c;char 10, 10, 10;char command50;int length;/int i, k,j;printf(" 創(chuàng)建文件格式為 名稱 長(zhǎng)度 權(quán)限( r 、 w、 rw) :");fflush(stdin);ge

21、ts(command);int i, k, j;for (i = 0, k = 0; commandi != ' ' i+, k+)k = commandi;k = '0'k = i;for (i = k + 1, k = 0; commandi != ' ' i+, k+)k = commandi;k = '0'k = i;j = 1;length = 0;/ 初始化文件長(zhǎng)度f(wàn)or (i = strlen() - 1; i >= 0; i-)/把字符串轉(zhuǎn)換為十進(jìn)制length += (i - 48)*j;j *= 10;f

22、or (i = k + 1, k = 0; commandi != ' '&&commandi != '0' i+, k+)k = commandi;k = '0'UFD *, *p;for (p = userTableuserID.user->next; p != NULL; p = p->next) if (!strcmp(p->file->, )printf(" 文件重名,創(chuàng)建文件失敗n");system("pause");return;if (requestD

23、ist(startPos, length)= (UFD*)malloc(sizeof(UFD);>file = (*)malloc(sizeof();strcpy(>file->, );strcpy(>file->, );>file->maxlength = length;>file->start = startPos;>file->openFlag = false;time(&rawtime);>file->timeinfo = localtime(&rawtime);>next = NULL

24、;if (userTableuserID.user->next = NULL)userTableuserID.user->next = ;elsep = userTableuserID.user->next;while (p->next) p = p->next;p->next = ;printf(" 創(chuàng)建文件成功 n");system("pause");elsen");printf(" 磁盤空間已滿或所創(chuàng)建文件超出磁盤空閑容量,磁盤空間分配失敗system("pause");v

25、oid initDisk()diskHead = (diskNode *)malloc(sizeof(diskNode);diskHead->maxlength = MaxDisk;diskHead->useFlag = 0;diskHead->start = 0;diskHead->next = NULL;void initFile()int i;for (i = 0; i<MaxUser; i+)/初始化用戶 UFD 目錄文件的頭指針userTablei.user = (UFD *)malloc(sizeof(UFD);userTablei.user->

26、next = NULL;int requestDist(int &startPostion, int maxLength)int flag = 0; / 標(biāo)記是否分配成功diskNode *p, *q, *temp;p = diskHead;while (p)if (p->useFlag = 0 && p->maxlength>maxLength)startPostion = p->start;q = (diskNode *)malloc(sizeof(diskNode);q->start = p->start;q->maxle

27、ngth = maxLength;q->useFlag = 1;q->next = NULL;diskHead->start = p->start + maxLength;diskHead->maxlength = p->maxlength - maxLength;flag = 1;temp = p;if (diskHead->next = NULL) diskHead->next = q; elsewhile (temp->next) temp = temp->next;temp->next = q;break;p = p-&

28、gt;next;return flag;void freeDisk(int startPostion)diskNode *p;for (p = diskHead; p != NULL; p = p->next)if (p->start = startPostion) break;p->useFlag = false;void ()char 10, command50;int i, k;fflush(stdin);printf(" 輸入文件名稱: ");gets(command);for (i = 0, k = 0; commandi != '0&#

29、39; i+, k+)k = commandi;k = '0'UFD *p, *q, *temp;q = userTableuserID.user;p = q->next;while (p)if (!strcmp(p->file->, ) break;p = p->next;q = q->next;if (p)if (p->file->openFlag != true)/先判斷是否有進(jìn)程打開該文件temp = p;q->next = p->next;freeDisk(temp->file->start); /磁盤

30、空間回收f(shuō)ree(temp);printf(" 文件刪除成功 n");system("pause");elseprintf(" 該文件正在被占用 , 刪除失敗 n");system("pause");elseprintf(" 沒有找到該文件, 請(qǐng)檢查輸入的文件名是否正確n");system("pause");void ()int startPos, length;int k, i;char 10, command50;printf(" 輸入文件名稱: ")

31、;fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)k = commandi;k = '0'k = 0;UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->, )break;if (p)startPos = p->file->start;length = p->file->length

32、;p->file->openFlag = true;/ 文件打開標(biāo)記printf("*n");for (int i = startPos; k<length; i+, k+)if (i % 50 = 0) printf("n"); /一行大于 50 個(gè)字符換行printf("%c", diski);printf("nn*n");printf("%s 文件正在被占用 , 請(qǐng) 先 將 其 關(guān) 閉 n", p->file->);system("pause&quo

33、t;);elseprintf(" 沒有找到該文件, 請(qǐng)檢查輸入的文件名是否正確n");system("pause");void ()char 10, command50;int i, k, startPos;printf(" 輸入文件名稱: ");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)k = commandi;k = '0'UFD *p, *q;q = userTableuserID.user;for

34、(p = q->next; p != NULL; p = p->next) if (!strcmp(p->file->, ) break;if (p)判斷文件類型if (!strcmp(p->file->, "r")/ printf(" 該文件是只讀文件, 寫入失敗 n");system("pause");return;char str500;printf("please input content:n");gets(str);startPos = p->file->

35、start;p->file->openFlag = true;/ 文件打開標(biāo)記p->file->length = strlen(str);if (p->file->length>p->file->maxlength)printf(" 寫入字符串長(zhǎng)度大于該文件的總長(zhǎng)度, 寫入失敗 n");system("pause");return;for (i = startPos, k = 0; k<(int)strlen(str); i+, k+)diski = strk;printf(" 文件寫

36、入成功 , 請(qǐng)將該文件關(guān)閉 n");system("pause");elseprintf(" 沒有找到該文件, 請(qǐng)檢查輸入的文件名是否正確n");system("pause"); void ()char 10, command50;int i, k;printf(" 輸入文件名稱: ");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)k = commandi;k = '0'UFD

37、*p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->, )break;if (p)printf("*n");printf("文件名: %sn", p->file->);printf("printf("文件長(zhǎng)度: %dn", p->file->maxlength);文件在存儲(chǔ)空間的起始地址: %dn", p->file->s

38、tart);printf("文件類型: %sn", p->file->);printf("創(chuàng)建時(shí)間: %sn", asctime(p->file->timeinfo);printf("*n");system("pause");elseprintf(" 沒有找到該文件, 請(qǐng)檢查輸入的文件名是否正確n");system("pause");void ()char 10, 10, command50;int i, k;fflush(stdin);printf(

39、" 輸入文件名稱和新的文件權(quán)限: ");gets(command);for (i = 0, k = 0; commandi != ' ' i+, k+)k = commandi;k = '0'for (k = i + 1, i = 0; commandk != '0' i+, k+)i = commandk;i = '0'UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p

40、->file->, )break;if (p)strcpy(p->file->, );printf(" 修改文件類型成功 n");system("pause");elseprintf(" 沒有找到該文件, 請(qǐng)檢查輸入的文件名是否正確n");system("pause");void ()char 10, 10, command50;int i, k;fflush(stdin);printf(" 輸入文件名稱和新的文件名稱: ");gets(command);for (i =

41、 0, k = 0; commandi != ' ' i+, k+)k = commandi;k = '0'for (k = i + 1, i = 0; commandk != '0' i+, k+)i = commandk;i = '0'UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->, )break;if (p)while (q->next)if (!

42、strcmp(q->next->file->, )printf(" 您輸入的文件名已存在 , 重命名失敗n");system("pause");return;q = q->next;strcpy(p->file->, );printf(" 重命名成功 n");system("pause");elsen");printf(" 沒有找到該文件, 請(qǐng)檢查輸入的文件名是否正確system("pause");void ()char userName1

43、0, command50;int i, k;printf(" 輸入用戶名稱: ");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)userNamek = commandi;userNamek = '0'UFD *p;for (i = 0; i<MaxUser; i+)if (!strcmp(userTablei.userName, userName) k = i;break;if (i = MaxUser)printf(" 沒有找到該

44、用戶,請(qǐng)檢查輸入用戶名是否正確n");system("pause");return;elsep = userTablek.user->next;printf("* *n");printf(" 文件名 文件長(zhǎng)度 文件在磁盤的起始地址文件類型 創(chuàng)建時(shí)間 n");for (; p != NULL; p = p->next)printf("%s %d %d%s %s",printf("*n");p->file->, p->file->maxlength,p-

45、>file->start, p->file->, asctime(p->file->timeinfo);*system("pause");void diskShow()diskNode *p;int i = 0, unusedDisk = 0;printf("*n");printf("*n");printf(" 盤塊號(hào) 起始地址 容量 (bit) 是否已被使用 n");for (p = diskHead; p != NULL; p = p->next, i+)if (p-&

46、gt;useFlag = false) unusedDisk += p->maxlength;printf(" %d %d %d %dn", i, p->start, p->maxlength, p->useFlag);*%dbit 末 使printf(" 磁 盤 空 間 總 容 量 :512*1024bit 已 使 用 用: %dbitn", MaxDisk - unusedDisk, unusedDisk);system("pause");void ()char 10, command50;int i, k

47、;printf(" 輸入文件名稱: ");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)k = commandi;k = '0'UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->,)break;if (p)p->file->openFlag = false;printf(

48、"%s 文件已關(guān)閉 n", p->file->);system("pause");elseprintf("沒有找到該文件,請(qǐng)檢查輸入的文件名是否正確n");system("pause");4.實(shí)驗(yàn)結(jié)果1、創(chuàng)建用戶«糊口Mlei&ank m-g11 皮件百哽 EE產(chǎn)4 1 事*卑川4 4區(qū)通用戶:整騙*竄 *昂- 444+*4*iij|事事串*4 4本小14事 4耳!工董電用戶工4者相戶手湎,禪丁斗 -!.- 戶哥IC 川江.'=一L創(chuàng)建用戶請(qǐng)輸入操作號(hào)|2用戶名:1北*2、登錄用戶IS C;UserVt&lDesktQpVi:l42Debug.exe1要陸用P4.查看用戶* d|cz)|c *(>: d|c|c :1c * 北 d|cd|c * * 土 * 北* |c4= * 比 4 * *戶戶統(tǒng)"作 第44操 S.A 回裳輸戶列表!3、查看用戶, C;U /=下大機(jī)D L9 kt 口八十件管在2%。臺(tái)6u理丐lj(l遑磐霸4、刪除用戶H C:User5Vt:Desk

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論