版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、*實踐教學* xx理工大學計算機與通信學院2008年秋季學期操作系統(tǒng)原理課程設計題 目: 模擬unix文件系統(tǒng)專業(yè)班級: 計算機 班 姓 名: xxxxx 學 號: xxxxxxx 指導教師: xxxx 成 績: 目錄1.摘要22.問題描述23.設計目的24.設計要求25.詳細設計25.1界面設計35.1算法設計.36.設計總結37. 參考文獻48.致謝49.附錄22模擬unix文件系統(tǒng)的設計及實現(xiàn)1. 課程設計內容多用戶的多級目錄的文件系統(tǒng)設計。2. 概述 unix采用樹型目錄結構,每個目錄表稱為一個目錄文件。一個目錄文件是由目錄項組成的。每個目錄項包含16b,一個輔存磁盤塊(512b)包含
2、32個目錄項。在目錄項中,第1、2字節(jié)為相應文件的外存i節(jié)點號,是該文件的內部標識;后14b為文件名,是該文件的外部標識。所以,文件目錄項記錄了文件內、外部標識的對照關系。根據(jù)文件名可以找到輔存i節(jié)點號,由此便得到該文件的所有者、存取權、文件數(shù)據(jù)的地址健在等信息。unix的存儲介質以512b為單位劃分為塊,從0開始直到最大容量并順序加以編號就成了一個文件卷,也叫文件系統(tǒng)。unix中的文件系統(tǒng)磁盤存儲區(qū)分配圖如下:0#1#2#k#k+1#k+2#k+3#n#i節(jié)點區(qū)文件存儲區(qū)引導區(qū)管理區(qū)本次課程設計是要實現(xiàn)一個簡單的模擬unix文件系統(tǒng)。我們在內存中開辟一個虛擬磁盤空間(1mb)作為文件存儲器,
3、并將該虛擬文件系統(tǒng)保存到磁盤上(以一個文件的形式),以便下次可以再將它恢復到內存的虛擬磁盤空間中。文件存儲空間的管理可采用位示圖方法。3. 課程設計任務及要求3.1. 設計任務多用戶、多級目錄結構文件系統(tǒng)的設計與實現(xiàn)??梢詫崿F(xiàn)下列幾條命令login 用戶登錄logout退出當前用戶dir列文件目錄creat創(chuàng)建文件delete刪除文件open打開文件close關閉文件read讀文件write 寫文件mkdir創(chuàng)建目錄ch改變文件目錄rd刪除目錄樹format格式化文件系統(tǒng)quit退出文件系統(tǒng)3.2. 設計要求1) 多用戶 :usr1,usr2,usr3,usr8 (1-8個用戶) 2) 多級目
4、錄:可有多級子目錄;3) 具有l(wèi)ogin (用戶登錄)4) 系統(tǒng)初始化(建文件卷、提供登錄模塊)5) 文件的創(chuàng)建:create (用命令行來實現(xiàn)) 6) 文件的打開:open7) 文件的讀:read 8) 文件的寫:write9) 文件關閉:close 10) 刪除文件:delete11) 創(chuàng)建目錄(建立子目錄):mkdir 12) 改變當前目錄:cd13) 列出文件目錄:dir14) 退出:logout新增加的功能:15) 刪除目錄樹:rd16) 格式化文件系統(tǒng):format4. 算法及數(shù)據(jù)結構4.1. 算法的總體思想本課程設計是要求我們模擬unix文件系統(tǒng)功能設計一個虛擬文件系統(tǒng),依據(jù)un
5、ix文件系統(tǒng)的特點,其設計思想是:申請1m的內存空間來虛擬文件系統(tǒng),將其以512b每塊劃分2048塊,采用位示圖管理文件系統(tǒng)的方法,利用其原理將第1塊作為位圖區(qū)(512b),共有對i節(jié)點區(qū)和數(shù)據(jù)塊區(qū)分別建立位圖;每個i節(jié)點占16b,每塊有512/16=32個i節(jié)點,用2、3共兩塊作為i節(jié)點,總共有64個i節(jié)點,在位圖區(qū)占用8b;其余2045塊作為數(shù)據(jù)區(qū)(本課設要求只用到512塊),在位圖區(qū)占用接近256b(2045位)。文件系統(tǒng)存儲區(qū)分配圖如下:位圖區(qū)i節(jié)點區(qū)數(shù)據(jù)區(qū)位圖:用0表示未使用,1表示使用;i節(jié)點:文件控制塊(fcb),描述文件信息的一個數(shù)據(jù)結構;數(shù)據(jù)區(qū):存放用戶數(shù)據(jù),包括目錄文件。位
6、示圖用以反映整個存儲空間的分配情況,由若干字節(jié)構成,每個字節(jié)中的每一位對應文件存儲器中的一塊,“1”狀態(tài)表示相應塊已占用,“0”狀態(tài)表示該塊為空閑。存儲塊分配時,只要把找到的空閑塊所對應的位由 "0" 改為 "1", 而在釋放時,只要把被釋放的物理塊所對應的位由 "1" 改為 " 0 " 即可。分配和釋放都可以在內存的位示 圖上完成,而且速度較快。磁盤 i 節(jié)點利用在內存中生成鏈表或者數(shù)組的方法來生成,并且限制磁盤節(jié)點數(shù)的最大值。同樣內存 i 節(jié)點利用鏈表的方法在內存中生成。同時在往文件中 寫或者讀的時候我們都是對
7、內存中有內容進行讀寫。在該文件系統(tǒng)中,規(guī)定一個文件最多只能占用2個數(shù)據(jù)塊,這兩個數(shù)據(jù)塊可以是不連續(xù)的,其塊號記錄在一個索引塊中,該索引塊稱為inode結構。讀入一個文件時,先根據(jù)目錄找到相應的i節(jié)點號,將i節(jié)點讀入主存i節(jié)點,建立打開文件表指向該主存i節(jié)點,再將文件內容讀入主存數(shù)據(jù)區(qū)。4.2. 系統(tǒng)總體框架圖4.3. 系統(tǒng)總體流程圖開始文件系統(tǒng)是否建立?在內存中申請1m內存空間將磁盤上的文件系統(tǒng)讀入內存yn用戶登錄模塊,輸入用戶名和密碼,可以在程序中設定,不用保存在文件系統(tǒng)中用戶名、密碼對嗎?執(zhí)行init(),進行初始化操作,進入用戶子目錄執(zhí)行command(),對用戶輸入的命令進行解析和執(zhí)行
8、。若數(shù)據(jù)被修改或新建立,則保存主存i節(jié)點和數(shù)據(jù)塊的內容到內存的文件系統(tǒng),并寫回磁盤,保存修改。若輸入錯誤命令則顯示出錯信息。退出用戶(logout)嗎?用戶輸入quit嗎?結束執(zhí)行format(),建立文件系統(tǒng)nnnyyy4.4. 各模塊功能說明4.4.1format模塊功能:格式化文件系統(tǒng),即初始化文件系統(tǒng),相當于硬盤的格式化。將其中原有的用戶及用戶下的文件系統(tǒng)全部還原初始狀態(tài),即沒有任何用戶和目錄、文件,也就是按設計的文件系統(tǒng)格式重建新的文件系統(tǒng)。4.4.2 get_blknum和release_blk模塊功能:實現(xiàn)i節(jié)點的分配和回收;算法:當一個新的文件被建立時,在給該文件分配磁盤存儲區(qū)
9、之前,應為該文件分配存放該文件的說明信息的磁盤i節(jié)點。反之,當從文件系統(tǒng)中刪除某個文件時,則要首先刪除它的i節(jié)點項。4.4.3init()模塊功能:進入文件系統(tǒng)算法:初始化用戶打開文件系表。在內存中申請一個虛擬存儲空間,此空間必須大于或等于可格式化時的空間。將文件系統(tǒng)文件讀入虛擬磁盤。4.4.4 quit()模塊功能:退出文件系統(tǒng)函數(shù)quit()算法:將虛擬磁盤內容保存到磁盤上。釋放虛擬磁盤所占據(jù)的空間。撤消用用戶打開文件表。4.4.5 creat()模塊功能:創(chuàng)建文件用法:creat filename算法:分配一空目錄項,分配磁盤塊??捎梦皇緢D。填寫該空目錄項。如文件長度(0),文件名,類型
10、等。分配一個用戶打開文件表項,并填寫相關目錄,讀寫指針=0。4.4.6 open()模塊功能:打開文件open()用法:open filename算法:if(該文件已打開or該文件不存在)報錯(出錯信息)。分配一個用戶打開文件表項。4.4.7 close()模塊功能:關閉文件close()用法:close filename算法:釋放該文件的用戶占據(jù)的內存空間。清空該文件的用戶打開文件表目。4.4.8 write()模塊功能:寫文件write(fd,buf,len)用法:write filename,需要先打開文件。算法:指定寫入內容長度。buf。修改打開文件表讀/寫指針。修改目錄項中的文件長度
11、。4.4.9 read()模塊功能:read(fd,buf,len)用法:read filename,需先打開文件。算法:文件信息.修改讀/寫指針。4.4.10 delete()模塊功能:刪除文件delete()用法:delete filename算法:若文件不存在,報錯。回收磁盤空間?;厥漳夸涰?。4.5. 該文件系統(tǒng)的數(shù)據(jù)結構和申明函數(shù)/ 用戶(20b)typedef structchar user_name10;/ 用戶名char password10;/ 密碼 user;/ i節(jié)點(32b)typedef structshortinum;/ 文件i節(jié)點號charfile_name10;/
12、 文件名chartype;/ 文件類型char user_name10; / 文件所有者shortiparent;/ 父目錄的i節(jié)點號 shortlength;/ 文件長度shortaddress2;/ 存放文件的地址 inode;/ 打開文件表(16b)typedef structshort inum;/ i節(jié)點號char file_name10;/ 文件名short mode;/ 讀寫模式(1:read, 2:write, 3:read and write)short offset;/ 偏移量 file_table;/ 申明函數(shù)void login(void); 用戶登錄,如果是新用戶則創(chuàng)
13、建用戶void init(void); 程序初始化,將所有i節(jié)點讀入內存int analyse(char *); 輸入?yún)?shù)分析,分析用戶命令void save_inode(int); 將num號i節(jié)點保存到虛擬磁盤文件hd.datint get_blknum(void); 申請一個數(shù)據(jù)塊void read_blk(int); 將i節(jié)點號為num的文件讀入tempvoid write_blk(int); 將temp的內容寫入hd.dat的數(shù)據(jù)區(qū)void release_blk(int); 釋放文件塊號為num的文件占用的空間void pathset(); 打印當前路徑void deltree(i
14、nt innum); 實現(xiàn)刪除目錄樹函數(shù)int check(int); 檢查用戶權限/ 用戶命令處理函數(shù)void help(void); 命令提示幫助函數(shù)void cd(void); 改變當前目錄void dir(void); 顯示當前目錄下所有文件和目錄void mkdir(void); 創(chuàng)建目錄void rd(void); 刪除目錄void creat(void); 創(chuàng)建文件void open(void); 打開void read(void); 讀文件void write(void); 寫文件void close(void); 關閉文件void del(void); 刪除文件void lo
15、gout(void); 用戶注銷void command(void); 命令管理函數(shù)void format(void); 格式化虛擬磁盤5. 程序設計與實現(xiàn)5.1. 主要函數(shù)列表函數(shù)原型功能入口、出口參數(shù)說明void login(void)用戶登陸void init(void)程序初始化int analyse(char *)輸入?yún)?shù)分析命令行字符串void save_inode(int)保存i節(jié)點到虛擬磁盤文件i節(jié)點號int get_blknum(void)分配一個磁盤塊void read_blk(int)讀磁盤快內容i節(jié)點號void write_blk(int)寫磁盤塊i節(jié)點號void re
16、lease_blk(int)釋放一個磁盤塊i節(jié)點號void pathset();打印當前路徑void deltree(int innum);實現(xiàn)刪除目錄樹函數(shù)i節(jié)點號int check(int);檢查用戶權限i節(jié)點號void help(void)命令提示幫助函數(shù)void dir(void)顯示當前目錄下所有文件和目錄void mkdir(void)創(chuàng)建目錄void creat(void)創(chuàng)建文件void open(void)打開文件void read(void)讀文件void write(void)寫文件void close(void)關閉文件void del(void)刪除文件void lo
17、gout(void)用戶登出void command(void)命令管理函數(shù)void rd(void)刪除目錄void format(void);格式化虛擬磁盤5.2. 函數(shù)之間的關系main()login()init()command()analyse()help()cd()dir()mkdir()creat()open()read()write()close()del()logout()cls()errcmd()format()quit()rd()save_inode()read_blk()get_blknum()write_blk()release_blk()delet()5.3. 程序
18、流程圖各功能模塊流程圖是否否是提示輸入用戶名和密碼用戶名是否存在創(chuàng)建新用戶讀入用戶信息到內存開始密碼是否正確結束用戶登陸login() 讀入位示圖信息到內存讀入i節(jié)點信息到內存當前目錄為根目錄初始化打開文件表結束開始初始化函數(shù)init()是是否否遍歷i節(jié)點區(qū)argv1=”.”目錄是否存在找到的目錄i節(jié)點號送當前目錄inum_cur當前目錄的父i節(jié)點號送當前目錄inum_cur開始結束改變當前目錄cd() 是是否否遍歷i節(jié)點區(qū)i節(jié)點的父節(jié)點是否為當前目錄i節(jié)點區(qū)是否遍歷完輸出文件名或目錄名開始結束顯示目錄dir()是是否否遍歷i節(jié)點區(qū)要創(chuàng)建的目錄是否存在是否有空的i節(jié)點遍歷i節(jié)點區(qū)分配一個目錄i
19、節(jié)點開始結束創(chuàng)建目錄mkdir() 是是否否遍歷i節(jié)點區(qū)要創(chuàng)建的文件是否存在是否有空的i節(jié)點遍歷i節(jié)點區(qū)分配一個文件i節(jié)點開始結束創(chuàng)建文件creat()是否是否是否遍歷i節(jié)點區(qū)要打開的文件是否存在提示輸入打開模式將打開文件信息寫入打開文件信息表file_array遍歷打開文件表file_array文件是否已經(jīng)打開提示輸入開始位置和讀字節(jié)數(shù)調用讀塊操作,讀出塊內字符模式是否為可讀開始結束開始結束打開文件open()讀文件read()是否是否遍歷打開文件表file_array文件是否已經(jīng)打開提示輸入寫入字節(jié)數(shù)調用寫塊操作,寫入塊內字符模式是否為可寫是否遍歷打開文件表file_array文件是否已經(jīng)
20、打開將打開文件表項標志位置-1file_arrayi.inum = -1開始結束寫文件write()開始結束關閉文件close()是否遍歷i節(jié)點區(qū)要刪除的文件是否存在釋放文件對應的i節(jié)點區(qū)inode_arrayi.inum = -1釋放兩個磁盤塊文件是否大于的一塊釋放一個磁盤塊是否開始結束刪除文件del() 開始遍歷i節(jié)點區(qū)是待刪除目錄嗎?遍歷子目錄子目錄為空嗎?是文件嗎?是空目錄嗎?結束調用delet()刪除目錄或文件是空目錄嗎?刪除目錄樹rd()是是否否否否否是是是是否遍歷位示圖表查找空閑塊bitmap是否有空閑塊分配一塊,將位示圖位置置1。 bitmapi = '1'返回
21、找到的空閑塊號將位示圖位置置0。 bitmapi = '0'清空塊內容開始結束分配磁盤塊get_blk()開始結束釋放磁盤塊release_blk(int)是否輸出給定i節(jié)點對應的第1塊內容文件是否大于1塊輸出給定i節(jié)點對應的第2塊內容是否將緩沖區(qū)buf內容寫入第1塊buf內容是否大于512字節(jié)將緩沖區(qū)buf的512字節(jié)后面的內容寫入第2塊開始結束寫磁盤塊write_blk(int)開始結束讀磁盤塊read_blk(int)5.4. 源程序/*main.c*/#include "head.h"charchoice;intargc;/ 用戶命令的參數(shù)個數(shù)cha
22、r*argv5;/ 用戶命令的參數(shù)intinum_cur;/ 當前目錄chartemp2*blksize;/ 緩沖區(qū)useruser;/ 當前的用戶charbitmapblknum;/ 位圖數(shù)組inodeinode_arrayinodenum;/ i節(jié)點數(shù)組file_table file_arrayfilenum;/ 打開文件表數(shù)組charimage_name10 = "hd.dat"/ 文件系統(tǒng)名稱file*fp;/ 打開文件指針/創(chuàng)建映像hd,并將所有用戶和文件清除void format(void)file *fp;int i;inode inode;printf(&q
23、uot;will be to format filesystem.n");printf("warning:all data on this filesystem will be lost!n");printf("proceed with format(y/n)?");scanf("%c", &choice);gets(temp);if(choice = 'y') | (choice = 'y')if(fp=fopen(image_name, "w+b") = nul
24、l) printf("can't create file %sn", image_name); exit(-1);for(i = 0; i < blksize; i+) fputc('0', fp); inode.inum = 0; strcpy(inode.file_name, "/"); inode.type = 'd' strcpy(inode.user_name, "all"); inode.iparent = 0; inode.length = 0; inode.address0
25、 = -1; inode.address1 = -1; fwrite(&inode, sizeof(inode), 1, fp); inode.inum = -1; 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.txtif(fp=fopen("user.txt", "w+") = null)
26、printf("can't create file %sn", "user.txt"); exit(-1);fclose(fp);printf("filesystem created successful.please first login!n");return ;/ 功能: 用戶登陸,如果是新用戶則創(chuàng)建用戶void login(void)char *p;int flag;char user_name10;char password10;char file_name10 = "user.txt"do pr
27、intf("login:");gets(user_name);printf("password:");p=password;while(*p=getch()if(*p = 0x0d) /當輸入回車鍵時,0x0d為回車鍵的ascii碼*p='0' /將輸入的回車鍵轉換成空格break;printf("*"); /將輸入的密碼以"*"號顯示p+;flag = 0;if(fp = fopen(file_name, "r+") = null)printf("ncan't
28、 open file %s.n", file_name);printf("this filesystem not exist, it will be create!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")
29、;return ;/ 已經(jīng)存在的用戶, 但密碼錯誤else if(!strcmp(user.user_name, user_name)printf("nthis user is exist, but password is incorrect.n");flag = 1;fclose(fp);break;if(flag = 0) break;while(flag);/ 創(chuàng)建新用戶if(flag = 0)printf("ndo you want to creat a new user?(y/n):");scanf("%c", &c
30、hoice);gets(temp);if(choice = 'y') | (choice = 'y')strcpy(user.user_name, user_name);strcpy(user.password, password);fwrite(&user, sizeof(user), 1, fp);fclose(fp);return ;if(choice = 'n') | (choice = 'n')login();/ 功能: 將所有i節(jié)點讀入內存void init(void)int i;if(fp = fopen(i
31、mage_name, "r+b") = null)printf("can't open file %s.n", image_name);exit(-1);/ 讀入位圖for(i = 0; i < blknum; i+)bitmapi = fgetc(fp);/ 顯示位圖/ 讀入i節(jié)點信息for(i = 0; i < inodenum; i+)fread(&inode_arrayi, sizeof(inode), 1, fp);/ 顯示i節(jié)點/ 當前目錄為根目錄inum_cur = 0;/ 初始化打開文件表for(i = 0;
32、i < filenum; i+)file_arrayi.inum = -1;/ 功能: 分析用戶命令, 將分析結果填充argc和argv/ 結果: 0-14為系統(tǒng)命令, 15為命令錯誤int analyse(char *str)int i;char temp20;char *ptr_char;char *syscmd="help", "cd", "dir", "mkdir", "creat", "open", "read", "write&
33、quot;, "close", "delete", "logout", "clear","format","quit","rd"argc = 0;for(i = 0, ptr_char = str; *ptr_char != '0' ptr_char+)if(*ptr_char != ' ')while(*ptr_char != ' ' && (*ptr_char != '0'
34、)tempi+ = *ptr_char+;argvargc = (char *)malloc(i+1);strncpy(argvargc, temp, i);argvargci = '0'argc+;i = 0;if(*ptr_char = '0') break;if(argc != 0) for(i = 0; (i < 15) && strcmp(argv0, syscmdi); i+);return i;else return 15;/ 功能: 將num號i節(jié)點保存到hd.datvoid save_inode(int num)if(fp
35、=fopen(image_name, "r+b") = null)printf("can't open file %sn", image_name);exit(-1);fseek(fp, 512+num*sizeof(inode), seek_set);fwrite(&inode_arraynum, sizeof(inode), 1, fp);fclose(fp);/ 功能: 申請一個數(shù)據(jù)塊int get_blknum(void)int i;for(i = 0; i < blknum; i+)if(bitmapi = '0&
36、#39;) break;/ 未找到空閑數(shù)據(jù)塊if(i = blknum)printf("data area is full.n");exit(-1);bitmapi = '1'if(fp=fopen(image_name, "r+b") = null)printf("can't open file %sn", image_name);exit(-1);fseek(fp, i, seek_set);fputc('1', fp);fclose(fp);return i;/ 功能: 將i節(jié)點號為num
37、的文件讀入temp void read_blk(int num)int i, len;char ch;int add0, add1;len = inode_arraynum.length;add0 = inode_arraynum.address0;if(len > 512)add1 = inode_arraynum.address1;if(fp = fopen(image_name, "r+b") = null)printf("can't open file %s.n", image_name);exit(-1);fseek(fp, 15
38、36+add0*blksize, seek_set);ch = fgetc(fp);for(i=0; (i < len) && (ch != '0') && (i < 512); i+)tempi = ch;ch = fgetc(fp);if(i >= 512)fseek(fp, 1536+add1*blksize, seek_set);ch = fgetc(fp);for(; (i < len) && (ch != '0'); i+)tempi = ch;ch = fgetc(fp);te
39、mpi = '0'fclose(fp);/ 功能: 將temp的內容輸入hd的數(shù)據(jù)區(qū)void write_blk(int num)int i, len;int add0, add1;add0 = inode_arraynum.address0;len = inode_arraynum.length;if(fp = fopen(image_name, "r+b") = null)printf("can't open file %s.n", image_name);exit(-1);fseek(fp, 1536+add0*blksiz
40、e, seek_set);for(i=0; (i<len)&&(tempi!='0')&&(i < 512); i+)fputc(tempi, fp);if(i = 512)add1 = inode_arraynum.address1;fseek(fp, 1536+add1*blksize, seek_set);for(; (i < len) && (tempi != '0'); i+)fputc(tempi, fp);fputc('0', fp);fclose(fp);/ 功能:
41、 釋放文件塊號為num的文件占用的空間void release_blk(int num)file *fp;if(fp=fopen(image_name, "r+b") = null)printf("can't open file %sn", image_name);exit(-1);bitmapnum = '0'fseek(fp, num, seek_set);fputc('0', fp);fclose(fp);/ 功能: 顯示幫助命令void help(void)printf("command: nhe
42、lp - show help menu nclear - clear the screen ncd - change directory nmkdir - make directory ncreat - create a new file nopen - open a exist file nread - read a file nwrite - write something to a file nclose - close a file ndelete - delete a exist file nformat - format a exist filesystem nlogout - e
43、xit user nrd - delete a directory nquit - exit this systemn");/設置文件路徑void pathset()char path50;int m,n;if(inode_arrayinum_cur.inum = 0)strcpy(path,user.user_name);elsestrcpy(path,user.user_name);m=0;n=inum_cur;while(m != inum_cur)while(inode_arrayn.iparent != m)n = inode_arrayn.iparent;strcat(p
44、ath,"/");strcat(path,inode_arrayn.file_name);m = n;n = inum_cur;printf("%s",path);/ 功能: 切換目錄(cd . 或者 cd dir1)void cd(void)int i;if(argc != 2)printf("command cd must have two args. n");return ;if(!strcmp(argv1, ".")inum_cur = inode_arrayinum_cur.iparent;else/ 遍
45、歷i節(jié)點數(shù)組for(i = 0; i < inodenum; i+)if(inode_arrayi.inum>0)&&(inode_arrayi.type='d')&&(inode_arrayi.iparent=inum_cur)&&!strcmp(inode_arrayi.file_name,argv1)&&check(i)break;if(i = inodenum) printf("this directory isn't exsited.n");else inum_cu
46、r = i;/ 功能: 顯示當前目錄下的子目錄和文件(dir)void dir(void)int i;int dcount=0,fcount=0;short bcount=0;if(argc != 1)printf("command dir must have one args. n");return ;/ 遍歷i節(jié)點數(shù)組, 顯示當前目錄下的子目錄和文件名for(i = 0; i < inodenum; i+)if(inode_arrayi.inum> 0) && (inode_arrayi.iparent = inum_cur)if(inode
47、_arrayi.type = 'd' && check(i)dcount+;printf("%-20s<dir>n", inode_arrayi.file_name);if(inode_arrayi.type = '-' && check(i)fcount+;bcount+=inode_arrayi.length;printf("%-20s%12d bytesn", inode_arrayi.file_name,inode_arrayi.length);printf("
48、n %d file(s)%11d bytesn",fcount,bcount);printf(" %d dir(s) %11d bytes freespacen",dcount,1024*1024-bcount);/ 功能: 刪除目錄樹(rd dir1)void rd()int i,j,t,flag=0;if(argc != 2)printf("command delete must have one args. n");return ;for(i = 0; i < inodenum; i+)/查找待刪除目錄if(inode_arrayi
49、.inum > 0) &&/是否為空(inode_arrayi.iparent = inum_cur) &&(inode_arrayi.type = 'd')&&(!strcmp(inode_arrayi.file_name,argv1)chk=check(i);/檢查用戶權限if(chk!=1) printf("this directory is not your !n");return ;else j=inode_arrayi.inum;for(t=0;t<inodenum;t+)if(inod
50、e_arrayt.inum>0)&&(inode_arrayt.iparent=j)&&(inode_arrayi.type = '-')delet(t);/目錄下有文件則刪除else if(inode_arrayt.inum>0)&&(inode_arrayt.iparent=j)&&(inode_arrayi.type = 'd')delet(t);/目錄下有空目錄則刪除if(t = inodenum)delet(j);/下層目錄為空刪除之if(i = inodenum)delet(
51、i);/待刪除目錄為空刪除之return;/ 功能: 在當前目錄下創(chuàng)建子目錄(mkdir dir1)void mkdir(void)int i;if(argc != 2)printf("command mkdir must have two args. n");return ;/ 遍歷i節(jié)點數(shù)組, 查找未用的i節(jié)點for(i = 0; i < inodenum; i+)if(inode_arrayi.inum < 0) break;if(i = inodenum)printf("inode is full.n");exit(-1);inode
52、_arrayi.inum = i;strcpy(inode_arrayi.file_name, argv1);inode_arrayi.type = 'd'strcpy(inode_arrayi.user_name,user.user_name);inode_arrayi.iparent = inum_cur;inode_arrayi.length = 0;save_inode(i);/ 功能: 在當前目錄下創(chuàng)建文件(creat file1)void creat(void)int i;if(argc != 2)printf("command creat must ha
53、ve one args. n");return ;for(i = 0; i < inodenum; i+)if(inode_arrayi.inum > 0) &&(inode_arrayi.type = '-') &&!strcmp(inode_arrayi.file_name, argv1)printf("this file is exsit.n");return ;for(i = 0; i < inodenum; i+)if(inode_arrayi.inum < 0) break;if(i = inodenum)printf("inode is full.n");exit(-1);inode_arrayi.inum = i;strcpy(inode_arrayi.file_name, argv1);inode_arrayi.type = '-'strcpy(inode
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 托班安全教案我的小手
- 放射性粒子治療護理規(guī)范
- 節(jié)油賽自駕游活動方案
- 4.1.2化學電源高二上學期化學人教版(2019)選擇性必修1
- 3.2.1金屬材料 課件高一上學期化學人教版(2019)必修第一冊
- 食品安全問題答題活動
- 企業(yè)工作職業(yè)生涯規(guī)劃
- 糖尿病的措施
- 智慧旅游運營方案
- 食品安全四員培訓
- 建筑施工進度管理:合理安排工期確保按時交付
- 學校關于鑄牢中華民族共同體意識宣傳教育工作的總結
- 如何建立質量管理體系
- 排污單位自行監(jiān)測技術指南 磚瓦工業(yè)(HJ 1254-2022)
- 炮眼鉆孔施工方案
- 食品檢驗檢測技術專業(yè)職業(yè)生涯規(guī)劃書
- 食品40農(nóng)產(chǎn)品加工業(yè)發(fā)展
- 《如何學好初中數(shù)學》課件
- 華為常用網(wǎng)絡拓撲模板
- 02(111)力學第二章平面匯交力系與平面力偶系解析
- 四路數(shù)字競賽搶答器的設計實驗報告
評論
0/150
提交評論