版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
操作系統(tǒng)原理課程設(shè)計實踐報告題目:LINUX文件管理系統(tǒng)的仿真實現(xiàn)姓名:關(guān)子俞、溫季逾、田耕苗學(xué)院:信息科技技術(shù)學(xué)院專業(yè):計算機科學(xué)技術(shù)班級:計科121學(xué)號:19212108、19212128、333導(dǎo)教師:姜海燕職稱:教授是否申請優(yōu)秀:否2015年3月18日目錄TOC\o"1-3"\h\u83951.目的與意義 2262552.理論分析 3231962.1文件系統(tǒng)結(jié)構(gòu) 3123822.2文件目錄結(jié)構(gòu) 3213892.3文件的邏輯結(jié)構(gòu) 335982.4文件的物理結(jié)構(gòu) 4322702.5系統(tǒng)調(diào)用的實現(xiàn) 4277652.6文件共享 4202792.7文件空間管理 485753.核心技術(shù)以及技術(shù)路線 4280794.功能設(shè)計、結(jié)構(gòu)設(shè)計、核心算法以及數(shù)據(jù)結(jié)構(gòu) 5266114.1功能設(shè)計 594354.2結(jié)構(gòu)設(shè)計 7211144.3數(shù)據(jù)結(jié)構(gòu)以及核心算法 798014.3.1初始化/格式化format模塊 7142794.3.2用戶登錄模塊 8132414.3.3存儲空間管理 10268964.3.4文件目錄 14241174.3.5查看磁盤使用情況 16197674.3.6文件操作:新建、翻開、關(guān)閉、讀、寫、重命名、刪除、錯誤提示 17110244.3.7定義全局變量 2236684.3.8核心數(shù)據(jù)結(jié)構(gòu) 23137734.3.9硬鏈接 24134425.運行環(huán)境、調(diào)試分析 25241165.1運行環(huán)境 2582195.2調(diào)試分析 25194916.討論 2899246.1存在問題 2879056.2改良建議 28291837.實踐體會以及心得 28操作系統(tǒng)中LINUX文件管理系統(tǒng)的仿真實現(xiàn)計科121 關(guān)子俞,溫季逾,田耕苗指導(dǎo)教師 姜海燕摘要:文件系統(tǒng)是操作系統(tǒng)中負責(zé)存取和管理信息的模塊,它采用統(tǒng)一方法管理用戶信息和系統(tǒng)信息的存儲、檢索、更新、共享和保護,并為一歐諾個戶提供一整套行之有效的文件使用及操作方法。對于系統(tǒng)而言,必須采用特定的數(shù)據(jù)結(jié)構(gòu)和有效算法,實現(xiàn)文件的邏輯結(jié)構(gòu)到存儲結(jié)構(gòu)的映射,實現(xiàn)對文件存儲空間和文件信息的管理,提供多種存取方法。本次的文件管理系統(tǒng)的仿真實現(xiàn)可以模擬完成用戶的登陸和驗證,列出文件和目錄,新建目錄,改變目錄,創(chuàng)立和編寫文件,刪除文件和退出系統(tǒng)等功能。關(guān)鍵字:操作系統(tǒng);文件系統(tǒng);仿真;計算機1.目的與意義進入20世紀90年代以后,計算機科學(xué)技術(shù)突飛猛進,操作系統(tǒng)又是計算機領(lǐng)域最活潑的分支之一,操作系統(tǒng)的新概念新技術(shù)和新方法層出不窮,促使現(xiàn)代操作系統(tǒng)發(fā)生了巨大的變化。所以開設(shè)操作系統(tǒng)課程設(shè)計是非常重要的,可讓學(xué)生充分了解傳統(tǒng)操作系統(tǒng)的根本概念技術(shù)方法,又能融合現(xiàn)代操作系統(tǒng)最新技術(shù)開展和應(yīng)用的討論,將操作系統(tǒng)理論知識和實踐實習(xí)緊密的結(jié)合起來。既有利于學(xué)生的知識獲取,又有利于學(xué)生的能力培養(yǎng)。而在整個操作系統(tǒng)中,文件系統(tǒng)的作用是至關(guān)重要的,它是用戶和系統(tǒng)的中樞結(jié)構(gòu),是一架橋梁。文件系統(tǒng)的存在可以實現(xiàn)文件的按名存取,實現(xiàn)從邏輯文件到物理文件的轉(zhuǎn)換,文件目錄的建立和維護,文件的查找和定位,文件存儲空間的分配和管理,提供文件的存取方法和文件存儲結(jié)構(gòu),實現(xiàn)文件的共享保護和保密,提供一組易用的文件操作和命令等,提高了整個系統(tǒng)的資源利用率。2.理論分析2.1文件系統(tǒng)結(jié)構(gòu)文件系統(tǒng)通常采用分層結(jié)構(gòu)實現(xiàn),大致分為三層:文件管理、目錄管理和磁盤主存映射管理。〔1〕文件管理層實現(xiàn)文件的邏輯結(jié)構(gòu),為用戶提供各種文件系統(tǒng)調(diào)用,及文件訪問權(quán)限設(shè)置等工作;〔2〕目錄管理負責(zé)查找文件描述符,今兒找到需要訪問的文件,并進行訪問權(quán)限檢查等工作;〔3〕磁盤主存映射管理將文件的邏輯地址轉(zhuǎn)換成磁盤的物理地址,即由邏輯塊號找到柱面號、磁道號和扇區(qū)號,集體數(shù)據(jù)傳輸操作由設(shè)備管理實現(xiàn)。2.2文件目錄結(jié)構(gòu)UNIX采用樹型目錄結(jié)構(gòu),每個目錄表稱為一個目錄文件。一個目錄文件是由目錄項組成的。每個目錄項包含16B,一個輔存磁盤塊(512B)包含32個目錄項。在目錄項中,第1、2字節(jié)為相應(yīng)文件的外存i節(jié)點號,是該文件的內(nèi)部標(biāo)識;后14B為文件名,是該文件的外部標(biāo)識。所以,文件目錄項記錄了文件內(nèi)、外部標(biāo)識的對照關(guān)系。根據(jù)文件名可以找到輔存i節(jié)點號,由此便得到該文件的所有者、存取權(quán)、文件數(shù)據(jù)的地址健在等信息。UNIX的存儲介質(zhì)以512B為單位劃分為塊,從0開始直到最大容量并順序加以編號就成了一個文件卷,也叫文件系統(tǒng)。UNIX中的文件系統(tǒng)磁盤存儲區(qū)分配圖如下:0#1#2#…K#K+1#K+2#K+3#…n#i節(jié)點區(qū)i節(jié)點區(qū)文件存儲區(qū)引導(dǎo)區(qū)管理區(qū) 2.3文件的邏輯結(jié)構(gòu)文件的邏輯結(jié)構(gòu)和組織是從用戶的觀點出發(fā),研究用戶概念中抽象的信息組織方式,這是用戶能觀察到的客家處理的數(shù)據(jù)集合。憂郁數(shù)據(jù)可獨立于物理環(huán)境構(gòu)造故稱邏輯結(jié)構(gòu),相關(guān)數(shù)據(jù)的集合構(gòu)成邏輯文件。系統(tǒng)提供假設(shè)干操作以便使用者構(gòu)造文件,如此用戶可不顧文件的物理結(jié)構(gòu)利用文件名就能進行有關(guān)操作。文件的邏輯結(jié)構(gòu)分為流式文件和記錄式文件兩種根本形式。記錄成組和分解處理能節(jié)省存儲空間提高系統(tǒng)效率,缺點是需要軟件進行成組和分解的額外操作以及需要較大的I/O緩沖區(qū)。2.4文件的物理結(jié)構(gòu)文件的物理結(jié)構(gòu)和組織是指邏輯文件在物理存儲空間中的存放方法和組織關(guān)系,這使得文件看做物理文件,即相關(guān)物理塊的集合。構(gòu)造文件物理結(jié)構(gòu)有兩種方法即計算法和指針法。其中計算法是指通過用線性計算法、雜湊法等通過記錄鍵進行計算轉(zhuǎn)換成對應(yīng)物理地址的方法,存取效率較高;指針法那么是設(shè)置專門的指針致命相應(yīng)記錄的物理地址或表達各記錄之間的關(guān)聯(lián),索引文件屬于此類,該方法便于隨機存取更新,加快存取速度。根據(jù)實際情況有順序文件、連接文件、直接文件和索引文件三種文件物理結(jié)構(gòu)。2.5系統(tǒng)調(diào)用的實現(xiàn)文件系統(tǒng)向應(yīng)用程序提供的一組系統(tǒng)調(diào)用包括:建立、翻開、關(guān)閉、撤銷、讀、寫和控制,通過這些用戶能獲得文件系統(tǒng)的各種效勞。一般提供創(chuàng)立、刪除、翻開、關(guān)閉、讀寫、隨機存取等操作。2.6文件共享文件共享是指不同的進程共同使用一個文件,文件共享不僅為不同的進程完成共同任務(wù)所必需,而且還節(jié)省大量的輔存空間,減少因文件復(fù)制而增加的I/O操作次數(shù),一般有靜態(tài)共享、動態(tài)共享和符號鏈接共享三種形式。在UNIX/Linux系統(tǒng)中,允許多個用戶靜態(tài)共享或動態(tài)共享同一個文件,當(dāng)一個文件被多個進程動態(tài)的共享使用時,每個進程可以使用各自的讀寫指針,但也可以共用讀寫指針。2.7文件空間管理在磁盤等大容量輔助存儲器空間中,用戶作業(yè)運行期間經(jīng)常要建立、擴充和刪除文件,文件系統(tǒng)應(yīng)能自動管理和控制輔存文件空間。輔存文件空間分配常以連續(xù)分配和非連續(xù)分配兩種方法進行分配。而文件輔存空間管理方法通常有:位示圖、空閑區(qū)表、空閑塊鏈和成組空閑塊鏈四種。3.核心技術(shù)以及技術(shù)路線 采用二級目錄結(jié)構(gòu),其中第一級對應(yīng)于用戶賬號,第二級對應(yīng)于用戶賬號下的文件。模擬實現(xiàn)多用戶多目錄的文件系統(tǒng),在系統(tǒng)出現(xiàn)登錄后,輸入用戶與口令,在用戶登錄系統(tǒng)后,可建立文件卷,將用戶輸入的文件保存在指定的文件中。系統(tǒng)的命令與其命令的具體實現(xiàn),此模擬系統(tǒng)共提供了上述命令,并根據(jù)命令的含義與要求,用C編程來完成所有具體操作。該系統(tǒng)可以模擬完成用戶的登陸和驗證,列出文件和目錄,新建目錄,改變目錄,創(chuàng)立和編寫文件,刪除文件和退出系統(tǒng)等功能。我們從系統(tǒng)抽取模擬建立512個塊,每個塊對應(yīng)512個字節(jié),然后建立一個有512個元素的字符數(shù)組,每個元素對應(yīng)相應(yīng)的塊號,不管是文件或是目錄都有i節(jié)點,建立自己設(shè)定數(shù)目元素的i節(jié)點表,并依次把位圖區(qū)、i節(jié)點表、數(shù)據(jù)塊區(qū)每個元素映射到一個二進制文件上。在每一次的操作中如果相應(yīng)元素有變動,那么對應(yīng)在文件中更新輸出相應(yīng)數(shù)據(jù),以便下一次啟動程序的時候可以快速導(dǎo)入上一次的數(shù)據(jù),并且建立保護機制,即當(dāng)翻開某個文件時,將其記錄下來使無法同時再次翻開??傮w框架如圖-1-。圖-SEQ圖表\*ARABIC1-系統(tǒng)總體框架圖4.功能設(shè)計、結(jié)構(gòu)設(shè)計、核心算法以及數(shù)據(jù)結(jié)構(gòu)4.1功能設(shè)計1.多用戶、多級目錄結(jié)構(gòu)文件系統(tǒng)的設(shè)計與實現(xiàn)??梢詫崿F(xiàn)以下幾條命令login用戶登錄logout退出當(dāng)前用戶dir列文件目錄creat創(chuàng)立文件delet刪除文件及目錄樹open翻開文件close關(guān)閉文件read讀文件write寫文件mkdir創(chuàng)立目錄cd改變文件目錄format格式化文件系統(tǒng)quit退出文件系統(tǒng)rename重命名link硬鏈接
圖-SEQ圖表\*ARABIC2-總功能結(jié)構(gòu)圖圖-SEQ圖表\*ARABIC3-總功能流程圖4.2結(jié)構(gòu)設(shè)計系統(tǒng)結(jié)構(gòu)如圖-1-采用二級目錄結(jié)構(gòu),其中第一級對應(yīng)于用戶賬號,第二級對應(yīng)于用戶賬號下的文件。不管是文件或是目錄都有i節(jié)點,建立自己設(shè)定數(shù)目元素的i節(jié)點表,并依次把位圖區(qū)、i節(jié)點表、數(shù)據(jù)塊區(qū)每個元素映射到一個二進制文件上。在每一次的操作中如果相應(yīng)元素有變動,那么對應(yīng)在文件中更新輸出相應(yīng)數(shù)據(jù),以便下一次啟動程序的時候可以快速導(dǎo)入上一次的數(shù)據(jù),并且建立保護機制。4.3數(shù)據(jù)結(jié)構(gòu)以及核心算法4.3.1初始化/格式化format模塊格式化文件系統(tǒng),即初始化文件系統(tǒng),相當(dāng)于硬盤的格式化。將其中原有的用戶及用戶下的文件系統(tǒng)全部復(fù)原初始狀態(tài),即沒有任何用戶和目錄、文件,也就是按設(shè)計的文件系統(tǒng)格式重建新的文件系統(tǒng)。voidformat(void){ Inodeinode; scanf("%c",&choice);getchar(); if((choice=='y')||(choice=='Y')) { if((fp=fopen(image_name,"w+b"))==NULL) { printf("無法創(chuàng)立文件%s\n",image_name); exit(-1);} for(i=0;i<BLKSIZE;i++) fputc('0',fp);初始化節(jié)點信息 for(i=0;i<31;i++) fwrite(&inode,sizeof(Inode),1,fp);for(i=0;i<BLKNUM*BLKSIZE;i++) fputc('\0',fp);fclose(fp); //翻開文件user.txt if((fp=fopen("user.txt","w+"))==NULL) {printf("無法創(chuàng)立文件%s\n","user.txt"); exit(-1);} printf("文件系統(tǒng)創(chuàng)立成功,請首次登陸!\n"); }}4.3.2用戶登錄模塊功能:用戶登陸,如果是新用戶那么創(chuàng)立用戶voidlogin(void){ charfile_name[10]="user.txt"; do { gets(user_name); while(*p=getch()) {if(*p==0x0d){ *p='\0';//將輸入的回車鍵轉(zhuǎn)換成空格 break;} printf("*");//將輸入的密碼以"*"號顯示 p++; } if((fp=fopen(file_name,"r+"))==NULL) {printf("\n無法翻開文件%s.\n",file_name); printf("這個文件系統(tǒng)不存在,它將被創(chuàng)立!\n"); format(); login();}while(!feof(fp)) { fread(&user,sizeof(User),1,fp); //已經(jīng)存在的用戶,且密碼正確 if(!strcmp(user.user_name,user_name)&&!strcmp(user.password,password)){ fclose(fp); printf("\n"); return;} //已經(jīng)存在的用戶,但密碼錯誤 elseif(!strcmp(user.user_name,user_name)) { printf("\n密碼錯誤.\n"); fclose(fp); break;} } if(flag==0)break; }while(flag); //創(chuàng)立新用戶 if(flag==0) {printf("\n是否創(chuàng)立新用戶?(y/n):"); scanf("%c",&choice); if((choice=='y')||(choice=='Y')) { 賦值 fwrite(&user,sizeof(User),1,fp); fclose(fp); return;} if((choice=='n')||(choice=='N')) login(); }}voidfree_user()//清空內(nèi)存中存在的用戶名4.3.3存儲空間管理voidinit(void)//將所有i節(jié)點讀入內(nèi)存{ if((fp=fopen(image_name,"r+b"))==NULL) printf("無法翻開文件%s.\n",image_name); //讀入位圖 for(i=0;i<BLKNUM;i++) bitmap[i]=fgetc(fp); //顯示位圖 //讀入i節(jié)點信息 for(i=0;i<INODENUM;i++) fread(&inode_array[i],sizeof(Inode),1,fp); //顯示i節(jié)點 //當(dāng)前目錄為根目錄 inum_cur=0; //初始化翻開文件表 for(i=0;i<FILENUM;i++) file_array[i].inum=-1;}voidsave_inode(intnum)//功能:將num號i節(jié)點保存到hd.dat{ if((fp=fopen(image_name,"r+b"))==NULL) { printf("無法翻開文件%s\n",image_name); exit(-1); } fseek(fp,BLKNUM+num*sizeof(Inode),SEEK_SET); fwrite(&inode_array[num],sizeof(Inode),1,fp); fclose(fp);}intget_blknum(void)//找到一個空閑數(shù)據(jù)塊,并修改對應(yīng)位圖號元素為1{ inti; for(i=0;i<BLKNUM;i++) if(bitmap[i]=='0')break; //未找到空閑數(shù)據(jù)塊 if(i==BLKNUM) { printf("數(shù)據(jù)塊已滿.\n"); exit(-1); } bitmap[i]='1'; if((fp=fopen(image_name,"r+b"))==NULL) {printf("無法翻開文件%s\n",image_name); exit(-1); } fseek(fp,i,SEEK_SET); fputc('1',fp); fclose(fp);}voidrelease_blk(intnum)//修改對應(yīng)的位圖元素,并把文件系統(tǒng)中對應(yīng)的數(shù)據(jù) //塊清零{ FILE*fp; if((fp=fopen(image_name,"r+b"))==NULL) {printf("無法翻開文件%s\n",image_name); exit(-1); } bitmap[num]='0'; fseek(fp,num,SEEK_SET); fputc('0',fp); fclose(fp);}4.3.4文件目錄voidpathset()//設(shè)置文件路徑{ charpath[50]; intm,n; if(inode_array[inum_cur].inum==0)strcpy(path,user.user_name); else { strcpy(path,user.user_name); m=0; n=inum_cur; while(m!=inum_cur) { while(inode_array[n].iparent!=m) {n=inode_array[n].iparent;} strcat(path,"/"); strcat(path,inode_array[n].file_name); m=n; n=inum_cur;} } printf("用戶/路徑:[%s]",path);}voidcd(void)//切換目錄(cd..或者cddir1){ inti; if(argc!=2) { printf("該命令必須要有兩個參數(shù).\n"); return; } if(!strcmp(argv[1],".."))inum_cur=inode_array[inum_cur].iparent; else { for(i=0;i<INODENUM;i++) if((inode_array[i].inum>0)&&(inode_array[i].type=='d')&& (inode_array[i].iparent==inum_cur)&& !strcmp(inode_array[i].file_name,argv[1])&&!strcmp(inode_array[i].user_name,user.user_name))break;if(i==INODENUM) printf("此目錄不存在.\n");elseinum_cur=i; }}voidmkdir(void)//在當(dāng)前目錄下創(chuàng)立子目錄(mkdirdir1){ inti; if(argc!=2) { printf("該命令必須要有兩個參數(shù).\n"); return; } //遍歷i節(jié)點數(shù)組,查找未用的i節(jié)點 for(i=0;i<INODENUM;i++) if(inode_array[i].inum<0)break;if(i==INODENUM) { printf("i節(jié)點已滿.\n"); exit(-1); } inode_array[i].inum=i; strcpy(inode_array[i].file_name,argv[1]); inode_array[i].type='d'; strcpy(inode_array[i].user_name,user.user_name); inode_array[i].iparent=inum_cur; inode_array[i].length=0; save_inode(i);}4.3.5查看磁盤使用情況voiddir(void){ inti; intdcount=0,fcount=0; shortbcount=0; if(argc!=1) { printf("該命令必須要有一個參數(shù).\n"); return; } //遍歷i節(jié)點數(shù)組,顯示當(dāng)前目錄下的子目錄和文件名 for(i=0;i<INODENUM;i++) if((inode_array[i].inum>0)&& (inode_array[i].iparent==inum_cur)&& !strcmp(inode_array[i].user_name,user.user_name)){ if(inode_array[i].type=='d') {dcount++;printf("%-20s<DIR>\n",inode_array[i].file_name);} else{fcount++; bcount+=inode_array[i].length; printf("%-20s%12dbytes\n",inode_array[i].file_name,inode_array[i].length);}} printf("\n%dfile(s)%11dbytes\n",fcount,bcount); printf("%ddir(s)%11dbytesFreeSpace\n",dcount,1024*1024-bcount); }4.3.6文件操作:新建、翻開、關(guān)閉、讀、寫、重命名、刪除、錯誤提示//功能:在當(dāng)前目錄下創(chuàng)立文件(creatfile)voidcreate(void){ for(i=0;i<INODENUM;i++) {if((inode_array[i].inum>0)&&(inode_array[i].type=='f')&& !strcmp(inode_array[i].file_name,argv[1])&& inode_array[i].iparent==inum_cur){ printf("該文件已存在.\n");} } for(i=0;i<INODENUM;i++)if(inode_array[i].inum<0)break; if(i==INODENUM) { printf("Inodeisfull.\n"); exit(-1); } 更新節(jié)點信息 save_inode(i);//保存節(jié)點信息 for(n=0;n<SFILENUM;n++)if(Sfile_array[n].a_num<0)break; if(n==SFILENUM)更新系統(tǒng)翻開文件表信息//功能:文件的重命名voidrename(void){ inti,n; charname[100]; if(argc!=2) {printf("該命令必須要有兩個參數(shù).\n");return; } for(i=0;i<INODENUM;i++) {if((inode_array[i].inum>0)&&(inode_array[i].type=='f')&& strcmp(inode_array[i].file_name,argv[1])==0){ printf("請輸入新的文件名"); gets(name); inode_array[i].inum=i; strcpy(inode_array[i].file_name,name); inode_array[i].type='f'; strcpy(inode_array[i].user_name,user.user_name); inode_array[i].iparent=inum_cur; inode_array[i].length=0; inode_array[i].file_ilink=0; save_inode(i); } } for(n=0;n<SFILENUM;n++) { if((Sfile_array[n].a_num==i)&& (strcmp(Sfile_array[n].filename,argv[1])==0)) { Sfile_array[n].a_num=i; strcpy(Sfile_array[n].filename,name); } }}voidopen()//翻開文件,并判斷文件類型和翻開方式{ for(i=0;i<INODENUM;i++) if((inode_array[i].inum>0)&&(inode_array[i].type=='f')&& !strcmp(inode_array[i].file_name,argv[1])&& !strcmp(inode_array[i].user_name,user.user_name))break; if(i==INODENUM) { printf("你想翻開的文件不存在.\n"); } printf("請輸入文件模式:(1:read,2:write,3:readandwrite):"); scanf("%d",&mode); getchar(); if((mode<1)||(mode>3)) { printf("文件模式錯誤.\n"); } for(i=0;i<FILENUM;i++)if(file_array[i].inum<0)break; if(i==FILENUM) {printf("文件翻開表已滿,請關(guān)閉一些文件.\n"); return; } filenum=i; file_array[filenum].inum=inum;strcpy(file_array[filenum].file_name,inode_array[inum].file_name); file_array[filenum].mode=mode; printf("Openfile%sby",file_array[filenum].file_name); if(mode==1)printf("readonly.\n"); elseif(mode==2)printf("writeonly.\n"); elseprintf("readandwrite.\n");}voidclose(void)//關(guān)閉文件,刪除該文件的用戶翻開文件表目{ for(i=0;i<FILENUM;i++) if((file_array[i].inum>0)&& !strcmp(file_array[i].file_name,argv[1]))break; if(i==FILENUM) { printf("該文件無法翻開.\n"); return; } else { file_array[i].inum=-1; printf("Close%ssuccess!\n",argv[1]); }}voidwrite()//寫文件,需要先翻開文件并判斷文件權(quán)限。寫完后修改文件系統(tǒng)中的對應(yīng)數(shù)據(jù)區(qū)。{ for(i=0;i<FILENUM;i++) if((file_array[i].inum>0)&&!strcmp(file_array[i].file_name,argv[1]))break;if(i==FILENUM) { printf("Open%sfirst.\n",argv[1]); return; } elseif(file_array[i].mode==1) { printf("Can'twrite%s.\n",argv[1]); return; } inum=file_array[i].inum; printf("Thelengthof%s:%d\n",inode_array[inum].file_name,inode_array[inum].length); if(inode_array[inum].length==0) { i=0;inode_array[inum].address[0]=get_blknum(); printf("輸入文件內(nèi)容(輸入CTRL+Z結(jié)束):\n"); while(i<1023&&(temp[i]=getchar())!=EOF)i++;temp[i]='\0'; length=strlen(temp)+1;inode_array[inum].length=length; if(length>512)inode_array[inum].address[1]=get_blknum();save_inode(inum); write_blk(inum); } else printf("這個文件不能被寫入.\n");}voidread()//讀文件,需先翻開文件,讀入相應(yīng)數(shù)據(jù)塊的內(nèi)容到緩沖區(qū),然后輸出。{ for(i=0;i<FILENUM;i++)if((file_array[i].inum>0)&&!strcmp(file_array[i].file_name,argv[1])) break; if(i==FILENUM) { printf("Open%sfirst.\n",argv[1]); } elseif(file_array[i].mode==2) { printf("Can'tread%s.\n",argv[1]); } inum=file_array[i].inum; printf("%s的文件長度為:%d.\n",argv[1],inode_array[inum].length); if(inode_array[inum].length>0) { read_blk(inum); for(i=0;(i<inode_array[inum].length)&&(temp[i]!='\0');i++) printf("%c",temp[i]); }}voiddel(inti)//如果參數(shù)是文件那么刪除文件,如果是目錄那么刪除該目錄下的所有文件和目 錄。voiddel(inti){ inode_array[i].inum=-1; if(inode_array[i].length>0) { release_blk(inode_array[i].address[0]); if(inode_array[i].length>=512)release_blk(inode_array[i].address[1]); } save_inode(i);}4.3.7定義全局變量char choice;int argc; //用戶命令的參數(shù)個數(shù)char *argv[5]; //用戶命令的參數(shù)int inum_cur; //當(dāng)前目錄char temp[2*BLKSIZE]; //緩沖區(qū)User user; //當(dāng)前的用戶char bitmap[BLKNUM]; //位圖數(shù)組Inode inode_array[INODENUM]; //i節(jié)點數(shù)組File_tablefile_array[FILENUM]; //翻開文件表數(shù)組char image_name[10]="data.dat"; //文件系統(tǒng)名稱FILE *fp; //翻開文件指針4.3.8核心數(shù)據(jù)結(jié)構(gòu)//用戶typedefstruct{ charuser_name[10]; //用戶名 charpassword[10]; //密碼}User;〔功能:管理用戶〕//i節(jié)點typedefstruct{ shortinum;//文件i節(jié)點號 charfile_name[10];//文件名 chartype;//文件類型 charuser_name[10];//文件所有者 shortiparent;//父目錄的i節(jié)點號 shortlength;//文件長度 shortaddress[2];//存放文件的地址 intfile_ilink;//鏈接計數(shù)器}Inode;//翻開文件表typedefstruct{ shortinum; //i節(jié)點號 charfile_name[10];//文件名 shortmode; //讀寫模式(1:read,2:write, //3:readandwrite)}File_table;//系統(tǒng)翻開表項typedefstruct{ charfilename[10]; //文件名稱 shorta_num; //指針,指向活動i結(jié)點 shortiparent;//父目錄的i節(jié)點號}System_table;〔主要為了實現(xiàn)文件共享〕4.3.9硬鏈接//硬鏈接(只能在當(dāng)前目錄下創(chuàng)立硬鏈接,并且只能鏈接當(dāng)前目錄下的文件)voidh_link(void){ if(i==INODENUM) { printf("你所要鏈接的文件不存在.\n"); } node=inode_array[i].inum; ++inode_array[i].file_ilink; printf("請輸入新建文件的名字:"); gets(name); for(i=0;i<INODENUM;i++) {if((inode_array[i].inum>0)&&(inode_array[i].type=='f')&& !strcmp(inode_array[i].file_name,name)){ printf("該文件名已存在,請重新輸入指令.\n"); return;} } for(n=0;n<SFILENUM;n++)if(Sfile_array[n].a_num<0)break; Sfile_array[n].a_num=node; strcpy(Sfile_array[n].filename,name); Sfile_array[n].iparent=inum_cur; //遍歷i節(jié)點數(shù)組,查找未用的i節(jié)點 for(i=0;i<INODENUM;i++) if(inode_array[i].inum<0)break;if(i==INODENUM) { printf("i節(jié)點已滿.\n"); } 更新節(jié)點信息 save_inode(i);//保存節(jié)點信息}5.運行環(huán)境、調(diào)試分析5.1運行環(huán)境MicrosoftVisualC++6.05.2調(diào)試分析首次運行wenjian.exe文件時,系統(tǒng)將提示用戶初始化文件系統(tǒng),之后進入用戶登錄界面,首次登錄需要新建用戶,用戶可根據(jù)自己喜好來輸入用戶名和密碼〔如以下圖一〕,登錄后便可進入文件系統(tǒng),用戶可直接輸入help顯示幫助菜單來查看可以進行的操作,如下中圖中的新建目錄及顯示目錄〔圖二〕,新建文件、翻開文件以及讀寫文件〔圖三〕,刪除根目錄下所有子目錄和文件〔圖五〕,以及退出當(dāng)前用戶〔圖六〕和退出文件系統(tǒng)〔圖七〕。其中用戶更改目錄時只需輸入cd空格后再加上要進入的目錄名即可,返回父目錄是還可輸入cd空格后加..即可。此外,用戶在翻開已存在的文件是需要選擇文件的讀寫模式,并且用戶在寫文件以及讀文件時系統(tǒng)會自動給出該文件長度。第一次運行程序圖一建立新目錄,顯示當(dāng)前目錄下的文件和目錄圖二建立新的文件,翻開,寫,讀。圖三clear清屏后,dir查看當(dāng)前目錄下文件信息圖四返回根目錄下,并刪除根目錄下所有子目錄和文件
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版高中語文必修一-晨讀晚練答案13
- 【備課參考】高中歷史岳麓版必修一同步教案:第2課-中央集權(quán)制度的確立
- 2024年武夷山市立醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2021年高考語文考點總動員專題49-解析圖片(原卷版)
- 2025年學(xué)校校舍使用權(quán)轉(zhuǎn)讓合同標(biāo)準(zhǔn)范本3篇
- 小數(shù)加減法口算題目附答案
- 2024年甲乙雙方關(guān)于新型智能穿戴設(shè)備研發(fā)項目合作的合同
- 2025年度法律顧問及咨詢服務(wù)協(xié)議2篇
- 2024年雜志廣告位使用權(quán)合同
- 公共管理在現(xiàn)代商業(yè)風(fēng)險管理中的應(yīng)用研究
- 初中體育教案【完整版】七年級
- 2024-2030年中國城市供熱行業(yè)市場前景預(yù)測及發(fā)展趨勢預(yù)判報告
- 2024年計算機二級MS Office考試題庫500題(含答案)
- 人教版七年級上冊《生物》期末試卷(完整)
- 福建中考英語作文15分評分標(biāo)準(zhǔn)
- 智慧磐石工程建設(shè)方案
- 等保2完整版本.0介紹及建設(shè)流程
- 蘇教版科學(xué)六年級上冊期末測試卷含完整答案(各地真題)
- 市場法評估企業(yè)價值
- DL-T 1476-2023 電力安全工器具預(yù)防性試驗規(guī)程
- 通信安全員ABC證報名考試題庫及答案
評論
0/150
提交評論