版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、內(nèi)含源代碼,不懂可以百度消息給我多級文件目錄管理實(shí)訓(xùn)報(bào)告-FileManager院別:計(jì)算機(jī)學(xué)院姓名:LDY學(xué)號:20110040xxxxxx班級:計(jì)Y11x 廣西科技大學(xué)大學(xué) 計(jì)算機(jī)學(xué)院 Creation time: 2013-1-8 17:44:25目錄1實(shí)驗(yàn)?zāi)康?2實(shí)驗(yàn)內(nèi)容22.1實(shí)驗(yàn)題目:樹狀多級文件目錄管理系統(tǒng)22.2實(shí)驗(yàn)要求:功能實(shí)現(xiàn)23設(shè)計(jì)分析33.1數(shù)據(jù)結(jié)構(gòu)分析:樹形目錄的存儲(chǔ)、刪除及樹的顯示33.2 數(shù)據(jù)結(jié)構(gòu)定義73.3 功能分析和函數(shù)定義104 功能總覽154.1 功能總覽154.2主要功能155 實(shí)訓(xùn)總結(jié)195.1 所遇困難195.2 心得體會(huì)20841實(shí)驗(yàn)?zāi)康谋敬螌?shí)訓(xùn)的
2、總體目的在于通過系統(tǒng)的編程訓(xùn)練,培養(yǎng)學(xué)生編寫一個(gè)具有一定難度的小型系統(tǒng)的能力,培養(yǎng)學(xué)生從編寫單個(gè)程序,實(shí)現(xiàn)單個(gè)程序功能到進(jìn)行系統(tǒng)開發(fā),整體調(diào)試的能力。從知識點(diǎn)的角度來說,目的在于通過本實(shí)訓(xùn)項(xiàng)目,讓學(xué)生對鏈表或二叉樹這一重要數(shù)據(jù)結(jié)構(gòu)的運(yùn)用更加熟練。2實(shí)驗(yàn)內(nèi)容2.1實(shí)驗(yàn)題目:樹狀多級文件目錄管理系統(tǒng)本次實(shí)訓(xùn)的題目是樹狀多級文件目錄管理系統(tǒng)。要求利用數(shù)據(jù)結(jié)構(gòu)的知識,采用鏈表的形式或通過將樹轉(zhuǎn)換為二叉樹的概念,采用孩子兄弟二叉樹的方式實(shí)現(xiàn)文件目錄系統(tǒng)。不容許采用數(shù)據(jù)庫實(shí)現(xiàn)文件管理。每個(gè)樹結(jié)點(diǎn)表示一個(gè)文件(包括目錄文件),成員基本信息可包含,文件名、文件屬性、文件大小、文件創(chuàng)建時(shí)間,文件最后修改時(shí)間、文
3、件最后訪問時(shí)間等信息。具體屬性自行確定(注意:成員基本信息盡量與Window系統(tǒng)中文件具有的屬性信息相同,以便對文件進(jìn)行磁盤存取時(shí)保證文件的屬性信息不丟失)。2.2實(shí)驗(yàn)要求:功能實(shí)現(xiàn)要求實(shí)現(xiàn)的總體基本功能包括:文件的創(chuàng)建和刪除;文件夾的創(chuàng)建和刪除;文件的讀寫和執(zhí)行;文件的層次化顯示;打開和關(guān)閉文件;顯示目錄下的文件;查找給定文件和目錄;根據(jù)給定屬性對文件進(jìn)行排序;選做功能包括:將內(nèi)存中的多級文件系統(tǒng)存儲(chǔ)到磁盤中,將磁盤中某目錄下的文件系統(tǒng)讀入系統(tǒng)并回購多級目錄系統(tǒng)。3設(shè)計(jì)分析3.1數(shù)據(jù)結(jié)構(gòu)分析:樹形目錄的存儲(chǔ)、刪除及樹的顯示3.1.1存儲(chǔ)結(jié)構(gòu):采用孩子兄弟二叉鏈表存儲(chǔ)方式孩子兄弟表示法:又稱二
4、叉樹表示法,或二叉鏈表表示法。即以二叉鏈表作樹的存儲(chǔ)結(jié)構(gòu)。鏈表中結(jié)點(diǎn)的兩個(gè)鏈域分別指向該結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn)和下一個(gè)兄弟結(jié)點(diǎn),分別命名為firstchild域和nextsibling 域。- - - - -樹的二叉鏈表(孩子-兄弟)存儲(chǔ)表示- - - - -typedef struct CSNode ElemType data;struct CSNode *firstchild, * nextsibling;CSNode, *CSTree;RABCDEFGHK圖3.1樹的孩子兄弟表示方法實(shí)例圖3.2 是圖3.1 中的樹的孩子兄弟鏈表。利用這種存儲(chǔ)結(jié)構(gòu)便于實(shí)現(xiàn)各種樹的操作。首先易于實(shí)現(xiàn)找結(jié)點(diǎn)孩子
5、等的操作。例如:若要訪問結(jié)點(diǎn)x 的第i 個(gè)孩子,則只要先從firstchild 域找到第1 個(gè)孩子結(jié)點(diǎn),然后沿著孩子結(jié)點(diǎn)的nextsbling 域連續(xù)走i-1 步,便可找到x 的第i 個(gè)孩子. 當(dāng)然,如果為每個(gè)結(jié)點(diǎn)增設(shè)一個(gè)PA RENT 域,則同樣能方便地實(shí)現(xiàn)PARENT(T , x) 操作。RABCDEFBC圖3.2 圖3.1的孩子兄弟表示3.1.2基于二叉表的操作:新建、刪除和顯示等·新建(父目錄指針為函數(shù)參數(shù))·目錄為空,在父目錄的左孩子新建節(jié)點(diǎn)·目錄不為空,在父目錄下的最后兄弟(最后創(chuàng)建時(shí)間)新建節(jié)點(diǎn)掛在最后兄弟右兄弟上。根目錄root21新建節(jié)點(diǎn):目錄為
6、空,放到雙親節(jié)點(diǎn)的左孩子3新建節(jié)點(diǎn):目錄不為空,放到同目錄最后創(chuàng)建的的節(jié)點(diǎn)的右兄弟節(jié)點(diǎn)中4新建節(jié)點(diǎn):同目錄新建,同上父目錄左孩子指針同層次右兄弟指針同層次右兄弟指針圖3.3 孩子兄弟存儲(chǔ):新建文件夾/文件數(shù)字表示創(chuàng)建順序?qū)崿F(xiàn):傳遞上級目錄節(jié)點(diǎn)(父節(jié)點(diǎn)),判斷父節(jié)點(diǎn)左孩子是否為空,為空則生成左孩子,不為空,則沿著左孩子的右兄弟尋找(將右兄弟作為鏈表移動(dòng)到最后一個(gè)節(jié)點(diǎn)),直到遇到為最后兄弟,生成一個(gè)右兄弟掛在最后兄弟上。·刪除(銷毀)·單個(gè)文件,直接刪除節(jié)點(diǎn),釋放內(nèi)存·文件夾,刪除文件夾下內(nèi)容,注意要釋放內(nèi)存。根目錄刪除第一個(gè)節(jié)點(diǎn):將左孩子樹全部刪除后(若為文件夾),
7、刪除本身,最后將右兄弟連接到雙親的左孩子上刪除文件夾:先刪除左孩子d,再刪除本身,將右兄弟e連接到左兄弟b上刪除文件:直接刪除dcabe圖3.4 孩子兄弟存儲(chǔ):刪除文件夾/文件實(shí)現(xiàn):傳遞上級目錄節(jié)點(diǎn)(父節(jié)點(diǎn)),判斷父節(jié)點(diǎn)左孩子是否為空,為空時(shí)不用處理,不為空時(shí)用提供的名字(其它信息),在右兄弟組成的鏈表中(只看該目錄下右指針相連的節(jié)點(diǎn))尋找到要?jiǎng)h除節(jié)點(diǎn)。以父目錄指針的左孩子指針為鏈表第一個(gè)節(jié)點(diǎn)遍歷,有兩種情況:1第一個(gè)節(jié)點(diǎn)恰是刪除節(jié)點(diǎn)判斷該節(jié)點(diǎn)左孩子指針是否為空,為空則說明這是文件或文件夾下無內(nèi)容,直接刪除(釋放內(nèi)存),將右指針掛到父目錄左孩子上。2第二個(gè)節(jié)點(diǎn)不是刪除節(jié)點(diǎn)繼續(xù)往該節(jié)點(diǎn)右指針遍歷
8、,找到節(jié)點(diǎn)后判斷該節(jié)點(diǎn)左孩子指針是否為空,為空則說明這是文件或文件夾下無內(nèi)容,直接刪除(釋放內(nèi)存),將右指針掛到上一個(gè)節(jié)點(diǎn)上。補(bǔ)充文件夾刪除方法:采用后序刪除,將刪除節(jié)點(diǎn)的指針傳遞到遞歸后序刪除函數(shù),能將其下節(jié)點(diǎn)全部釋放內(nèi)存,最后將本身刪除。(注意保存該節(jié)點(diǎn)的上一個(gè)兄弟和下一個(gè)兄弟,如果有)·顯示:主要是二叉樹的遍歷問題引例:于下圖的一棵孩子兄弟二叉樹根目錄eabdcf圖3.5 二叉樹的顯示樹形式表示根目錄eabdcf第一層次第三層次第四層次圖3.6 圖3.5形成的樹·層次顯示:給出文件夾節(jié)點(diǎn),遍歷該節(jié)點(diǎn)右兄弟連接形成的單鏈表·第一層次(根目錄層次,無分支情況):
9、給出根節(jié)點(diǎn),左孩子節(jié)點(diǎn)作為該目錄下第一個(gè)文件夾/文件,沿著其找遍右兄弟,直到不存在右兄弟為止(NULL)·第二層次(上圖中,有三種分支):對于對于根目錄下每個(gè)兄弟節(jié)點(diǎn)分別作為根節(jié)點(diǎn),若存在左孩子,重新找遍節(jié)點(diǎn)下的右兄弟,直到找不到為止·第三層次:同上····注意:應(yīng)當(dāng)是每次都只能顯示一個(gè)層次中某一目錄(一個(gè)文件夾)下全部內(nèi)容實(shí)現(xiàn):給出一個(gè)文件夾作為目錄根節(jié)點(diǎn),判斷其是否存在左孩子,存在則沿著左孩子的右兄弟鏈顯示。·查找(關(guān)鍵在于取得其在樹中的路徑)遍歷查找:遞歸先序查找關(guān)鍵字,找到后,列出屬性等信息。其中獲得其路徑方法:1查
10、看雙親,自己是否是左孩子,若是,保存雙親名字,返回上一級,查看它的雙親是左孩子嗎,是,則保存保存雙親的雙親,一路返回判斷,直到遇到樹根為止。(我沒實(shí)現(xiàn))2·path: path作為文件/文件夾的結(jié)構(gòu)體的一個(gè)成員,保存的是每個(gè)節(jié)點(diǎn)的路徑位置,因?yàn)樯晒?jié)點(diǎn)時(shí)傳遞的是其上級父目錄,而其父目錄的路徑path加上本身名字就是新節(jié)點(diǎn)的path,這是在生成時(shí)決定的,path在以后用處很多。3·parent:parent作為文件/文件夾的結(jié)構(gòu)體的一個(gè)成員,保存的是每個(gè)節(jié)點(diǎn)的上級目錄名字,不斷返回將全部parent連接便是該節(jié)點(diǎn)路徑。·目錄返回:總體思想是用棧保存當(dāng)前目錄,保證在層
11、次間來回處理文件夾。(已實(shí)現(xiàn))·返回上級目錄出棧上級目錄·選擇下級目錄入棧當(dāng)前目錄3.2 數(shù)據(jù)結(jié)構(gòu)定義3.2.1 文件夾/文件結(jié)構(gòu)定義:folder/file structurestructure Folder/Filename;attribute;size;creationTime;editTime;finalAccessTime;path;fileParent;leftChild;rightBrother;folder, file, pointer;·name變量:名字類型:char nameNAMESIZE;·attribute變量:屬性類型:un
12、signed int attrib;- - - - -使用的是系統(tǒng)定義屬性:unsigned attrib- - - - -·_A_ARCH(存檔) ·_A_HIDDEN(隱藏) ·_A_NORMAL(正常) ·_A_RDONLY(只讀) ·_A_SUBDIR(文件夾) ·_A_SYSTEM(系統(tǒng)) ·size變量:大小類型:long size;·creationTime;變量:創(chuàng)建時(shí)間·editTime;變量:修改時(shí)間·finalAccessTime變量:最后訪問時(shí)間類型time struct
13、urestruct timeint year;int month;int day;int hour;int minute;int second;·path變量:路徑類型:char pathPATHSIZE;說明:類似windows中的位置,在創(chuàng)建時(shí),將上級路徑與本身名字連接格式成串·fileParent變量:父母類型:File/folder structure pointer說明:出于確定路徑的考慮,要想得到某文件夾/文件路徑,只需向上獲得雙親名字,但實(shí)際沒有用到·leftChild變量:父母類型:File/folder structure pointer說明:指
14、向左孩子的指針·rightBrother變量:父母類型:File/folder structure pointer說明:指向右兄弟的指針3.2.2 保存當(dāng)前目錄棧結(jié)構(gòu)定義:stack for store current director pointerstructure stackcurrentHander;top;bottom;·currentHander變量:當(dāng)前指針類型:file/folder structure pointer currentHanderSTACKSIZE;說明:保存目錄的堆棧·top變量:棧頂類型:int top;·bottom
15、變量:棧底類型:int bottom;3.2.3 信息結(jié)構(gòu)定義:message structurestructure messageMsgType;·MsgType變量:消息類型:unsigned int MsgType;說明:模仿windows消息驅(qū)動(dòng)機(jī)制的- - - - -消息類型定義- - - - -·message definition·Deal with file/ 處理文件夾/文件define NEWFILE0X006define NEWFOLDER0X007define DELETEF0X008define DISPLAY0X009define SE
16、ARCH0X00A ·Jump instruction/ 處理文件夾進(jìn)入返回define BACK0X00Bdefine FORWARD0X00C ·Read or write file/ 處理文件讀寫define READFILE0X00Ddefine WRITEFILE0X00E ·Write or read DISC/ 處理磁盤讀寫define WDISC0X00Fdefine RDISC0X010 ·Exit/ 處理程序退出define HALF0X011 ·wait for instrutios/ 程序等待命令define WAIT0
17、X0123.2.4 函數(shù)狀態(tài)定義·typedef int status;·define ERROR -1·define FAIL 0·define OK 13.2.5 常量定義constantdefine NAMESIZE128define PATHSIZE128define TIMESIZE128define STACKSIZE1283.3 功能分析和函數(shù)定義3.3.1 程序初始化(initialization)函數(shù)原型:status initFileManager(folderHandle *root, stack *FStack);參數(shù):根目錄節(jié)點(diǎn)
18、,堆棧指針說明:初始化根節(jié)點(diǎn),將節(jié)點(diǎn)入棧保存部分代碼:strcpy(*root)->name, FName);(*root)->attrib= _A_SUBDIR;(*root)->size= 0;(*root)->creationTime= getLocalTime();(*root)->editTime= initTime();(*root)->finalAccessTime= initTime();strcpy(*root)->path, FName);(*root)->fileParent= NULL;(*root)->leftCh
19、ild= NULL;(*root)->rightBrother= NULL;3.3.2 消息循環(huán)等待·獲取消息函數(shù)原型:status getMessager(folderHandle currentRoot, MSG *message);參數(shù):當(dāng)前根目錄節(jié)點(diǎn),消息·處理消息函數(shù)原型:status dealWithMessage(folderHandle *root, folderHandle *currentRoot, MSG *message, stack *FStack);參數(shù):根目錄節(jié)點(diǎn),當(dāng)前目錄節(jié)點(diǎn),消息,保存目錄棧說明:在當(dāng)前目錄下處理消息3.3.3 新建&
20、#183;新建文件夾函數(shù)原型:status createFolder(folderHandle parentFolder);參數(shù):創(chuàng)建的的父目錄指針·新建文件函數(shù)原型:status createFile(folderHandle parentFolder);參數(shù):創(chuàng)建的的父目錄指針說明:新建文件夾或文件的情況是一樣的,之所以分開是因?yàn)椋瑒?chuàng)建文件時(shí)要判斷是否有同名文件,創(chuàng)建文件夾時(shí)要判斷是否有同名文件夾,且創(chuàng)建文件時(shí)要輸入文件的屬性信息。實(shí)現(xiàn):判斷父節(jié)點(diǎn)左孩子是否為空,為空則生成左孩子,不為空,則沿著左孩子的右兄弟尋找(將右兄弟作為鏈表移動(dòng)到最后一個(gè)節(jié)點(diǎn)),直到遇到為最后兄弟,生成一個(gè)
21、右兄弟掛在最后兄弟上。過程:輸入名字,判斷同名,分配內(nèi)存,初始化文件/文件夾結(jié)構(gòu)體,特別是左右指針置空,可以輸入文件內(nèi)容,兩種存儲(chǔ)方式,另外定義存儲(chǔ)文本的數(shù)組,或新建文本保存,寫入磁盤時(shí)復(fù)制,判斷位置,成功掛上。3.3.4 刪除函數(shù)原型:status deleteFiOrFo(folderHandle parentFolder);參數(shù):要?jiǎng)h除節(jié)點(diǎn)的父目錄指針實(shí)現(xiàn):判斷父節(jié)點(diǎn)左孩子是否為空,為空時(shí)不用處理,不為空時(shí)用提供的名字(其它信息),在右兄弟組成的鏈表中(只看該目錄下右指針相連的節(jié)點(diǎn))尋找到要?jiǎng)h除節(jié)點(diǎn)。以父目錄指針的左孩子指針為鏈表第一個(gè)節(jié)點(diǎn)遍歷,有兩種情況:1第一個(gè)節(jié)點(diǎn)恰是刪除節(jié)點(diǎn)判斷該
22、節(jié)點(diǎn)左孩子指針是否為空,為空則說明這是文件或文件夾下無內(nèi)容,直接刪除(釋放內(nèi)存),并將右指針掛到父目錄左孩子上。2第二個(gè)節(jié)點(diǎn)不是刪除節(jié)點(diǎn)繼續(xù)往該節(jié)點(diǎn)右指針遍歷,找到節(jié)點(diǎn)后判斷該節(jié)點(diǎn)左孩子指針是否為空,為空則說明這是文件或文件夾下無內(nèi)容,直接刪除(釋放內(nèi)存),并將右指針掛到上一個(gè)節(jié)點(diǎn)上。過程:輸入名字,尋找匹配,判斷位置,無左孩子刪除,有左孩子調(diào)用刪除文件夾的函數(shù),將右兄弟掛到刪除節(jié)點(diǎn)前的指針。刪除文件夾:函數(shù)原型:status deleteFolder(folderHandle FoldHandle);parameter:要?jiǎng)h除的節(jié)點(diǎn)的指針實(shí)現(xiàn):采用遞歸后序刪除函數(shù),能將其下節(jié)點(diǎn)全部釋放內(nèi)存,
23、最后將本身刪除。3.3.5 顯示和查找·顯示函數(shù)原型:status display(folder parentFolder); 參數(shù):要顯示的文件夾指針(父目錄)實(shí)現(xiàn):判斷所給父目錄左孩子是否為空,空則無內(nèi)容,判斷是文件或文件夾,輸出時(shí)做區(qū)別,且統(tǒng)計(jì)文件夾與文件個(gè)數(shù),此處模仿dos輸出信息,還有大小等。說明:只能顯示同一目錄下全部內(nèi)容過程:以父目錄左孩子指針為起點(diǎn),遍歷右兄弟串成的鏈表,調(diào)用讀取單個(gè)文件/文件夾信息函數(shù),這是為了方便而分開函數(shù)功能。·查找函數(shù)原型:status searchF(folderHandle FRoot);參數(shù):父目錄先序遍歷函數(shù)函數(shù)原型:stat
24、us searchTrave(folderHandle FRoot, char *FName);參數(shù):父目錄節(jié)點(diǎn),查找名字3.3.6 獲取文件夾/文件信息·讀文件夾/文件信息函數(shù)原型:status readFInfo(folderHandle thisF, unsigned int readType);參數(shù):文件夾/文件指針,讀取類型說明:讀取一個(gè)文件夾/文件的信息并輸出3.3.7 進(jìn)入/退出文件夾·進(jìn)入文件夾函數(shù)原型:status forward(folderHandle *currentRoot, stack *Fstack);參數(shù):當(dāng)前目錄,保存目錄棧·退出
25、文件夾函數(shù)原型:status back(folderHandle *currentRoot, stack *Fstack);參數(shù):當(dāng)前目錄,保存目錄棧3.3.8 堆棧處理·入棧函數(shù)原型:status push(stack *Fstack, folderHandle currentHandle);·出棧函數(shù)原型:folderHandle pop(stack *Fstack);3.3.9 處理時(shí)間·獲得本地時(shí)間函數(shù)原型:fileTime getLocalTime();·轉(zhuǎn)換成結(jié)構(gòu)體時(shí)間函數(shù)原型:char *formatTime(fileTime FTime)
26、;3.3.10 磁盤讀寫·讀磁盤函數(shù)原型:status readVolumeToFM(folderHandle *fileRoot,folderHandle *currentRoot, stack *FStack);·寫磁盤函數(shù)原型:status writeFMToVolume(folderHandle fileRoot);3.4 所需頭文件·stdio.h·printf();·scanf();·fflush(stdin);·fopen();·fclose();·fputc();·fgetc()
27、;·getchar();·putchar();·FILE·EOF·malloc.h·malloc();·free();·stdlib.h·system();·itoa();·string.h·strcpy();·strcat();·strcmp();·time.h·time_t·tm·time();·localtime();·direct.h·_mkdir();·_getcwd
28、·_chdir();·_getdiskfree();·_diskfree_t·avail_clusters·sectors_per_cluster·bytes_per_sector·sys/stat.h·stat·st_size·io.h·_finddata_t·name·attrib·_A_SUBDIR·_A_NORMAL·_A_RDONLY·_A_SYSTEM·_A_HIDDEN·time_create
29、·time_write·time_access·_findfirst();·_findnext();·_findclose();4 功能總覽4.1 功能總覽圖4.1 主界面4.2主要功能4.2.1新建文件圖4.2新建文件4.2.2新建文件夾圖4.3新建文件夾4.2.3 顯示文件夾圖4.4顯示文件夾4.2.4 進(jìn)入文件夾圖4.5進(jìn)入文件夾4.2.5 子文件夾新建圖4.6 子文件夾新建4.2.6 子文件夾顯示圖4.7 子文件夾顯示4.2.7返回上層目錄圖4.8 返回上層目錄4.2.8 查找圖4.9 查找4.2.9 刪除后顯示圖4.10刪除后顯示4.
30、2.10 寫入磁盤圖4.11寫入磁盤1圖4.12寫入磁盤24.2.11 讀給定路徑磁盤圖4.13讀給定磁盤5 實(shí)訓(xùn)總結(jié)5.1 所遇困難·字符串輸入與返回由于我采用的是將輸入信息作為一個(gè)函數(shù),則要考慮名字等字符串的輸入和返回,原來是將字符串的數(shù)組名返回,但無法獲得輸入名字,發(fā)現(xiàn)是函數(shù)出入棧原因,返回一個(gè)本地變量是不應(yīng)該的,而且,用什么接收數(shù)組也是問題解決辦法是,將輸入信息存儲(chǔ)在動(dòng)態(tài)分配的堆中,然后返字符串首地址即可。·雙重指針使用程序使用到很多雙重指針,況且還有結(jié)構(gòu)體等復(fù)雜數(shù)據(jù)類型,所以使用結(jié)構(gòu)體內(nèi)成員時(shí)*FHandle->name是錯(cuò)誤的,因?yàn)?>的優(yōu)先級較高于
31、*,應(yīng)加括號(*FHandle)->name·指向越界while(fileRightbrother)fileRightbrother = fileRightbrother->rightBrother;fileRightbrother->rightBrother = newFolder;這樣使用時(shí)錯(cuò)誤的,原因不確定fileRightbrother是否是存在不為空的指針域rightBrother。應(yīng)該為:folderHandle fileRightbrother = parentFolder->leftChild;while(fileRightbrother-&g
32、t;rightBrother)fileRightbrother = fileRightbrother->rightBrother;fileRightbrother->rightBrother = newFolder;5.2 心得體會(huì)本次實(shí)訓(xùn)的總體目的在于通過系統(tǒng)的編程訓(xùn)練,編寫一個(gè)具有一定難度的小型系統(tǒng)的能力,培養(yǎng)了我從編寫單個(gè)程序,實(shí)現(xiàn)單個(gè)程序功能到進(jìn)行系統(tǒng)開發(fā),整體調(diào)試的能力。從知識點(diǎn)的角度來說,通過本實(shí)訓(xùn)項(xiàng)目,對鏈表或二叉樹這一重要數(shù)據(jù)結(jié)構(gòu)的運(yùn)用更加熟練。源代碼:/ FileManager.cpp/ Functions for FileManager/ Need Header
33、 file/#include "FileManager.h"#include <stdio.h>#include <malloc.h>#include <string.h>#include <time.h>#include <stdlib.h>#include <direct.h>#include <sys/stat.h>#include <io.h>/ Function definition/ Programming information and help/ Programm
34、ing informationvoid prgInfo(void)printf("FileManger0.0n");printf("<C> 2012/12 - 2012/12");printf("nn");/ Programming helpvoid needHelp(void)printf("%2d Clean screen and instruction promptnn", HELP);printf("%2d Create new filen", NEWFILE);printf
35、("%2d Create new foldern", NEWFOLDER);printf("%2d Deleten", DELETEF);printf("%2d Displayn", DISPLAY);printf("%2d for searchnn", SEARCH);printf("%2d Back upn", BACK);printf("%2d Go forwardnn", FORWARD);printf("%2d Read filen", READ
36、FILE);printf("%2d Write filenn", WRITEFILE);printf("%2d Write FileManage to driven", WDISC);printf("%2d Read drive to FileManagenn", RDISC);printf("%2d Exitn", HALF);/ Get instructions and to do/ Get messagestatus getMessager(folderHandle currentRoot, MSG *mes
37、sage)printf("n");printf("%s>", currentRoot->path);scanf("%d", &(message->MsgType);fflush(stdin);return OK;/ Deal with messagestatus dealWithMessage(folderHandle *root, folderHandle *currentRoot, MSG *message, stack *FStack)switch(message->MsgType)case HE
38、LP:system("cls");prgInfo();needHelp();break;case NEWFILE:createFile(*currentRoot);break;case NEWFOLDER:createFolder(*currentRoot);break;case DELETEF:deleteFiOrFo(*currentRoot);break;case DISPLAY:display(*currentRoot);break;case SEARCH:searchF(*root);break;case BACK:back(currentRoot, FStack
39、);break;case FORWARD:forward(currentRoot, FStack);break;case READFILE:readFile(*currentRoot);break;case WRITEFILE:writeFile(*currentRoot);break;case WDISC:writeFMToVolume(*root);break;case RDISC:readVolumeToFM(root, currentRoot, FStack);break;case HALF:return FAIL;break;default:printf("The inst
40、ruction is not recognized as an internal or external commandn");break;message->MsgType = WAIT;/ 防止輸入錯(cuò)誤時(shí)return OK;/ Deal with folder/file/ Initiliatize FileManagerstatus initFileManager(folderHandle *root, stack *FStack)if(!root)/ 根目錄指針不存在,返回錯(cuò)誤return ERROR;if(!(*root = (folderHandle)malloc(si
41、zeof file)/ 分配內(nèi)存失敗, 返回return FAIL;printf("Create the root director of FileManagern");char *FName = getFInfo();/ 初始化根目錄strcpy(*root)->name, FName);(*root)->attrib= _A_SUBDIR;(*root)->size= 0;(*root)->creationTime= getLocalTime();(*root)->editTime= initTime();(*root)->final
42、AccessTime= initTime();strcpy(*root)->path, FName);(*root)->fileParent= NULL;(*root)->leftChild= NULL;(*root)->rightBrother= NULL;/ 初始化當(dāng)前目錄棧FStack->bottom = FStack->top = 0;_mkdir(FName);/ 創(chuàng)建臨時(shí)文件目錄, 目的是未將文件系統(tǒng)寫入磁盤時(shí)能保存寫入文件的內(nèi)容system("cls");free(FName);return OK;/ Exit The Fi
43、leManagerstatus exitFileManager(folderHandle Root)/ 退出程序時(shí)將所有內(nèi)存釋放deleteFolder(Root);return OK;/ Create Folderstatus createFolder(folderHandle parentFolder)/ 新建目錄前提是上級父目錄存在if(!parentFolder)return ERROR;int flagSameName = 0;/ 同名標(biāo)志folderHandle newFolder;/ 新建文件夾初始化if(! (newFolder = (folderHandle)malloc(s
44、izeof file)return FAIL;char *FName = getFInfo();/ 輸入文件夾名字strcpy(newFolder->name, FName);newFolder->attrib= _A_SUBDIR;newFolder->size= 0;newFolder->creationTime= getLocalTime();newFolder->editTime= getLocalTime();newFolder->finalAccessTime= getLocalTime();strcpy(newFolder->path,
45、parentFolder->path);strcat(newFolder->path, "");strcat(newFolder->path, newFolder->name);newFolder->fileParent= parentFolder;newFolder->leftChild= NULL;newFolder->rightBrother= NULL;/ 檢查上級父目錄的左孩子是否存在if(!(parentFolder->leftChild)/ 父目錄左孩子不存在,不存在同名問題,將新建文件掛在其左孩子上parent
46、Folder->leftChild = newFolder;else/ 父目錄左孩子存在,找到該目錄下最后創(chuàng)建孩子,將新建文件掛在右兄弟上folderHandle Rightbrother = parentFolder->leftChild;/ 產(chǎn)生指向當(dāng)前節(jié)點(diǎn)指針if(!strcmp(Rightbrother->name, FName) && Rightbrother->attrib = _A_SUBDIR)/ 對第一個(gè)文件夾/文件判斷,匹配名字,且這是一個(gè)文件夾,做同名標(biāo)志flagSameName = OK;while(Rightbrother-&g
47、t;rightBrother && !flagSameName)/ 當(dāng)前指針沿著右兄弟移動(dòng),如果已經(jīng)到達(dá)最后節(jié)點(diǎn),或者或者找到一個(gè)同名文件夾,結(jié)束移動(dòng)Rightbrother = Rightbrother->rightBrother;if(!strcmp(Rightbrother->name, FName) && Rightbrother->attrib = _A_SUBDIR)/ 存在匹配名字,且這是一個(gè)文件夾,做同名標(biāo)志flagSameName = OK;if(flagSameName = OK)/ 已存在同名文件夾, 不生成新文件夾,釋放
48、內(nèi)存,直接結(jié)束返回printf("nThe name is same!n");free(newFolder);free(FName);return FAIL;Rightbrother->rightBrother = newFolder;/ 可能存在同名文件,(但必須為文件指定類型,若無文件類型/ 操作系統(tǒng)不容許此文件與文件夾同名)但不存在同名文件夾, 將新文件夾掛在當(dāng)前節(jié)點(diǎn)右兄弟_mkdir(newFolder->path);/ 新建文件目錄是時(shí)在默認(rèn)工作目錄下(若已經(jīng)寫入磁盤,將在指定磁盤下創(chuàng)建文件夾)同時(shí)創(chuàng)建文件夾free(FName);return OK;
49、/ Create filestatus createFile(folderHandle parentFolder)/ 創(chuàng)建文件與創(chuàng)建文件夾時(shí)情況相當(dāng)/ 新建文件前提是上級父目錄存在if(!parentFolder)return ERROR;int flagSameName = 0;folderHandle newFile;/ 新建文件初始化if(! (newFile = (file*)malloc(sizeof file)return FAIL;char *FName = getFInfo();strcpy(newFile->name, FName);printf("文件屬性:
50、 0 - 正常文件/ 1 - 只讀文件: ");/ 只提供兩個(gè)選項(xiàng),無隱藏屬性int inAttrib;scanf("%d", &inAttrib);if(inAttrib = 0)newFile->attrib= _A_NORMAL;elsenewFile->attrib= _A_RDONLY;newFile->size= 0;newFile->creationTime= getLocalTime();strcpy(newFile->path, parentFolder->path);strcat(newFile-&g
51、t;path, "");strcat(newFile->path, newFile->name);strcat(newFile->path, ".txt"); / 將生成的文件變成默認(rèn)為txt文本文件,以免出現(xiàn)與文件夾重名問題newFile->fileParent= parentFolder;newFile->leftChild= NULL;newFile->rightBrother= NULL;/ 檢查上級父目錄的左孩子是否存在if(!(parentFolder->leftChild)/ 父目錄左孩子不存在,將
52、新建文件掛在其左孩子上parentFolder->leftChild = newFile;else/ 父目錄左孩子存在,找到該目錄下最后創(chuàng)建孩子,將新建文件掛在右兄弟上file *Rightbrother = parentFolder->leftChild;if(!strcmp(Rightbrother->name, FName) && (Rightbrother->attrib = _A_NORMAL | Rightbrother->attrib = _A_RDONLY)flagSameName = OK;while(Rightbrother-&
53、gt;rightBrother && !flagSameName)Rightbrother = Rightbrother->rightBrother;if(!strcmp(Rightbrother->name, FName) && (Rightbrother->attrib = _A_NORMAL | Rightbrother->attrib = _A_RDONLY)flagSameName = OK;if(flagSameName = OK)printf("nThe name is same!n");free(newFile);return FAIL;Rightbrother->rightBrother = newFile;FILE *fp;if(!(fp = fopen(newFile->path, "w")printf("create file fail!n");printf("
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 測繪管理與法律法規(guī)-2020年注冊測繪師《測繪管理與法律法規(guī)》真題
- 2024年錘紋助劑項(xiàng)目可行性研究報(bào)告
- 2024年白喉類毒素項(xiàng)目資金申請報(bào)告
- 2024年航天器壓力控制系統(tǒng)組件及零部件項(xiàng)目資金申請報(bào)告代可行性研究報(bào)告
- 2025年冀教新版選擇性必修1生物下冊階段測試試卷含答案
- 2025年浙科版七年級生物上冊階段測試試卷
- 2025年牛棚租賃與生態(tài)旅游開發(fā)合作合同書4篇
- 二零二五年度奶牛養(yǎng)殖場數(shù)字化轉(zhuǎn)型升級合同4篇
- 二零二五年度木工雕刻藝術(shù)品定制生產(chǎn)合同4篇
- 二零二五年度城市綜合體夜間安全管理打更合同3篇
- 南通市2025屆高三第一次調(diào)研測試(一模)地理試卷(含答案 )
- 2025年上海市閔行區(qū)中考數(shù)學(xué)一模試卷
- 2025中國人民保險(xiǎn)集團(tuán)校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 重癥患者家屬溝通管理制度
- 法規(guī)解讀丨2024新版《突發(fā)事件應(yīng)對法》及其應(yīng)用案例
- IF鋼物理冶金原理與關(guān)鍵工藝技術(shù)1
- 銷售提成對賭協(xié)議書范本 3篇
- 勞務(wù)派遣招標(biāo)文件范本
- EPC項(xiàng)目階段劃分及工作結(jié)構(gòu)分解方案
- 信息安全意識培訓(xùn)課件
- 小學(xué)二年級數(shù)學(xué)口算練習(xí)題1000道
評論
0/150
提交評論