版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 . . . 課程設(shè)計(jì)報(bào)告課程名稱操作系統(tǒng)課程設(shè)計(jì)課題名稱模擬實(shí)現(xiàn)單級(jí)目錄的FAT文件系統(tǒng)專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)班級(jí)計(jì)算機(jī)0903 學(xué)號(hào) 1 姓名星指導(dǎo)教師周鐵山2011年 12 月 13 日工程學(xué)院課程設(shè)計(jì)任務(wù)書課程名稱操作系統(tǒng)課程設(shè)計(jì)課題模擬實(shí)現(xiàn)單級(jí)目錄的FAT文件系統(tǒng)專業(yè)班級(jí)計(jì)算機(jī)0903 學(xué)生星學(xué)號(hào) 1 指導(dǎo)老師周鐵山審批任務(wù)書下達(dá)日期 2011 年 12 月 13 日任務(wù)完成日期 2011年 12 月 28 日計(jì)算機(jī)09級(jí)操作系統(tǒng)課程設(shè)計(jì)任務(wù)書一、 課程設(shè)計(jì)的性質(zhì)和目的操作系統(tǒng)課程設(shè)計(jì)是計(jì)算機(jī)專業(yè)的專業(yè)課程,通過(guò)課程設(shè)計(jì)使學(xué)生進(jìn)一步鞏固課堂所學(xué)知識(shí),全面熟悉、掌握操作系統(tǒng)的基本設(shè)計(jì)方法
2、和技巧,進(jìn)一步提高分析問(wèn)題、解決問(wèn)題與上機(jī)操作能力,為將來(lái)從事計(jì)算機(jī)工作打下一定的專業(yè)基礎(chǔ)。二、 設(shè)計(jì)課題課題一:模擬實(shí)現(xiàn)單級(jí)目錄的FAT文件系統(tǒng)基本思路:用二進(jìn)制文件空間模擬磁盤空間,用文件塊操作模擬磁盤塊操作。基本設(shè)計(jì)要求:1、實(shí)現(xiàn)如下文件系統(tǒng)功能(過(guò)程或函數(shù)):a、 打開(kāi)文件系統(tǒng) FILE *OPENSYS(char *filename);b、 關(guān)閉文件系統(tǒng) int CLOSESYS(FILE *stream);c、 顯示目錄 void LISTDIR(void);d、 建立文件 int FCREATE(char *filename);e、 刪除文件 int FDELETE(char *
3、filename);f、 打開(kāi)文件 int FOPEN(char *filename);g、 關(guān)閉文件 int FCLOSE(int fileid);h、 文件塊讀 int FREAD(void *ptr, int n, int fileid);i、 文件塊寫 int FWRITE(void *ptr, int n, int fileid);j、 判斷文件結(jié)束 int FEOF(int fileid);k、 獲取文件指針 long FGETPOS(int fileid);l、 設(shè)置文件指針 int FSETPOS(int fileid, long offset);m、取得文件長(zhǎng)度 long F
4、GETLEN(char *filename);2、提供文件系統(tǒng)創(chuàng)建程序3、有功能檢測(cè)模塊4、為簡(jiǎn)化程序設(shè)計(jì),假定目錄區(qū)域大小固定。文件系統(tǒng)空間劃分:保留扇區(qū)FAT表區(qū)(或字節(jié)映像圖區(qū))根目錄區(qū)文件分區(qū)可以使用的C語(yǔ)言文件操縱函數(shù):FILE *fopen(const char *filename, const char *mode);int fclose(FILE *stream);int fseek(FILE *stream, long offset, int whence);long ftell(FILE *stream);size_t fread(void *ptr, size_t siz
5、e, size_t n, FILE *stream);size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);31 / 31課題二:模擬實(shí)現(xiàn)單級(jí)目錄、單級(jí)索引的索引文件系統(tǒng)使用域?qū)⑼晃募母魉饕龎K按順序連接起來(lái);其余各項(xiàng)同課題一。三、 課程設(shè)計(jì)報(bào)告要求1、 設(shè)計(jì)報(bào)告要求A4紙打印成冊(cè);2、 使用學(xué)院統(tǒng)一的封面;3、 課程設(shè)計(jì)報(bào)告每人一份,必須包含如下幾個(gè)方面的容:1) 基本設(shè)計(jì)思想;2) 主要數(shù)據(jù)結(jié)構(gòu);3) 主要實(shí)施流程;4) 所有源代碼;5) 課程設(shè)計(jì)總結(jié)與體會(huì)。四、 分組與選題辦法1、 按學(xué)號(hào)順序一人一組,學(xué)
6、號(hào)為奇數(shù)者為課題一,偶數(shù)者為課題二。2、 成績(jī)考核按個(gè)人課題完成情況、設(shè)計(jì)報(bào)告質(zhì)量與對(duì)課程設(shè)計(jì)的態(tài)度等綜合評(píng)定。附:課程設(shè)計(jì)報(bào)告裝訂順序:封面、任務(wù)書、目錄、正文、評(píng)分、附件(A4大小的圖紙與程序清單)。正文的格式:一級(jí)標(biāo)題用3號(hào)黑體,二級(jí)標(biāo)題用四號(hào)宋體加粗,正文用小四號(hào)宋體;行距為22。正文的容:一、課題的主要功能;二、課題的功能模塊的劃分(要求畫出模塊圖);三、主要功能的實(shí)現(xiàn)(至少要有一個(gè)主要模塊的流程圖);四、程序調(diào)試;五、總結(jié);六、附件(所有程序的原代碼,要求對(duì)程序?qū)懗霰匾淖⑨專U目傋謹(jǐn)?shù)要求在5000字以上(不含程序原代碼)。目錄一、 課題主要功能6二、 程序的基本設(shè)計(jì)思路7三、
7、 主要的數(shù)據(jù)結(jié)構(gòu)8四、 課題主要功能9五、 程序調(diào)試與其運(yùn)行結(jié)果12六、 設(shè)計(jì)總結(jié)與心得體例15七、 附錄(源程序清單)17一、程序的功能該程序主要模擬實(shí)現(xiàn)單級(jí)目錄的FAT文件系統(tǒng),該系統(tǒng)要求能實(shí)現(xiàn)對(duì)文件的創(chuàng)建、刪除、讀、寫、打開(kāi)、關(guān)閉以與能顯示目錄等操作,在創(chuàng)建文件時(shí),系統(tǒng)首先為新文件分配所需的外存空間,并且在文件系統(tǒng)的相應(yīng)目錄中,建立一個(gè)目錄項(xiàng),該目錄項(xiàng)記錄了新文件的文件名與其在外存中的地址等屬性。而當(dāng)已經(jīng)不再需要某個(gè)文件時(shí),便可以把它從文件系統(tǒng)中刪除。這時(shí)執(zhí)行的是與創(chuàng)建新文件相反的操作。系統(tǒng)先從目錄中找到要?jiǎng)h除的文件項(xiàng),使之成為空項(xiàng),緊接著回收該文件的存儲(chǔ)空間,用于下次分配。通過(guò)讀指針,
8、將位于外部存儲(chǔ)介質(zhì)上的數(shù)據(jù)讀入到存緩沖區(qū)這樣就實(shí)現(xiàn)了文件的讀取,通過(guò)寫指針,將存緩沖區(qū)中的數(shù)據(jù)寫入到位于外部存儲(chǔ)介質(zhì)上的文件中。在開(kāi)始使用文件時(shí),首先必須打開(kāi)文件。這可以將文件屬性信息裝入存,以便以后快速查用。在完成文件使用后,應(yīng)該關(guān)閉文件。這不但是為了釋放存空間,而且也因?yàn)樵S多系統(tǒng)常常限制可以同時(shí)打開(kāi)的文件數(shù)。當(dāng)創(chuàng)建文件時(shí),先在目錄表中查找是否存在此文件表,若存在則表示文件同名不能創(chuàng)建,否則在目錄表中為此文件先建立一個(gè)目錄項(xiàng),保存文件的一些基本屬性,如創(chuàng)建日期、大小、文件名等,并保存文件的首索引塊扇區(qū)號(hào),對(duì)文件讀寫也是先在目錄項(xiàng)里查找文件是否存在,再根據(jù)文件的首索引塊扇區(qū)號(hào),查找對(duì)應(yīng)塊號(hào)中的
9、容對(duì)其進(jìn)行讀寫操作,刪除一個(gè)文件后回收為其分配的空間,并更新目錄表、修改文件控制塊。顯示目錄項(xiàng)可以顯示文件名、長(zhǎng)度以與創(chuàng)建日期。二、程序的基本設(shè)計(jì)思路模擬實(shí)現(xiàn)單極目錄FAT的文件系統(tǒng)基本思路:用二進(jìn)制文件空間模擬磁盤空間,用文件塊操作模擬磁盤塊操作。在一個(gè)文件系統(tǒng)中對(duì)文件進(jìn)行操作,實(shí)現(xiàn)文件的創(chuàng)建、讀寫等等操作。在創(chuàng)建文件時(shí)先在目錄項(xiàng)中進(jìn)行查找,若創(chuàng)建的文件已存在,文件的創(chuàng)建首先檢驗(yàn)?zāi)夸浭欠駷榭?,為空則把文件夾或文件連接到該目錄下,不為空則把檢查目錄下是否有同名文件夾或文件,有則提示創(chuàng)建不成功,而文件夾打開(kāi)是則把文件夾名稱與其地址壓入打開(kāi)文件夾棧,文件關(guān)閉則把文件夾名稱與其地址從打開(kāi)文件夾棧中拋
10、出。文件夾和文件的刪除,文件夾下沒(méi)有打開(kāi)的文件或文件沒(méi)有打開(kāi)才能刪除,否則刪除失敗,每次操作成功都要更改目錄和FCB信息。該過(guò)程都保存在文件中,是對(duì)文件的操作。本系統(tǒng)建于Windows平臺(tái),開(kāi)發(fā)環(huán)境為WIN-TC。三、主要的數(shù)據(jù)結(jié)構(gòu)單級(jí)目錄單級(jí)索引文件系統(tǒng):常量#define BlockSize 512#define DirSize 32保留扇區(qū)結(jié)構(gòu)struct ReserveBlockint sysblocknum; /*文件系統(tǒng)總扇區(qū)數(shù)*/int resblocknum; /*保留扇區(qū)扇區(qū)數(shù)*/int mapblocknum; /*字節(jié)映像圖扇區(qū)數(shù)*/int rootblocknum; /
11、*根目錄區(qū)扇區(qū)數(shù)*/char fillcharBlockSize-4*sizeof(int); /*填充字節(jié)*/;目錄結(jié)構(gòu)struct DirBlockchar filename11; /*文件名限長(zhǎng)11個(gè)字符*/char fillcharDirSize-4*sizeof(int)-sizeof(long int)-11; /*填充字節(jié)*/long filelen; /*文件長(zhǎng)度*/int year,month,day; /*定義年月日*/int firstindexaddr; /*文件首索引塊扇區(qū)號(hào)*/; FCB(文件控制塊)結(jié)構(gòu)struct FCBBlockint fileid; /*文件
12、標(biāo)識(shí)*/struct DirBlock fileinfo; /*目錄信息*/long filepos; /*文件讀寫指針*/int fdtblockaddr; /*目錄項(xiàng)所在塊號(hào)*/int fdtblockindex; /*目錄項(xiàng)所在塊序號(hào)*/struct FCBBlock *next; /*指向下一個(gè)文件控制塊的指針*/ struct IndexNode *firstindexnode; /*指向第一個(gè)索引節(jié)點(diǎn)的指針* /四、相關(guān)流程圖4.1創(chuàng)建文件流程圖主界面Start輸入start打開(kāi)文件系統(tǒng)YN輸入creat來(lái)創(chuàng)建文件輸入文件名,大小,創(chuàng)建日期判斷是否重名文件創(chuàng)建成功文件創(chuàng)建失敗,重新
13、輸入文件名EndNY4.2刪除文件流程圖創(chuàng)建(creat)一個(gè)文件Start判斷是否存在該文件判斷該文件是否被open輸入del成功刪除文件End先close關(guān)閉文件4.3 FREAD函數(shù)流程圖 Starta=Null Ya->fileid=fileid N N Y(a->filepos+n)>(a->fileid*512)+a->fileinfo.filelen) Nprintf("超出空間。n") Y輸出字符串輸出無(wú)此fileida=a->next End五、 程序調(diào)試與其運(yùn)行結(jié)果圖1圖1為歡迎界面在輸入系統(tǒng)塊的數(shù)目后產(chǎn)生的界面,必須
14、先要輸入start開(kāi)始運(yùn)行文件系統(tǒng)才能完成建立文件(creat),顯示文件目錄(list),打開(kāi)文件(open),關(guān)閉文件(close),刪除文件(delete),寫文件塊(write),讀文件塊(read)等等操作圖2輸入start成功打開(kāi)文件系統(tǒng),再輸入creat來(lái)創(chuàng)建文件,此圖為創(chuàng)建成功后的界面圖3圖3表示輸入list顯示文件目錄,如圖所示創(chuàng)建了aaa,bbb,ccc三個(gè)文件圖4圖4顯示的是成功打開(kāi)和成功關(guān)閉文件圖5輸入read讀取文件,可以設(shè)置讀文件的初始位置以與讀取文件的長(zhǎng)度.圖6 輸入write寫文件圖7如圖所示刪除aaa,bbb,ccc三個(gè)文件六、 設(shè)計(jì)總結(jié)與心得體會(huì)通過(guò)一個(gè)學(xué)期
15、的學(xué)習(xí),操作系統(tǒng)的課程設(shè)計(jì)也完成了,總的來(lái)說(shuō)經(jīng)過(guò)這門課的學(xué)習(xí),讓我了解到它是一門深沉的學(xué)科,可以提高對(duì)計(jì)算機(jī)的認(rèn)識(shí),對(duì)計(jì)算機(jī)本身的原理的理解。這次課程設(shè)計(jì)是對(duì)操作系統(tǒng)的一個(gè)總結(jié)和復(fù)習(xí)的過(guò)程,其中,我們不僅學(xué)到了專業(yè)的知識(shí),也提升了自己的學(xué)習(xí)能力。對(duì)計(jì)算機(jī)部運(yùn)行的功能與結(jié)構(gòu)的運(yùn)行有了更深的知識(shí)與了解?!坝?jì)算機(jī)操作系統(tǒng)”是計(jì)算機(jī)專業(yè)的重要專業(yè)基礎(chǔ)課,是從事計(jì)算機(jī)研究與應(yīng)用的基礎(chǔ),是計(jì)算機(jī)專業(yè)必修的課程之一,為更好的培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn),提出,分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力,對(duì)這門課開(kāi)設(shè)了課程設(shè)計(jì)。課程設(shè)計(jì)是對(duì)學(xué)生實(shí)際工作能力的具體訓(xùn)練和考察過(guò)程.隨著科學(xué)技術(shù)發(fā)展的日新日異,計(jì)算機(jī)操作系
16、統(tǒng)已經(jīng)成為當(dāng)今計(jì)算機(jī)應(yīng)用中空前活躍的領(lǐng)域,是很多技術(shù)的基礎(chǔ)在生活中可以說(shuō)得是無(wú)處不在。因此作為二十一世紀(jì)的大學(xué)來(lái)說(shuō)掌握計(jì)算機(jī)操作系統(tǒng)是十分重要的。剛開(kāi)始做課程設(shè)計(jì)的時(shí)候,看著任務(wù)書感到非常的茫然,不知道也不清楚該從何下手,查資料,看課本幾乎用了我一半的課程設(shè)計(jì)時(shí)間。到真正上機(jī)調(diào)試的時(shí)候,問(wèn)題又接二連三的出現(xiàn)。先是對(duì)應(yīng)用軟件使用的不了解,導(dǎo)致了上機(jī)很被動(dòng),在老師和同學(xué)的幫助下,才能勉強(qiáng)把自己的思路在軟件上表述出來(lái)。其次,在課程設(shè)計(jì)出現(xiàn)問(wèn)題時(shí),不知道該如何快速的查找錯(cuò)誤出處,導(dǎo)致了時(shí)間上的浪費(fèi)。雖然在老師和同學(xué)的幫助下,最后被動(dòng),勉強(qiáng)的完成了課程設(shè)計(jì)任務(wù),但在期間所體現(xiàn)出來(lái)的問(wèn)題,卻讓我有一種“晴
17、天霹靂”的感覺(jué)。在課程設(shè)計(jì)時(shí),我也找到了一些問(wèn)題的所在,不單單是對(duì)平時(shí)的知識(shí)的學(xué)習(xí),還有平時(shí)學(xué)習(xí)的方法。課程設(shè)計(jì)是為了我們把平時(shí)所學(xué)的知識(shí)運(yùn)用到實(shí)際中去,但當(dāng)課程實(shí)際開(kāi)始時(shí)候,我們就出現(xiàn)了“無(wú)從下手”的問(wèn)題,好像平時(shí)所學(xué)的知識(shí)根本用不上。這些問(wèn)題的出現(xiàn)一方面是我平時(shí)知識(shí)的掌握不夠牢固所造成的;另一方面是因?yàn)椋谄綍r(shí)的學(xué)習(xí)中,課本與實(shí)踐的結(jié)合過(guò)少所引起的。不僅于此,對(duì)于以前學(xué)習(xí)的C的運(yùn)用,因?yàn)閷W(xué)的不好,而在編程的過(guò)程中費(fèi)了不少周折,比如動(dòng)態(tài)申請(qǐng)字符串的存空間,申請(qǐng)之后沒(méi)有初始化就直接使用,造成了路徑錯(cuò)誤。后來(lái)使用比較簡(jiǎn)單的直接覆蓋的方法才解決了。另外,就是我對(duì)這門課容的學(xué)習(xí)感受。要學(xué)好這門課,以
18、我愚見(jiàn)無(wú)非有以下三點(diǎn):1)課本上應(yīng)該記住的東西一定要記住,記不住就沒(méi)法做題,若記住你做題就會(huì)做,看程序也就能看懂,記不住見(jiàn)了它就會(huì)對(duì)它不知所措,一臉茫然。2)預(yù)習(xí)很重要,這一點(diǎn)不僅適用于這一科的學(xué)習(xí),確切的說(shuō)它適用于任何一科,有的同學(xué)這一點(diǎn)作的不好,上課只知道豎著兩個(gè)耳朵傻傻的聽(tīng)老師講課,也不注意動(dòng)動(dòng)腦子隨時(shí)思考,延續(xù)以前填鴨式的學(xué)習(xí)方式,想讓老師講給所有的東西,殊不知很多東西還要自己從書本獲得。這就難免出現(xiàn)聽(tīng)不懂的情況,這好比讓一個(gè)不懂外語(yǔ)的人聽(tīng)外語(yǔ)錄音,在他的心里,聽(tīng)外語(yǔ)就像聽(tīng)天書一般,所以說(shuō)你要學(xué)一點(diǎn)新東西,前提是你對(duì)它要有一點(diǎn)了解,不然的話你所作的一切只不過(guò)是在浪費(fèi)時(shí)間,浪費(fèi)金錢,浪費(fèi)
19、生命。3)理論與實(shí)踐相結(jié)合,不懂的地方應(yīng)勤問(wèn)老師勤問(wèn)同學(xué),直到把它搞懂為止。在此次課程設(shè)計(jì)中也遇到了不少的問(wèn)題和困難,但是通過(guò)自己的努力和向同學(xué)討教都把他一一的給解決了,總之,通過(guò)這次課程設(shè)計(jì),是我對(duì)文件系統(tǒng)有了更深一部的了解,讓我對(duì)文件系統(tǒng)不再陌生,當(dāng)然自己還有很多不足的地方,希望自己在以后的學(xué)習(xí)過(guò)程中不斷的改進(jìn),這樣才能讓自己進(jìn)步,才能讓自己更上一層樓。七、附錄(源程序清單)#include <stdio.h>#include <string.h>#include <stdlib.h>#define BlockSize 512#define DirSiz
20、e 32#define RootSize 2struct ReserveBlock int sysblocknum;/*文件系統(tǒng)總扇區(qū)數(shù)*/ int resblocknum;/*保留扇區(qū)扇區(qū)數(shù)*/ int fatblocknum;/*FAT表扇區(qū)數(shù)*/ int rootblocknum;/*根目錄區(qū)扇區(qū)數(shù)*/ char fillcharBlockSize-4*sizeof(int);/*填充字節(jié)*/;struct DirBlock char filename11; /*文件名限長(zhǎng)11個(gè)字符*/ char fillcharDirSize-4*sizeof(int)-sizeof(long int
21、)-11; /*填充字節(jié)*/ long filelen; /*文件長(zhǎng)度*/ int year,month,day; /*日期*/ int firstblockaddr; /*文件首塊扇區(qū)號(hào)*/;struct FCBBlock int fileid; /*文件標(biāo)識(shí)*/ long filepos; /*文件讀寫指針*/ int fdtblockindex; /*目錄項(xiàng)所在塊序號(hào)*/ struct FCBBlock *next;/*指向下一個(gè)文件控制塊的指針*/; struct ReserveBlock sys1; /*保留塊*/struct FCBBlock *fcb; /*fcb頭指針*/str
22、uct DirBlock fil32,*dir; /*目錄*/int *fat1; /*fat表頭指針*/char *str,*ptr; /*讀、寫緩沖區(qū)首地址*/char fillcharBlockSize; /*填充字符*/FILE *fp; /*文件指針*/ FILE *OPENSYS(char *filename) /*打開(kāi)文件系統(tǒng)*/ int i; fp=fopen(filename,"rb+"); fread(&sys1,1,BlockSize,fp); /*讀保留扇區(qū)*/ fat1=(int *)malloc(sys1.fatblocknum*Bloc
23、kSize); for(i=0;i<sys1.fatblocknum;i+) /*讀fat表 */ fread(fat1+i*BlockSize,BlockSize,1,fp);fseek(fp,(sys1.fatblocknum+sys1.resblocknum)*BlockSize,0); dir=fil; for(i=0;i<sys1.rootblocknum;i+) /*讀目錄 */ fread(dir+i*BlockSize/DirSize,BlockSize,1,fp); return fp; int CLOSESYS(FILE *stream) /*關(guān)閉文件系統(tǒng)*/
24、int i; fseek(stream,sys1.resblocknum*BlockSize,0); for(i=0;i<sys1.fatblocknum;i+) /*回寫fat表 */ fwrite(fat1+i*BlockSize,BlockSize,1,stream); fseek(fp,(sys1.fatblocknum+sys1.resblocknum)*BlockSize,0); for(i=0;i<sys1.fatblocknum;i+) /*回寫目錄*/ fwrite(dir+i*BlockSize/DirSize,BlockSize,1,fp); fclose(f
25、p); return 0; void LISTDIR(void) /*顯示目錄*/ int i,flag=0; for(i=0;i<32;i+) if(fili.firstblockaddr!=0) if(flag=0) printf("文件名大小創(chuàng)建日期n"); flag=1; printf("%s%8ld%4d%4d%4dn",fili.filename, fili.filelen,fili.year,fili.month,fili.day); int FCREATE(char *filename) /*創(chuàng)建文件*/ int i,flag=0,
26、j,k=0,flag1=0,flag2=0,a; int n,m; a=strlen(filename); if(a>10) return 1; for(i=0;i<sys1.rootblocknum*BlockSize/DirSize;i+) /*查找是否重名*/ if(strcmp(filename,fili.filename)=0) printf("文件名已存在!n"); return 3;for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i<sys1.sysblocknum;i+
27、) if(fat1i=0) /*查看是否有空的塊*/ flag+; if(flag=0) printf("磁盤已滿");/*統(tǒng)計(jì)結(jié)果為0,則磁盤已滿*/ return 0; printf("空閑塊數(shù):%dn",flag); printf("請(qǐng)輸入文件長(zhǎng)度:"); for(j=0;j<32;j+) if(filj.firstblockaddr=0) break; while(1) scanf("%d",&dirj.filelen);/*輸入目錄項(xiàng)中文件的長(zhǎng)度*/ n=(dirj.filelen/Bloc
28、kSize)+(dirj.filelen%BlockSize?1:0); if(n<0|n>flag)/*文件長(zhǎng)度小于0或大于空閑的空間 */ printf("文件太長(zhǎng)!n"); printf("請(qǐng)重新輸入:"); else break; for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i<sys1.sysblocknum;i+)/*分配一塊空間*/ if(fat1i=0) fat1i=-1; break; dirj.firstblockaddr=i+1; strc
29、py(dirj.filename,filename); /*輸入文件相關(guān)的信息*/ dirj.filenamea='0' printf("輸入年份:"); scanf("%d",&dirj.year); printf("輸入月份:"); scanf("%d",&dirj.month); printf("輸入日期:"); scanf("%d",&dirj.day); return (0); int FDELETE(char *filena
30、me) /*刪除文件*/int i,j,k,n,flag=1; struct FCBBlock *p; p=fcb; while(p) /*查看是否關(guān)閉了文件*/ if(strcmp(filename,filp->fdtblockindex.filename)=0) return 1; else p=p->next; for(i=0;i<sys1.rootblocknum*BlockSize/DirSize;i+) /*查找是否存在要?jiǎng)h除的文件*/ if(strcmp(filename,fili.filename)=0) flag=1; break; if(flag=0)re
31、turn 2;j=fili.firstblockaddr; while(1) k=fat1j-1; /*將要?jiǎng)h除的文件的塊用0填充*/ fseek(fp,(j-1)*BlockSize,0); fwrite(&fillchar,1,BlockSize,fp); fat1j-1=0; if(k=-1) break; else j=k;memset(&fili,0,DirSize); /*將要?jiǎng)h除的文件的目錄用0填充*/return 0;int FOPEN(char *filename) /*打開(kāi)文件 */ int i,j=0,k,flag=0,id; struct FCBBloc
32、k *p,*q,*r; p=fcb; for(i=0;i<sys1.rootblocknum*BlockSize/DirSize;i+) /*查找要打開(kāi)的文件是否存在*/ if(strcmp(filename,fili.filename)=0) flag=1; break; if(flag=0) return 0; if(fcb=NULL) fcb=(struct FCBBlock *)malloc(sizeof(struct FCBBlock); fcb->fileid=j+1; fcb->filepos=0; fcb->next=NULL; fcb->fdtb
33、lockindex=i; id=j+1; return id; else while(fcb) j+; if(strcmp(filename,filfcb->fdtblockindex.filename)=0) /*判斷是否已經(jīng)打開(kāi)*/ return 0; q=fcb; fcb=fcb->next; r=(struct FCBBlock *)malloc(sizeof(struct FCBBlock); /*創(chuàng)建fcb*/ r->fileid=j+1; r->filepos=0; r->next=NULL; r->fdtblockindex=i; q->
34、;next=r; id=j+1; fcb=p; return id; /*返回打開(kāi)的文件的標(biāo)識(shí)fileid*/long FGETLEN(char *filename) /*獲取文件的長(zhǎng)度*/ int i; for(i=0;i<sys1.rootblocknum*BlockSize/DirSize;i+) if(strcmp(filename,fili.filename)=0) return fili.filelen; return -1; int FCLOSE(char *filename)/*關(guān)閉文件 */ int flag=0; struct FCBBlock *f,*p; f=fc
35、b; if(strcmp(filename,filfcb->fdtblockindex.filename)=0) flag=1; fcb=fcb->next; p=fcb; while(p) p->fileid-=1; p=p->next; return flag; p=f; f=f->next; while(f) if(strcmp(filename,filf->fdtblockindex.filename)=0) flag=1; p=f->next; /*p=p->next;*/ while(p) p=p->next; p->fi
36、leid-=1; free(f); return flag; p=f; f=f->next; if(flag=0) printf("The file has not open!n'"); return flag; return 0; int FREAD(char *str, int n, int fileid) /*讀文件*/ int m,i,j=0,k,l,len,n1,n2=0; struct FCBBlock *p; p=fcb; while(p) /*查找要讀的文件的fcb*/ if(p->fileid=fileid) break; else p
37、=p->next; if(p=NULL) return 1; len=filp->fdtblockindex.filelen; l=p->filepos; if(l+n)>len) return 2; j=(l/BlockSize)+(l%BlockSize?1:0); /*求文件指針?biāo)谖募南鄬?duì)塊號(hào)*/ m=(l+n)/BlockSize)+(l+n)%BlockSize?1:0); k=filp->fdtblockindex.firstblockaddr; for(i=1;i<j;i+) /*求文件指針?biāo)诘膲K號(hào)*/ k=fat1k-1; str=(c
38、har *)malloc(m-j+1)*BlockSize+1); /*分配讀取的緩沖區(qū)*/ for(i=0;i<(m-j+1);i+) /*讀文件*/ fseek(fp,(k-1)*BlockSize,0); fread(&stri*BlockSize,BlockSize,1,fp); k=fat1k-1; strn+l-(j-1)*BlockSize='0' /*截?cái)喽嘧x的容*/ if(l!=0) str=&strl-(j-1)*BlockSize; p->filepos=n+l; /*修改文件指針*/ printf("%sn"
39、;,str); return 0; int FWRITE(char *ptr, int n, int fileid) /*文件寫*/ long l; int m,i=0,j,k=0,num,flag=0,flag1=0,b,flag2=0; int n1,n2=0,n3,c; struct FCBBlock *p; char *st1,*st2; st1=(char *)malloc(BlockSize); p=fcb; while(p) /*查找文件的fcb*/ if(p->fileid=fileid) break; else p=p->next; if(p=NULL) retu
40、rn 1; l=p->filepos; n1=filp->fdtblockindex.firstblockaddr;while(n1!=-1) n2+; m=n1-1; n1=fat1n1-1; if(l+n)>n2*BlockSize) /*判斷是否要追加空間*/ n3=(l+n)/BlockSize+(l+n)%BlockSize?1:0)-n2; /*追加空間*/ for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i<sys1.sysblocknum;i+) if(fat1i=0) flag+;
41、 if(flag=0) printf("磁盤已滿"); return 2; if(l+n-filp->fdtblockindex.filelen)>flag*BlockSize) return 3; for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i<sys1.sysblocknum;i+) if(fat1i=0) k+; if(k>=n3) fat1m=i+1; fat1i=-1; break; else fat1m=i+1; m=i; flag=0; k=0; n3=(l+n
42、)/BlockSize+(l+n)%BlockSize?1:0); j=(l/BlockSize)+(l%BlockSize?1:0); /*求文件指針?biāo)谖募南鄬?duì)塊號(hào)*/ st2=(char *)malloc(n3-j+1)*BlockSize); if(l=0) j=1; num=filp->fdtblockindex.firstblockaddr; for(i=1;i<j;i+) num=fat1num-1; if(!l%BlockSize) /*寫第1塊*/ fseek(fp,(num-1)*BlockSize+l-(i-1)*BlockSize,0); fread(st
43、2,BlockSize,1,fp); for(c=0;c<n;c+) st2c=ptrc; fseek(fp,(num-1)*BlockSize+l-(i-1)*BlockSize,0); fwrite(st2,BlockSize,1,fp); num=fat1num-1; fflush(fp); else fseek(fp,(num-1)*BlockSize,0); fread(st2,BlockSize,1,fp); for(c=0;c<n;c+) st2c+l-(j-1)*BlockSize=ptrc; fseek(fp,(num-1)*BlockSize,0); fwrit
44、e(st2,BlockSize,1,fp); num=fat1num-1; fflush(fp); for(i=1;i<(n3-j);i+) /*寫第2塊-倒數(shù)第2塊*/ fseek(fp,(num-1)*BlockSize,0); fwrite(st2+i*BlockSize,BlockSize,1,fp); num=fat1num-1; fflush(fp); if(n3-j)>0) /*寫最后一塊*/ fseek(fp,(num-1)*BlockSize,0); fread(st2+i*BlockSize,BlockSize,1,fp); for(c=0;c<(n-(j*BlockSize-l)+(i-1)*BlockSize);c+) st2c+i*BlockSize=ptrc+(j*BlockSize-l)+(i-1)*BlockSi
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)銷售與服務(wù)流程規(guī)范
- 2024年福州大學(xué)至誠(chéng)學(xué)院輔導(dǎo)員考試筆試真題匯編附答案
- 2024年荊州理工職業(yè)學(xué)院輔導(dǎo)員考試筆試題庫(kù)附答案
- 2024年貴州文化旅游職業(yè)學(xué)院輔導(dǎo)員招聘考試真題匯編附答案
- 2024年遼寧職業(yè)學(xué)院輔導(dǎo)員考試筆試題庫(kù)附答案
- 2024年鄭州電力職業(yè)技術(shù)學(xué)院輔導(dǎo)員考試參考題庫(kù)附答案
- 2024年重慶電信職業(yè)學(xué)院輔導(dǎo)員考試參考題庫(kù)附答案
- 2024年長(zhǎng)春開(kāi)放大學(xué)輔導(dǎo)員考試筆試真題匯編附答案
- 2024年阿克蘇工業(yè)職業(yè)技術(shù)學(xué)院輔導(dǎo)員考試參考題庫(kù)附答案
- 2025上海復(fù)旦大學(xué)附屬婦產(chǎn)科醫(yī)院博士后招聘?jìng)淇碱}庫(kù)附答案
- 2024-2025學(xué)年江蘇省南京市玄武區(qū)八年級(jí)上學(xué)期期末語(yǔ)文試題及答案
- 專升本語(yǔ)文教學(xué)課件
- 別人買房子給我合同范本
- 電力通信培訓(xùn)課件
- 中建三局2024年項(xiàng)目經(jīng)理思維導(dǎo)圖
- 基層黨建知識(shí)測(cè)試題及答案
- DG-TJ08-2021-2025 干混砌筑砂漿抗壓強(qiáng)度現(xiàn)場(chǎng)檢測(cè)技術(shù)標(biāo)準(zhǔn)
- 鼻竇炎的護(hù)理講課課件
- 腸系膜脂膜炎CT診斷
- 體外膜肺氧合技術(shù)ECMO培訓(xùn)課件
- 老年醫(yī)院重點(diǎn)專科建設(shè)方案
評(píng)論
0/150
提交評(píng)論