操作系統(tǒng)實驗三__文件管理_第1頁
操作系統(tǒng)實驗三__文件管理_第2頁
操作系統(tǒng)實驗三__文件管理_第3頁
操作系統(tǒng)實驗三__文件管理_第4頁
操作系統(tǒng)實驗三__文件管理_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

2、要某文件時,可將它從文件系統(tǒng)中刪除。在刪除時,系統(tǒng)應(yīng)該先從目錄中找到要刪除的文件的目錄項,使之成為空項,然后回收該文件所占用的存儲空間。 (3)讀文件 在讀一個文件時,須在相應(yīng)的系統(tǒng)調(diào)用中給出文件名和應(yīng)該讀入的內(nèi)存目標地址。此時,系統(tǒng)同樣要查找目錄,找到制定的目錄項,從中得到被讀文件在外存中的位置。在目錄項中,還有一個指針用于對文件的讀/寫。 (4)寫文件 在寫一個文件時,須在相應(yīng)的系統(tǒng)調(diào)用中給出該文件名及該文件在內(nèi)存中的(源)地址。為此,也同樣須先查找目錄,找到指定文件的目錄項,在利用目錄中的寫指針進行寫操作。 (5)截斷文件 如果一個文件的內(nèi)容已經(jīng)陳舊而需要全部更新文件的內(nèi)容時,一種方法是

3、將此文件刪除,再重新創(chuàng)建一個新文件。但如果文件名及其屬性均無改變時,則可采取另一種所謂的截斷文件的方法,此即將原有文件的長度設(shè)置為0,或說放棄原有的文件內(nèi)容。 (6)設(shè)置文件的讀/寫位置 前述的文件讀/寫操作,都只提供了對文件順序存取的手段,即每次都是從文件的始端讀或?qū)憽TO(shè)置文件讀/寫位置的操作,用于設(shè)置文件讀/寫指針的位置,以便每次讀/寫文件時,不是從其始端而是從所設(shè)置的位置開始操作。也正因如此,才能改順序存取為隨機存取。3.設(shè)計實現(xiàn):1)流程圖2)詳細設(shè)計源代碼#include <stdio.h>#include <string.h>#include <con

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

5、de *diskHead;typedef struct fileTable /文件快結(jié)構(gòu)體char fileName10;int start; /文件在磁盤存儲空間的起始地址int length; /文件內(nèi)容長度int maxlength;/文件的最大長度char fileKind3;/文件的屬性-讀寫方式struct tm *timeinfo;bool openFlag;/判斷是否有進程打開了文件;int used = 0;/ 定義 MFD 目錄中用已有的用戶數(shù)/兩級目錄結(jié)構(gòu)體typedef struct user_file_directory /用戶文件目錄文件 UFDfileTable

6、*file;user_file_directory *next;UFD;typedef struct master_file_directory /主目錄文件char userName10;char password10;UFD *user;MFD;MFD userTableMaxUser;int userID = -1; /用戶登錄的 ID 號,值為-1 時表示沒有用戶登錄/文件管理void fileCreate(); /創(chuàng)建文件void fileDelet(); /刪除文件void fileWrite(); /寫文件void fileRead();/讀文件void fileRename()

7、; /重命名文件void fileFind(); /查詢文件void fileDir();/ 顯示某一用戶所有文件void fileClose(); /關(guān)閉已打開的文件void fileChange();/修改文件的讀寫方式int requestDist(int &stratPostion, int maxlength);/磁盤分配查詢void initDisk();/初始化磁盤void freeDisk(int startPostion);/磁盤空間釋放void diskShow();/顯示磁盤使用情況void initFile();/用戶管理void userCreate();in

8、t login();void userDelet();void userFind();/用戶登陸主界面void webUser();/用戶內(nèi)部界面 void webFile();int main()initDisk();initFile();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(&

9、quot;*n");printf("請輸入操作號n");scanf("%d", &i);switch (i)case 0:exit(0); break;case 1:userCreate(); break;case 2:userID = login();if (userID != -1)webFile();break;case 3:userDelet(); break;case 4:userFind(); break;default:printf("您輸入的命令有誤,請重新選擇n");system("pau

10、se");system("cls");break;void userCreate()char c;char userName10;int i;if (used<MaxUser)printf("請輸入用戶名:");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.use

11、rName, userName)printf("n");printf("該用戶名已存在,創(chuàng)建用戶失敗n");system("pause");system("cls");return;strcpy(userTableused.userName, userName);printf("n");printf("請輸入密碼:");for (i = 0; c = _getch(); i+)if (c = 13) break;elseuserTableused.passwordi = c;

12、printf("*");userTableuserID.passwordi = '0'printf("n");printf("創(chuàng)建用戶成功n");used+;system("pause");system("cls");elseprintf("創(chuàng)建用戶失敗,用戶已達到上限n");system("pause");system("cls");fflush(stdin);int login()char name10, psw10

13、;char c;int i, times;printf("請輸入用戶名:");for (i = 0; c = _getch(); i+)if (c = 13) break;elsenamei = 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");

14、system("cls");return -1;for (times = 0; times<3; times+)memset(psw, '0', sizeof(psw);printf("n 請輸入密碼:");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.passwor

15、d)printf("用戶登錄成功n");system("pause");system("cls");break;if (i = used)printf("您輸入的密碼錯誤,您還有%d 次輸入機會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("

16、請輸入用戶名:");for (i = 0; c = _getch(); i+)if (c = 13) break;elsenamei = 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");elseq = us

17、erTablei.user->next;while (q)if (q->file != NULL)statePos = q->file->start;freeDisk(statePos);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(&qu

18、ot;用戶列表:n");for (i = 0; i < used; i+)printf("%sn", userTablei.userName);system("pause");system("cls");void webFile()int i;char name10, kind3;printf("*n");printf(" 1.創(chuàng)建 2.刪除 n");printf(" 3.寫入文件 4.查看文件內(nèi)容 n");printf(" 5.重命名 6.查看文件

19、屬性 n");printf(" 7.查看用戶文件 8.關(guān)閉文件 n");printf(" 9.修改文件權(quán)限 10.查看磁盤使用情況 n");printf(" 11.返回上級目錄 12.退出系統(tǒng) n");printf("*n");printf("請輸入操作號:");scanf("%d", &i);while (1)switch (i)case 1:fileCreate();break;case 2:fileDelet();break;case 3:fileWr

20、ite();break;case 4:fileRead();break;case 5:fileRename();break;case 6:fileFind();break;case 7:fileDir();break;case 8:fileClose();break;case 9:fileChange();break;case 10:diskShow();break;case 11:system("cls");webUser();break;case 12:exit(0);break;default:printf("輸入錯誤請重新輸入:");break;

21、scanf("%d", &i);void fileCreate()time_t rawtime;int startPos;char c;char fileName10, fileKind10, fileLength10;char command50;int length;/int i, k,j;printf(" 創(chuàng)建文件格式為 名稱 長度 權(quán)限(r、w、rw):");fflush(stdin);gets(command);int i, k, j;for (i = 0, k = 0; commandi != ' ' i+, k+)f

22、ileNamek = commandi;fileNamek = '0'k = i;for (i = k + 1, k = 0; commandi != ' ' i+, k+)fileLengthk = commandi;fileLengthk = '0'k = i;j = 1;length = 0;/初始化文件長度for (i = strlen(fileLength) - 1; i >= 0; i-)/把字符串轉(zhuǎn)換為十進制length += (fileLengthi - 48)*j;j *= 10;for (i = k + 1, k = 0

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

24、eturn;if (requestDist(startPos, length)fileNode = (UFD*)malloc(sizeof(UFD);fileNode->file = (fileTable*)malloc(sizeof(fileTable);strcpy(fileNode->file->fileName, fileName);strcpy(fileNode->file->fileKind, fileKind);fileNode->file->maxlength = length;fileNode->file->start =

25、 startPos;fileNode->file->openFlag = false;time(&rawtime);fileNode->file->timeinfo = localtime(&rawtime);fileNode->next = NULL;if (userTableuserID.user->next = NULL)userTableuserID.user->next = fileNode;elsep = userTableuserID.user->next;while (p->next) p = p->n

26、ext;p->next = fileNode;printf("創(chuàng)建文件成功n");system("pause");elseprintf("磁盤空間已滿或所創(chuàng)建文件超出磁盤空閑容量,磁盤空間分配失敗n");system("pause");void initDisk()diskHead = (diskNode *)malloc(sizeof(diskNode);diskHead->maxlength = MaxDisk;diskHead->useFlag = 0;diskHead->start

27、= 0;diskHead->next = NULL;void initFile()int i;for (i = 0; i<MaxUser; i+)/初始化用戶 UFD 目錄文件的頭指針userTablei.user = (UFD *)malloc(sizeof(UFD);userTablei.user->next = NULL;int requestDist(int &startPostion, int maxLength)int flag = 0; /標記是否分配成功diskNode *p, *q, *temp;p = diskHead;while (p)if (p

28、->useFlag = 0 && p->maxlength>maxLength)startPostion = p->start;q = (diskNode *)malloc(sizeof(diskNode);q->start = p->start;q->maxlength = maxLength;q->useFlag = 1;q->next = NULL;diskHead->start = p->start + maxLength;diskHead->maxlength = p->maxlength

29、- maxLength;flag = 1;temp = p;if (diskHead->next = NULL) diskHead->next = q;elsewhile (temp->next) temp = temp->next;temp->next = q;break;p = p->next;return flag;void freeDisk(int startPostion)diskNode *p;for (p = diskHead; p != NULL; p = p->next)if (p->start = startPostion)b

30、reak;p->useFlag = false;void fileDelet()char fileName10, command50;int i, k;fflush(stdin);printf(" 輸入文件名稱:");gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)fileNamek = commandi;fileNamek = '0'UFD *p, *q, *temp;q = userTableuserID.user;p = q->next;while (p)if

31、(!strcmp(p->file->fileName, fileName) break;elsep = p->next;q = q->next;if (p)if (p->file->openFlag != true)/先判斷是否有進程打開該文件temp = p;q->next = p->next;freeDisk(temp->file->start); /磁盤空間回收free(temp);printf("文件刪除成功n");system("pause");elseprintf("該文件

32、正在被占用,刪除失敗n");system("pause");elseprintf("沒有找到該文件,請檢查輸入的文件名是否正確n");system("pause");void fileRead()int startPos, length;int k, i;char fileName10, command50;printf(" 輸入文件名稱:");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)fil

33、eNamek = commandi;fileNamek = '0'k = 0;UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->fileName, fileName)break;if (p)startPos = p->file->start;length = p->file->length;p->file->openFlag = true;/文件打開標記printf(&quo

34、t;*n");for (int i = startPos; k<length; i+, k+)if (i % 50 = 0) printf("n"); /一行大于 50 個字符換行printf("%c", diski);printf("nn*n");printf("%s 文件正在被占用 , 請 先 將 其 關(guān) 閉n", p->file->fileName);system("pause");elseprintf("沒有找到該文件,請檢查輸入的文件名是否正確n&

35、quot;);system("pause");void fileWrite()char fileName10, command50;int i, k, startPos;printf(" 輸入文件名稱:");fflush(stdin);gets(command);for (i = 0, k = 0; commandi != '0' i+, k+)fileNamek = commandi;fileNamek = '0'UFD *p, *q;q = userTableuserID.user;for (p = q->nex

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

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

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

39、eNamek = '0'UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->fileName, fileName)break;if (p)printf("*n");printf("文件名:%sn", p->file->fileName);printf("文件長度:%dn", p->file->maxlength);printf(&

40、quot;文件在存儲空間的起始地址:%dn", p->file->start);printf("文件類型:%sn", p->file->fileKind);printf("創(chuàng)建時間:%sn", asctime(p->file->timeinfo);printf("*n");system("pause");elseprintf("沒有找到該文件,請檢查輸入的文件名是否正確n");system("pause");void fileCh

41、ange()char fileName10, fileKind10, command50;int i, k;fflush(stdin);printf(" 輸入文件名稱和新的文件權(quán)限:");gets(command);for (i = 0, k = 0; commandi != ' ' i+, k+)fileNamek = commandi;fileNamek = '0'for (k = i + 1, i = 0; commandk != '0' i+, k+)fileKindi = commandk;fileKindi = &

42、#39;0'UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->fileName, fileName)break;if (p)strcpy(p->file->fileKind, fileKind);printf("修改文件類型成功n");system("pause");elseprintf("沒有找到該文件,請檢查輸入的文件名是否正確n");syst

43、em("pause");void fileRename()char fileName10, fileRename10, command50;int i, k;fflush(stdin);printf(" 輸入文件名稱和新的文件名稱:");gets(command);for (i = 0, k = 0; commandi != ' ' i+, k+)fileNamek = commandi;fileNamek = '0'for (k = i + 1, i = 0; commandk != '0' i+, k+

44、)fileRenamei = commandk;fileRenamei = '0'UFD *p, *q;q = userTableuserID.user;for (p = q->next; p != NULL; p = p->next)if (!strcmp(p->file->fileName, fileName)break;if (p)while (q->next)if (!strcmp(q->next->file->fileName, fileRename)printf("您輸入的文件名已存在,重命名失敗n"

45、;);system("pause");return;q = q->next;strcpy(p->file->fileName, fileRename);printf("重命名成功n");system("pause");elseprintf("沒有找到該文件,請檢查輸入的文件名是否正確n");system("pause");void fileDir()char userName10, 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("沒有找到該用戶,請檢查輸入用戶名是否

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論