版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
操作系統(tǒng)課程設(shè)計(jì)報(bào)告PAGEPAGE36操作系統(tǒng)課程設(shè)計(jì)報(bào)告操作系統(tǒng)課程設(shè)計(jì)報(bào)告專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)學(xué)號(hào):姓名:提交日期:【設(shè)計(jì)目的】(1)本實(shí)驗(yàn)的目的是通過一個(gè)簡(jiǎn)單多用戶文件系統(tǒng)的設(shè)計(jì),加深理解文件系統(tǒng)的內(nèi)部功能和內(nèi)部實(shí)現(xiàn)。(2)結(jié)合數(shù)據(jù)結(jié)構(gòu)、程序設(shè)計(jì)、計(jì)算機(jī)原理等課程的知識(shí),設(shè)計(jì)一個(gè)二級(jí)文件系統(tǒng),進(jìn)一步理解操作系統(tǒng)。(3)通過分對(duì)實(shí)際問題的分析、設(shè)計(jì)、編程實(shí)現(xiàn),提高學(xué)生實(shí)際應(yīng)用、編程的能力【設(shè)計(jì)內(nèi)容】二級(jí)文件系統(tǒng)設(shè)計(jì)【實(shí)驗(yàn)環(huán)境】C++/VC++【相關(guān)知識(shí)綜述】1.背景知識(shí)(1)外存管理文件系統(tǒng)是一個(gè)含有大量的文件及其屬性,對(duì)文件進(jìn)行操作、管理的軟件,以及向用戶提供使用文件的接口的一個(gè)集合。在邏輯上它的層次結(jié)構(gòu)是這樣的:文件系統(tǒng)接口對(duì)對(duì)象的操作和管理的軟件集合邏輯文件系統(tǒng)基本I/O管理程序(文件組織模塊)基本文件系統(tǒng)(物理I/O層)I/O控制層(設(shè)備驅(qū)動(dòng)程序)對(duì)象及其屬性說明作為產(chǎn)品的操作系統(tǒng)有各自的文件系統(tǒng)。比如MS的WINDOWS系列使用的是FAT16、FAT32或NTFS的文件系統(tǒng)、LINUX使用的是EXT2、EXT3文件系統(tǒng)等等。(2)linux的EXT2文件系統(tǒng)linux使用一個(gè)叫虛擬文件系統(tǒng)的技術(shù)從而可以支持多達(dá)幾十種的不同文件系統(tǒng),而EXT2是linux自己的文件系統(tǒng)。它有幾個(gè)重要的數(shù)據(jù)結(jié)構(gòu),一個(gè)是超級(jí)塊,用來描述目錄和文件在磁盤上的物理位置、文件大小和結(jié)構(gòu)等信息。inode也是一個(gè)重要的數(shù)據(jù)結(jié)構(gòu)。文件系統(tǒng)中的每個(gè)目錄和文件均由一個(gè)inode描述。它包含:文件模式(類型和存取權(quán)限)、數(shù)據(jù)塊位置等信息。 一個(gè)文件系統(tǒng)除了重要的數(shù)據(jù)結(jié)構(gòu)之外,還必須為用戶提供有效的接口操作。比如EXT2提供的OPEN/CLOSE接口操作。(3)用內(nèi)存來模擬外存真正的文件系統(tǒng)對(duì)外存進(jìn)行管理,涉及到許多硬件、設(shè)備管理方面的底層技術(shù),一方面這些技術(shù)不屬于操作系統(tǒng)核心內(nèi)容,一方面過多的內(nèi)容不免造成實(shí)驗(yàn)者顧此失彼,所以這里推薦一種使用內(nèi)存來模擬外存的方式,可以跳過這些硬件技術(shù)而直接把精力放在數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)和操作算法設(shè)計(jì)上面。假定pInode是一個(gè)指向inode結(jié)構(gòu)的指針,而且它已經(jīng)放入的需要放入的數(shù)值了,現(xiàn)在需要將其寫入到特定位置??捎萌缦麓a:……fd=fopen(“filesystem”,”w+b”);//fd是FILE指針類型,w便是寫方式,b表示二進(jìn)制fseek(fd,specific_area,SEEK_SET);//fd是文件指針;specific_area為整形,//為需要入pInode的位置fwrite(pInode,sizeof(inode),1,fd);//寫入pInode信息2、原理算法本文件系統(tǒng)采用兩級(jí)目錄,其中第一級(jí)對(duì)應(yīng)于用戶賬號(hào),第二級(jí)對(duì)應(yīng)于用戶帳號(hào)下的文件。另外,為了簡(jiǎn)便文件系統(tǒng)未考慮文件共享,文件系統(tǒng)安全以及管道文件與設(shè)備文件等特殊內(nèi)容。首先應(yīng)確定文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):主目錄、子目錄及活動(dòng)文件等。主目錄和子目錄都以文件的形式存放于磁盤,這樣便于查找和修改。用戶創(chuàng)建的文件,可以編號(hào)存儲(chǔ)于磁盤上。如:file0,file1,file2…并以編號(hào)作為物理地址,在目錄中進(jìn)行登記?!驹O(shè)計(jì)思路】1、數(shù)據(jù)結(jié)構(gòu)#defineMAXNAME25/*mfdname,ufdname,filename的最大長(zhǎng)度*/#defineMAXCHILD50/*最大的子文件個(gè)數(shù)*/#defineMAX(MAXCHILD*MAXCHILD)/*物理地址計(jì)數(shù)fpaddrno的最大長(zhǎng)度*/typedefstruct/*結(jié)構(gòu)體OSFILE(文件)*/{ intfpaddr;/*文件的物理地址號(hào)0,1,2...*/ intflength;/*文件的長(zhǎng)度*/ intfmode;/*文件模式:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-protrcted;*/ charfname[MAXNAME];/*文件名*/}OSFILE;typedefstruct/*結(jié)構(gòu)體OSUFD(用戶目錄)*/{ charufdname[MAXNAME];/*ufd的名字*/ OSFILEufdfile[MAXCHILD];/*ufd自己的文件*/}OSUFD;typedefstruct/*結(jié)構(gòu)體OSUFD'LOGIN(用戶注冊(cè))*/{ charufdname[MAXNAME];/*ufd的名字*/ charufdpword[8];/*ufd的密碼*/}OSUFD_LOGIN;typedefstruct/*文件打開模式*/{ intifopen;/*打開情況:0-close,1-open*/ intopenmode;/*讀寫模式0-readonly,1-writeonly,2-readandwrite*/}OSUFD_OPENMODE;OSUFD*ufd[MAXCHILD];/*ufd及ufd自己的文件(指針型)*/OSUFD_LOGINufd_lp;/*建立了一個(gè)OSUFD_LOGIN型的ufd_lp*/intucount=0;/*mfd的ufd的個(gè)數(shù)*/intfcount[MAXCHILD];/*ufd自己的文件個(gè)數(shù)*/intloginsuc=0;/*是否成功登陸,1成功*/charusername[MAXNAME];/*記錄注冊(cè)的用戶名*/chardirname[MAXNAME];/*記錄文件當(dāng)前的目錄*/intfpaddrno[MAX];/*記錄文件的物理地址num*/OSUFD_OPENMODEifopen[MAXCHILD][MAXCHILD];/*創(chuàng)建一個(gè)OSUFD_OPENMODE型的數(shù)組用于記錄每個(gè)文件的打開情況和讀寫模式*/FILE*fp_mfd,*fp_ufd,*fp_file_p,*fp_file;/*定義FILE*型的文件指針,用于讀文件*/2、主要的函數(shù)說明 voidLoginF()/*用戶注冊(cè)登錄*/ voidDirF()/*顯示文件系統(tǒng)的所有文件*/ voidCdF()/*改變路徑*/ voidCreateF()/*創(chuàng)建文件*/ voidDeleteF()/*刪除文件*/ voidModifyFM()/*改變文件模式*/ voidOpenF()/*打開文件*/ voidCloseF()/*關(guān)閉文件*/ voidReadF()/*讀文件*/ voidWriteF()/*寫文件*/ voidQuitF()/*退出文件系統(tǒng)*/voidclrscr()/*清屏*/voidhelp(void)/*幫助*/其他重要輔助函數(shù): char*rtrim(char*str)/*移除最右邊的空格*/ char*ltrim(char*str)/*移除最左邊的空格*/voidSetPANo(intRorW)/*設(shè)置物理地址號(hào)(表示該地址號(hào)是否被用了0-未用,1-已用),RorW是0-read,1-write*/voidInputPW(char*password)/*輸入密碼并使用'*'代替*/intExistD(char*dirname)/*目錄是否存在,存在返回第i個(gè),不存在返回0*/intExistF(char*filename)/*文件是否存在,返回返回第i個(gè),不存在返回0*/ intFindPANo()/*找出要分配的物理地址號(hào)*/intWriteF1()/*創(chuàng)建文件中的寫文件*/3、程序流程設(shè)計(jì):對(duì)于自己實(shí)現(xiàn)的4個(gè)功能:(1)open():進(jìn)入open()進(jìn)入open()當(dāng)前用戶名和當(dāng)前目錄相同?NY請(qǐng)轉(zhuǎn)到當(dāng)前用戶名目錄下當(dāng)前文件存在?(文件號(hào)>0)輸入要打開的文件名,并查找對(duì)應(yīng)的文件號(hào)Y該文件不存在N確定當(dāng)前用戶的用戶號(hào)該文件已經(jīng)打開?N該文件已經(jīng)打開,不用再打開Y該文件可以被打開?(不是protect型的)Y該文件是protect的,不能打開打開文件N返回主函數(shù)(2)close():進(jìn)入close()進(jìn)入close()當(dāng)前用戶名和當(dāng)前目錄相同?NY請(qǐng)轉(zhuǎn)到當(dāng)前用戶名目錄下當(dāng)前文件存在?(文件號(hào)>0)輸入要關(guān)閉的文件名,并查找對(duì)應(yīng)的文件號(hào)Y該文件不存在N確定當(dāng)前用戶的用戶號(hào)該文件是關(guān)閉的?N該文件未打開,不用關(guān)閉YY關(guān)閉文件返回主函數(shù)(3)write():進(jìn)入write()進(jìn)入write()當(dāng)前用戶名和當(dāng)前目錄相同?NY請(qǐng)轉(zhuǎn)到當(dāng)前用戶名目錄下有打開的文件?輸入要寫入的文件名,并查找對(duì)應(yīng)的文件號(hào)無已經(jīng)打開的文件提示必須先打開,并顯示出已經(jīng)打開的文件列表NY當(dāng)前文件存在?(文件號(hào)>0)該文件不存在NY該文件已經(jīng)打開?該文件未打開,不能寫NY該文件可以被寫入?(是可寫或讀寫模式)該文件是制度模式或保護(hù)模式N確定文件路徑確定文件路徑寫入內(nèi)容到文件中記錄文件長(zhǎng)度返回主函數(shù)(4)delete進(jìn)入delete()進(jìn)入delete()當(dāng)前用戶名和當(dāng)前目錄相同?NY請(qǐng)轉(zhuǎn)到當(dāng)前用戶名目錄下當(dāng)前文件存在?(文件號(hào)>0)輸入要?jiǎng)h除的文件名,并查找對(duì)應(yīng)的文件號(hào)Y該文件不存在N確定當(dāng)前用戶的用戶號(hào)該文件可以被刪除?(不是protect型的)該文件是protect的,不能打開NY該文件已經(jīng)打開?該文件已經(jīng)打開,不能刪除YN刪除文件確定文件路徑刪除的后面的文件向前移刪除的后面的文件向前移該用戶的文件總數(shù)-1返回主函數(shù)把刪除后的地址號(hào)置為未用【源程序清單】#include"stdio.h"#include"string.h"#include"conio.h"#include"stdlib.h"#defineMAXNAME25/*mfdname,ufdname,filename的最大長(zhǎng)度*/#defineMAXCHILD50/*最大的子文件個(gè)數(shù)*/#defineMAX(MAXCHILD*MAXCHILD)/*物理地址計(jì)數(shù)fpaddrno的最大長(zhǎng)度*/typedefstruct/*結(jié)構(gòu)體OSFILE(文件)*/{ intfpaddr;/*文件的物理地址號(hào)0,1,2...*/ intflength;/*文件的長(zhǎng)度*/ intfmode;/*文件模式:0-ReadOnly;1-WriteOnly;2-ReadandWrite;3-protrcted;*/ charfname[MAXNAME];/*文件名*/}OSFILE;typedefstruct/*結(jié)構(gòu)體OSUFD(用戶目錄)*/{ charufdname[MAXNAME];/*ufd的名字*/ OSFILEufdfile[MAXCHILD];/*ufd自己的文件*/}OSUFD;typedefstruct/*結(jié)構(gòu)體OSUFD'LOGIN(用戶注冊(cè))*/{ charufdname[MAXNAME];/*ufd的名字*/ charufdpword[8];/*ufd的密碼*/}OSUFD_LOGIN;typedefstruct/*文件打開模式*/{ intifopen;/*ifopen:0-close,1-open*/ intopenmode;/*0-readonly,1-writeonly,2-readandwrite,3-protected*/}OSUFD_OPENMODE;OSUFD*ufd[MAXCHILD];/*ufd及ufd自己的文件(指針型)*/OSUFD_LOGINufd_lp;/*建立了一個(gè)OSUFD_LOGIN型的ufd_lp*/intucount=0;/*mfd的ufd的個(gè)數(shù)*/intfcount[MAXCHILD];/*ufd自己的文件個(gè)數(shù)*/intloginsuc=0;/*是否成功登陸*/charusername[MAXNAME];/*記錄注冊(cè)的用戶名*/chardirname[MAXNAME];/*記錄文件當(dāng)前的目錄*/intfpaddrno[MAX];/*記錄文件的物理地址num*/OSUFD_OPENMODEifopen[MAXCHILD][MAXCHILD];/*創(chuàng)建一個(gè)OSUFD_OPENMODE型的數(shù)組用于記錄每個(gè)文件的狀態(tài)(打開/關(guān)閉)*/FILE*fp_mfd,*fp_ufd,*fp_file_p,*fp_file;/*定義FILE*型的文件指針,用于讀文件*/voidclrscr()/*清屏*/{ system("cls");}voidmain(){ inti,choice1;/*choice錄選擇的命令的號(hào)*/ charchoice[50];/*選擇表達(dá)式:dir,create,delete,open,delete,modify,read,write*/ intchoiceend=1;/*是否選擇結(jié)束*/ char*rtrim(char*str);/*移除最右邊的空格*/ char*ltrim(char*str);/*移除最左邊的空格*/ voidLoginF();/*用戶注冊(cè)登錄*/ voidDirF();/*顯示文件系統(tǒng)的所有文件*/ voidCdF();/*改變路徑*/ voidCreateF();/*創(chuàng)建文件*/ voidDeleteF();/*刪除文件*/ voidModifyFM();/*改變文件模式*/ voidOpenF();/*打開文件*/ voidCloseF();/*關(guān)閉文件*/ voidReadF();/*讀文件*/ voidWriteF();/*寫文件*/ voidQuitF();/*退出文件系統(tǒng)*/ voidhelp(); if((fp_mfd=fopen("c:\\osfile\\mfd","rb"))==NULL)/*rb表示二進(jìn)制讀的方式打開,看他是否為空*/ { fp_mfd=fopen("c:\\osfile\\mfd","wb");/*rb表示二進(jìn)制寫的方式打開,沒有相當(dāng)于新創(chuàng)建一個(gè)mfd*/ fclose(fp_mfd); } for(i=0;i<MAX;i++) fpaddrno[i]=0;/*初始的時(shí)候?qū)⑽锢淼刂穘um設(shè)為0*/ clrscr();/*清屏*/ LoginF();/*用戶注冊(cè)登錄*/ clrscr(); if(loginsuc==1)/*登陸成功*/ { while(1) { if(choiceend==1)/*正確命令*/ { printf("\n\nC:\\%s>",strupr(dirname)); } elseprintf("Badcommandorfilename.\nC:\\%s>",strupr(username));/*錯(cuò)誤命令*/ gets(choice); strcpy(choice,ltrim(rtrim(strlwr(choice))));/*strlwr把輸入的choice變?yōu)樾懭サ艨崭窈罂截惖絚hoice*/ if(strcmp(choice,"dir")==0)/*根據(jù)用戶不同的命令輸入獲得不同的choice1值*/ choice1=1; elseif(strcmp(choice,"create")==0)choice1=2; elseif(strcmp(choice,"delete")==0)choice1=3; elseif(strcmp(choice,"attrib")==0) choice1=4; elseif(strcmp(choice,"open")==0)choice1=5; elseif(strcmp(choice,"close")==0)choice1=6; elseif(strcmp(choice,"read")==0)choice1=7; elseif(strcmp(choice,"write")==0)choice1=8; elseif(strcmp(choice,"exit")==0)choice1=9; elseif(strcmp(choice,"cls")==0)choice1=10; elseif(strcmp(choice,"cd")==0)choice1=11; elseif(strcmp(choice,"help")==0)choice1=20; elsechoice1=12; switch(choice1)/*根據(jù)不同的輸入的命令對(duì)應(yīng)相應(yīng)的命令*/ { case1: DirF();choiceend=1;break; case2:CreateF();choiceend=1;break; case3:DeleteF();choiceend=1;break; case4:ModifyFM();choiceend=1;break; case5:choiceend=1;OpenF();break; case6:choiceend=1;CloseF();break; case7:choiceend=1;ReadF(); break; case8:choiceend=1;WriteF();break; case9:printf("\nYouhaveexitedthissystem.\n");QuitF();exit(0);break;/*退出系統(tǒng)*/ case10:choiceend=1;clrscr();break; case11:CdF();choiceend=1;break; case20:help();choiceend=1;break; default:choiceend=0;/*其他錯(cuò)誤命令則選擇結(jié)束*/ } } } elseprintf("\nAccessdenied.\n");/*登陸不成功*/}voidhelp(void)/*幫助*/{ printf("\nTheCommandList\n"); printf("\nCdDirAttribCreatewriteReadOpenClsDeleteExitClose\n");}char*rtrim(char*str)/*移除右邊的空格*/{ intn=strlen(str)-1;/*n為串長(zhǎng)-1*/ while(n>=0) { if(*(str+n)!='')/*不是空格了,則下一個(gè)置為/0結(jié)束符*/ { *(str+n+1)='\0'; break; } else/*是空格,繼續(xù)往回退*/ n--; } if(n<0)/*空串*/ str[0]='\0'; returnstr;}char*ltrim(char*str)/*移除左邊的空格*/{ char*rtrim(char*str); strrev(str);/*將str字符串反轉(zhuǎn)*/ rtrim(str);/*移除右邊的空格*/ strrev(str);/*將str字符串再反轉(zhuǎn)回來*/ returnstr;}voidLoginF()/*用戶注冊(cè)登錄*/{ charloginame[MAXNAME],loginpw[9],logincpw[9],str[50]; inti,j,flag=1; chara[25]; intfindout;/*注冊(cè)用戶是否存在1為存在*/ char*rtrim(char*str);/*移除右邊的空格*/ char*ltrim(char*str);/*移除左邊的空格*/ voidInputPW(char*password);/*輸入密碼并使用'*'代替*/ voidSetPANo(intRorW);/*設(shè)置物理地址num*/ while(1) { findout=0; printf("\n\nLoginName:"); gets(loginame); ltrim(rtrim(loginame));/*移除空格*/ fp_mfd=fopen("c:\\osfile\\mfd","rb");/*rb表示以二進(jìn)制讀的方式打開mfd*/ for(i=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;i++)/*fread是從mfd中讀,是否有用戶可以讀出,有4個(gè)參數(shù)分別是讀出的存儲(chǔ)緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/ { if(strcmp(strupr(ufd_lp.ufdname),strupr(loginame))==0)/*檢測(cè)轉(zhuǎn)為大寫的用戶名是否存在*/ { findout=1;/*用戶已存在*/ strcpy(logincpw,ufd_lp.ufdpword);/*把已存在的密碼ufd_lp.ufdpword拷貝到logincpw*/ } } fclose(fp_mfd);/*關(guān)閉文件*/ if(findout==1)/*用戶已存在的情況*/ { printf("LoginPassword:"); InputPW(loginpw);/*輸入密碼并使用'*'代替*/ if(strcmp(loginpw,logincpw)==0)/*如果用戶輸入的密碼和已存在的相同*/ { strcpy(username,strupr(loginame));/*把輸入的用戶名轉(zhuǎn)成大寫拷貝到username*/ strcpy(dirname,username);/*把用戶名拷貝到dirname*/ fp_mfd=fopen("c:\\osfile\\mfd","rb");/*以二進(jìn)制讀的方式打開文件*/ for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++)/*fread是從mfd中讀,是否有用戶可以讀出,有4個(gè)參數(shù)分別是讀出的存儲(chǔ)緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/ { strcpy(str,"c:\\osfile\\"); strcat(str,ufd_lp.ufdname);/*str為用戶目錄的路徑*/ ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));/*分配建立一個(gè)新的ufd*/ strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdname));/*ufdname寫入ufd結(jié)構(gòu)體的ufdname*/ fp_ufd=fopen(str,"rb");/*打開這個(gè)用戶目錄文件*/ fcount[j]=0;/*新創(chuàng)建的ufd中的文件的個(gè)數(shù)為0*/ for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++)/*fread是從mfd中讀,是否有用戶可以讀出,有4個(gè)參數(shù)分別是讀出的存儲(chǔ)緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/ {/*j用戶的文件個(gè)數(shù)也要+1*/ ifopen[j][i].ifopen=0; ifopen[j][i].openmode=4;/*初始化所有的文件打開模式(不是文件自身的模式)*/ } fclose(fp_ufd);/*關(guān)閉這個(gè)ufd*/ } fclose(fp_mfd);/*關(guān)閉mfd*/ ucount=j;/*mfd中的ufd個(gè)數(shù)*/ SetPANo(0);/*設(shè)置物理地址號(hào)(表示該地址號(hào)是否被用了0-未用,1-已用)*/ printf("\n\nLoginsuccessful!WelcometothisFileSystem\n\n"); loginsuc=1;/*登陸成功*/ return; } else/*輸入密碼不正確*/ { printf("\n\n"); flag=1;/*標(biāo)記*/ while(flag) { printf("LoginFailed!PasswordError.TryAgain(Y/N):"); gets(a); ltrim(rtrim(a)); if(strcmp(strupr(a),"Y")==0)/*判斷是否重新輸入*/ { loginsuc=0;flag=0; } elseif(strcmp(strupr(a),"N")==0) { loginsuc=0;flag=0;return; } } } } else/*用戶不存在的情況*/ { printf("NewPassword(<=8):"); InputPW(loginpw);/*輸入新密碼并用'*'代替*/ printf("\nConfirmPassword(<=8):"); InputPW(logincpw);/*再次輸入密碼并用'*'代替*/ if(strcmp(loginpw,logincpw)==0)/*兩次輸入的密碼相同*/ { strcpy(ufd_lp.ufdname,strupr(loginame)); strcpy(ufd_lp.ufdpword,loginpw);/*把輸入的用戶名、密碼記錄到ufd_lp*/ fp_mfd=fopen("c:\\osfile\\mfd","ab");/*以二進(jìn)制接著寫的方式打開mfd*/ fwrite(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd);/*把ufd_lp指向的內(nèi)容接著寫入到mfd中*/ fclose(fp_mfd); strcpy(username,strupr(loginame)); strcpy(dirname,loginame); strcpy(str,"c:\\osfile\\"); strcat(str,username);/*形成路徑c:\\osfile\\用戶名*/ if((fp_ufd=fopen(str,"rb"))==NULL)/*以二進(jìn)制讀的方式打開,如果為空*/ { fp_ufd=fopen(str,"wb");/*以二進(jìn)制寫的方式打開,即新創(chuàng)建用戶名文件*/ fclose(fp_ufd); } fp_mfd=fopen("c:\\osfile\\mfd","rb");/*以讀的方式打開mfd*/ for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++)/*fread是從mfd中讀,是否有用戶可以讀出,有4個(gè)參數(shù)分別是讀出的存儲(chǔ)緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/ { strcpy(str,"c:\\osfile\\"); strcat(str,ufd_lp.ufdname);/*str為用戶目錄的路徑*/ ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));/*分配建立一個(gè)新的ufd*/ strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdname));/*ufdname寫入ufd結(jié)構(gòu)體的ufdname*/ fp_ufd=fopen(str,"rb"); for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++)/*fread是從mfd中讀,是否有用戶可以讀出,有4個(gè)參數(shù)分別是讀出的存儲(chǔ)緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/ { /*j用戶的文件個(gè)數(shù)也要+1*/ ifopen[j][i].ifopen=0;/*初始化所有的文件打開模式(不是文件自身的模式)*/ ifopen[j][i].openmode=4; } fclose(fp_ufd); } fclose(fp_mfd);/*關(guān)閉mfd*/ ucount=j;/*mfd中的ufd個(gè)數(shù)*/ SetPANo(0);/*設(shè)置物理地址號(hào)(表示該地址號(hào)是否被用了0-未用,1-已用)*/ printf("\n\nLoginsuccessful!WelcometothisFileSystem\n\n"); loginsuc=1;/*登陸成功*/ return; } else/*兩次輸入的密碼不同*/ { printf("\n\n"); flag=1; while(flag) { printf("LoginFailed!PasswordError.TryAgain(Y/N):"); gets(a); ltrim(rtrim(a)); if(strcmp(strupr(a),"Y")==0) { loginsuc=0; flag=0; } elseif(strcmp(strupr(a),"N")==0) { loginsuc=0; flag=0; } } } } }}voidSetPANo(intRorW)/*設(shè)置物理地址號(hào)(表示該地址號(hào)是否被用了0-未用,1-已用),RorW是0-read,1-write*/{ inti,j; if(RorW==0)/*以讀的方式,已存在的用戶*/ { if((fp_file_p=fopen("c:\\osfile\\file\\file_p","rb"))==NULL)/*如果以二進(jìn)制讀的方式打開file_p文件找不到*/ { fp_file_p=fopen("c:\\osfile\\file\\file_p","wb");/*以二進(jìn)制寫的方式打開,即創(chuàng)建一個(gè)file_p*/ fclose(fp_file_p); } fp_file_p=fopen("c:\\osfile\\file\\file_p","rb");/*以二進(jìn)制讀的方式打開file_p*/ for(i=0;fread(&j,sizeof(int),1,fp_file_p)!=0;i++)/*fread是從fp_file中讀,是否有文件號(hào)可以讀出,有4個(gè)參數(shù)分別是讀出的存儲(chǔ)緩沖區(qū)、讀的大小、讀出的最大數(shù)量、文件指針*/ fpaddrno[j]=1;/*將第j個(gè)文件物理地址號(hào)置為1,已經(jīng)用了*/ } else/*以寫的方式*/ { fp_file_p=fopen("c:\\osfile\\file\\file_p","wb");/*以二進(jìn)制寫的方式打開*/ for(i=0;i<MAX;i++) if(fpaddrno[i]==1)/*第i個(gè)文件已存在*/ fwrite(&i,sizeof(int),1,fp_file_p);/*記錄物理地址號(hào)到fp_file*/ } fclose(fp_file_p);}voidInputPW(char*password)/*輸入密碼并使用'*'代替*/{ intj; for(j=0;j<=7;j++)/*8位密碼*/ { password[j]=getch();/*依次讀入*/ if((int)(password[j])!=13)/*!=回車*/ { if((int)(password[j])!=8)/*!=退格*/ putchar('*'); else/*=退格*/ { if(j>0) { j--; j--; putchar('\b'); putchar(''); putchar('\b'); } elsej--; } } else/*=回車,密碼輸入結(jié)束*/ { password[j]='\0'; break; } } password[j]='\0';}voidDirF()/*顯示文件系統(tǒng)的所有文件*/{ inti,j,count=0; charsfmode[25],sfpaddr[25],str[25]; intExistD(char*dirname);/*目錄是否存在,存在-i個(gè),不存在-0*/ clrscr();/*清屏*/ if(strcmp(strupr(ltrim(rtrim(dirname))),"")!=0)/*dirname不為空,顯示的是當(dāng)前用戶的所有文件*/ { printf("\n\nC:\\%s>dir\n",dirname); printf("\n%10s%15s%14s%8s%18s\n","FileName","FileAddress","FileLength","Type","FileMode"); j=ExistD(dirname);/*該目錄是第幾個(gè)目錄*/ for(i=0;i<fcount[j];i++) { if((i%16==0)&&(i!=0))/*滿16個(gè)清屏*/ { printf("\nPressanykeytocontinue.."); getch(); clrscr(); printf("\n%10s%15s%14s%8s%18s\n","FileName","FileAddress","FileLength","Type","FileMode"); } itoa(ufd[j]->ufdfile[i].fpaddr,str,10);/*將整形轉(zhuǎn)換為字符串型*/ strcpy(sfpaddr,"file"); strcat(sfpaddr,str);/*連接成為物理地址filex*/ if(ufd[j]->ufdfile[i].fmode==0) strcpy(sfmode,"ReadOnly"); elseif(ufd[j]->ufdfile[i].fmode==1) strcpy(sfmode,"WriteOnly"); elseif(ufd[j]->ufdfile[i].fmode==2) strcpy(sfmode,"ReadAndWrite"); else strcpy(sfmode,"Protect"); printf("%10s%15s%14d%8s%18s\n",ufd[j]->ufdfile[i].fname,sfpaddr,ufd[j]->ufdfile[i].flength,"<FILE>",sfmode); } printf("\n%3dfile(s)\n",fcount[j]); } else/*dirname為空,顯示的是上一層目錄(主目錄)的所有文件(各個(gè)用戶文件夾)*/ { printf("\n\nC:\\>dir\n"); printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type");/*包括3個(gè)項(xiàng)*/ for(i=0;i<ucount;i++) { if((i%16==0)&&(i!=0))/*滿16個(gè)清屏*/ { printf("\nPressanykeytocontinue..."); getch(); clrscr(); printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type"); } printf("%14s%18d%8s\n",ufd[i]->ufdname,fcount[i],"<UFD>"); count=count+fcount[i]; } printf("\n%3ddir(s),%5dfile(s)\n",ucount,count); }}intExistD(char*dirname)/*目錄是否存在,存在返回第i個(gè),不存在返回-1*/{ inti; intexist=0; for(i=0;i<ucount;i++) if(strcmp(strupr(ufd[i]->ufdname),strupr(dirname))==0) { exist=1; break; } if(exist)return(i);/*返回用戶目錄個(gè)數(shù)*/ elsereturn(-1);}voidCdF()/*改變路徑*/{ chardname[MAXNAME]; char*rtrim(char*str);/*移除左邊的空格*/ char*ltrim(char*str);/*移除右邊的空格*/ intExistD(char*filename);/*目錄是否存在,存在-i個(gè),不存在-0*/ printf("\nPleaseinputDirName(..-Previousdir;DirNAME-cd[DirNAME]):"); gets(dname); ltrim(rtrim(dname));/*移除空格*/ if(ExistD(dname)>=0)/*如果存在用戶目錄,是>第0個(gè)目錄*/ strcpy(dirname,strupr(dname));/*用戶目錄名拷貝到當(dāng)前目錄*/ elseif(strcmp(strupr(dname),"..")==0)/*如果輸入的dname是..*/ strcpy(ltrim(rtrim(dirname)),"");/*將當(dāng)前目錄變?yōu)榭?/ elseprintf("\nError.\'%s\'doesnotexist.\n",dname);/*否則不存在*/}voidCreateF()/*創(chuàng)建文件*/{ intfpaddrno,flag=1,i; charfname[MAXNAME],str[50],str1[50],a[25]; charfmode[25]; char*rtrim(char*str);/*移除左邊的空格*/ char*ltrim(char*str);/*移除右邊的空格*/ intFindPANo();/*找出物理地址號(hào)*/ intWriteF1();/*寫文件*/ intExistF(char*filename);/*是否存在文件返回文件號(hào)(第幾個(gè)),存在-i,不存在-0*/ intExistD(char*dirname); if(strcmp(strupr(dirname),strupr(username))!=0)/*如果username和當(dāng)前目錄不同則不能創(chuàng)建*/ { printf("\nError.Youmustcreatefileinyourowndir.\n"); } else/*可以創(chuàng)建*/ { printf("\nPleaseinputFileName:"); gets(fname);/*文件名*/ ltrim(rtrim(fname));/*去空格*/ if(ExistF(fname)>=0)/*文件號(hào)已存在*/ { printf("\nError.Name\'%s\'hasalreadyexisted.\n",fname); return; } else/*文件號(hào)還未存在*/ { printf("PleaseinputFileMode(0-ReadOnly,1-WriteOnly,2-ReadandWrite,3-Protect):"); gets(fmode);/*選擇模式*/ ltrim(rtrim(fmode)); if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)||(strcmp(fmode,"3")==0)) { fpaddrno=FindPANo();/*找出新分配的物理地址號(hào)*/ if(fpaddrno>=0) { i=ExistD(username);/*判斷該用戶是否存在,返回是第幾個(gè)*/ strcpy(ufd[i]->ufdfile[fcount[i]].fname,fname);/*將這個(gè)新的文件名寫入ufd[i]->ufdfile[最后一個(gè)記錄的下一個(gè)].fname*/ ufd[i]->ufdfile[fcount[i]].fpaddr=fpaddrno;/*將新分配的物理地址號(hào)寫入ufd[i]->ufdfile[最后一個(gè)記錄的下一個(gè)].fpaddrno*/ ufd[i]->ufdfile[fcount[i]].fmode=atoi(fmode);/*將新文件的模式寫入ufd[i]->ufdfile[最后一個(gè)記錄的下一個(gè)].fmode*/ ifopen[i][fcount[i]].ifopen=0;/*初始化ifopen模式*/ ifopen[i][fcount[i]].openmode=4; strcpy(str,"c:\\osfile\\file\\file"); itoa(fpaddrno,str1,10);/*轉(zhuǎn)為字符串*/ strcat(str,str1);/*連接形成完整的路徑*/ fp_file=fopen(str,"wb");/*以二進(jìn)制寫的形式打開以str為目錄的文件,沒有就創(chuàng)建,有就清空內(nèi)容*/ fclose(fp_file); fcount[i]++;/*第i個(gè)用戶的文件數(shù)+1*/ while(flag) { printf("Inputtextnow(Y/N):"); gets(a); ltrim(rtrim(a)); ufd[i]->ufdfile[fcount[i]-1].flength=0; if(strcmp(strupr(a),"Y")==0)/*輸入文本*/ { fp_file=fopen(str,"wb+"); ufd[i]->ufdfile[fcount[i]-1].flength=WriteF1();/*調(diào)用WriteF1()寫文件,返回值是文件長(zhǎng)度*/ flag=0; } elseif(strcmp(strupr(a),"N")==0)/*不輸入文本,結(jié)束*/ { flag=0; } } printf("\n\'%s\'hasbeencreatedsuccessfully!\n",fname); } else/*無分配的地址號(hào)了(返回的-1)*/ { printf("\nFail!NoDiskSpace.Pleaseformatyourdisk.\n"); return; } } else/*選擇0-3外*/ { printf("\nError.FileMode\'sRangeis0-3n"); return; } } }}intExistF(char*filename)/*文件是否存在,返回返回第i個(gè),不存在返回-1*/{ inti,j; intexist=0; intExistD(char*dirname); j=ExistD(dirname);/*第j個(gè)用戶*/ for(i=0;i<fcount[j];i++) if(strcmp(strupr(ufd[j]->ufdfile[i].fname),strupr(filename))==0) { exist=1; break; } if(exist) return(i); else return(-1);}intFindPANo()/*找出要分配的物理地址號(hào)*/{ inti; for(i=0;i<MAX;i++) if(fpaddrno[i]==0) { fpaddrno[i]=1;/*第i個(gè)未用,將第i個(gè)的物理地址num設(shè)為1*/ break; } if(i<MAX) return(i);/*返回標(biāo)號(hào)*/ else return(-1);}intWriteF1()/*創(chuàng)建文件中的寫文件*/{ intlength=0; charc; printf("Pleaseinputtext(\'#\'standsforend):\n"); while((c=getchar())!='#') { fprintf(fp_file,"%c",c); if(c!='\n') length++; } getchar(); fprintf(fp_file,"\n"); fclose(fp_file); return(length);/*文件長(zhǎng)度*/}voidModifyFM()/*改變文件模式*/{ charfname[MAXNAME],str[50]; inti,k; charfmode[25]; char*rtrim(char*str); char*ltrim(char*str);/*刪除空格*/ voidInputPW(char*password);/*輸入密碼并用*代替*/ voidSetPANo(intRorW);/*設(shè)置物理地址num*/ intExistF(char*filename);/*文件名是否存在,Exist-i,NotExist-0*/ intExistD(char*dirname); if(strcmp(strupr(dirname),strupr(username))!=0)/*用戶名和當(dāng)前目錄不同*/ { printf("\nError.Youcanonlymodifyfilemodeinyourselfdir.\n"); } else/*用戶名和當(dāng)前目錄相同*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname)); i=ExistF(fname);/*第幾個(gè)文件*/ if(i>=0)/*該文件存在*/ { k=ExistD(username);/*第幾個(gè)用戶號(hào)*/ if(ifopen[k][i].ifopen==1)/*如果該文件是打開的*/ { printf("\nError.\'%s\'isinopenstatus.Closeitbeforemodify.\n",fname); } else/*是關(guān)閉的*/ { if(ufd[k]->ufdfile[i].fmode==0)/*現(xiàn)存的文件模式*/ strcpy(str,"readonly"); elseif(ufd[k]->ufdfile[i].fmode==1) strcpy(str,"writeonly"); elseif(ufd[k]->ufdfile[i].fmode==2) strcpy(str,"readandwrite"); elsestrcpy(str,"Protect"); printf("\'%s\'filemodeis%s.\n",fname,strupr(str));/*顯示出現(xiàn)存的文件模式*/ printf("Modifyto(0-readonly,1-writeonly,2-readandwrite,3-Protect):"); gets(fmode); ltrim(rtrim(fmode)); if(strcmp(fmode,"0")==0)/*改為readonly*/ { ufd[k]->ufdfile[i].fmode=0; printf("\n\'%s\'hasbeenmodifiedtoREADONLYmodesuccessfully.\n",fname); } elseif(strcmp(fmode,"1")==0)/*改為writeonly*/ { ufd[k]->ufdfile[i].fmode=1; printf("\n\'%s\'hasbeenmodifiedtoWRITEONLYmodesuccessfully.\n",fname); } elseif(strcmp(fmode,"2")==0)/*改為readandwrite*/ { ufd[k]->ufdfile[i].fmode=2; printf("\n\'%s\'hasbeenmodifiedtoREADANDWRITEmodesuccessfully.\n",fname); } elseif(strcmp(fmode,"3")==0)/*改為Protect*/ { ufd[k]->ufdfile[i].fmode=3; printf("\n\'%s\'hasbeenmodifiedtoPROTECTmodesuccessfully.\n",fname); } else { printf("\nError.\'%s\'isnotmodified.\n",fname); } } } else/*該文件不存在*/ { printf("\nError.\'%s\'dosenotexist.\n",fname); } }}voidReadF()/*讀文件*/{ inti,k,n=0; charfname[MAXNAME]; charstr[255],str1[255],c; char*rtrim(char*str); char*ltrim(char*str);/*移除空格*/ intExistF(char*filename);/*文件名是否存在,Exist-i,NotExist-0*/ intExistD(char*dirname); if(strcmp(strupr(ltrim(rtrim(dirname))),"")==0)/*如果當(dāng)前目錄為空(主目錄)*/ { printf("\nError.Pleaseconverttoufddirbeforeread.\n");/*必須轉(zhuǎn)到用戶目錄下*/ return; } printf("\nCaution:Openfilefirst\n\n"); printf("OpenedFile(s)List:\n"); k=ExistD(dirname);/*第幾個(gè)用戶*/ for(i=0;i<fcount[k];i++)/*第k個(gè)用戶有多少個(gè)文件*/ { if(ifopen[k][i].ifopen==1)/*如果文件已打開*/ if((ifopen[k][i].openmode==0)||(ifopen[k][i].openmode==2))/*可以讀*/ { printf("%15s",ufd[k]->ufdfile[i].fname);/*輸出這個(gè)已打開的可讀的文件名*/ n++; } if((n%4==0)&&(n!=0)) printf("\n");/*4個(gè)換行*/ } printf("\n%dfilesopenned.\n",n); if(n==0)/*無打開的文件,返回*/ return; if(n!=0)/*有打開的文件*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname)); i=ExistF(fname);/*第幾個(gè)文件號(hào)*/ if(i>=0)/*文件存在*/ { if(ifopen[k][i].ifopen==1)/*已打開*/ { if((ifopen[k][i].openmode==0)||(ifopen[k][i].openmode==2))/*可讀*/ { itoa(ufd[k]->ufdfile[i].fpaddr,str,10);/*文件號(hào)整形轉(zhuǎn)為字符串*/ strcpy(str1,"file"); strcat(str1,str); strcpy(str,"c:\\osfile\\file\\"); strcat(str,str1);/*str形成路徑c:\\osfile\\file\\filex*/ fp_file=fopen(str,"rb");/*以二進(jìn)制讀的方式打開filex文件*/ fseek(fp_file,0,0);/*指針移到0*/ printf("\nThetextis:\n\n"); printf(""); while(fscanf(fp_file,"%c",&c)!=EOF)/*從file中一個(gè)一個(gè)字符讀出來*/ if(c=='\n')/*讀出的是回車*/ printf("\n");/*輸出回車*/ else/*讀出的是其他*/ printf("%c",c);/*輸出其他字符*/ printf("\n\n%dLength.\n",ufd[k]->ufdfile[i].flength);/*顯示出該文件長(zhǎng)度*/ fclose(fp_file); } else/*不可讀*/ { printf("\nError.\'%s\'hasbeenopenedwithWRITEONLYmode.Itisn\'tread.\n",fname); } } else/*未打開*/ { printf("\nError.\'%s\'isinclosingstatus.Pleaseopenitbeforeread\n",fname); } } else/*文件不存在*/ { printf("\nError.\'%s\'doesnotexist.\n",fname); } }}voidQuitF()/*退出文件系統(tǒng)*/{ inti,j; charstr[50]; voidSetPANo(intRorW); SetPANo(1);/*設(shè)置物理地址號(hào)(表示該地址號(hào)是否被用了0-未用,1-已用),RorW是0-read,1-write*/ if(fp_mfd!=NULL) fclose(fp_mfd); if(fp_ufd!=NULL) fclose(fp_ufd); if(fp_file!=NULL) fclose(fp_file);/*關(guān)閉文件*/ for(j=0;j<ucount;j++) { strcpy(str,"c:\\osfile\\"); strcat(str,ufd[j]->ufdname); ltrim(rtrim(str));/*去除空格*/ fp_ufd=fopen(str,"wb");/*二進(jìn)制寫的方式打開ufd文件,相當(dāng)于清空內(nèi)容*/ fclose(fp_ufd);/*關(guān)閉*/ fp_ufd=fopen(str,"ab");/*二進(jìn)制接著寫的方式打開ufd文件*/ for(i=0;i<fcount[j];i++) fwrite(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd);/*將文件信息寫入ufd*/ fclose(fp_ufd); }}voidOpenF()/*打開文件*/{ charfname[MAXNAME]; inti,k; if(strcmp(strupr(dirname),strupr(username))!=0)/*用戶名和當(dāng)前目錄不同*/ { printf("\nError!Youcanonlyopenfileinyourselfdir.\n"); } else/*用戶名和當(dāng)前目錄相同了*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname));/*去除空格*/ i=ExistF(fname);/*文件是否存在并返回第幾個(gè)文件號(hào)*/ if(i>=0)/*文件存在*/ { k=ExistD(username);/*根據(jù)用戶名確定用戶號(hào)*/ if(ifopen[k][i].ifopen==1)/*該文件已經(jīng)打開*/ { printf("\nError.file\'%s\'hadbeenopened,itcannotbeopenedagain.\n",fname); } else/*該文件還未打開*/ { if((ufd[k]->ufdfile[i].fmode==0)||(ufd[k]->ufdfile[i].fmode==1)||(ufd[k]->ufdfile[i].fmode==2))/*該文件的屬性是可以被打開的*/ { ifopen[k][i].ifopen=1;/*打開,將ifopen設(shè)為1*/ ifopen[k][i].openmode=(ufd[k]->ufdfile[i].fmode);/*將ifopen.openmode設(shè)為該文件的模式*/ printf("\'%s\'hasbeenopenedsuccessfully!",fname); } else/*保護(hù)模式的文件不能被打開*/ printf("\n\'%s\'isaprotectedfile,itcannotbeopened.",fname); } } else/*文件不存在*/ { printf("\nError.\'%s\'dosenotexist.\n",fname); } }}voidCloseF()/*關(guān)閉文件*/{ charfname[MAXNAME]; inti,k; if(strcmp(strupr(dirname),strupr(username))!=0)/*用戶名和當(dāng)前目錄不同*/ { printf("\nError.Youcanonlymodifyfilemodeinyourselfdir.\n"); } else/*用戶名和當(dāng)前目錄相同了*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname));/*去除空格*/ i=ExistF(fname);/*文件是否存在并返回第幾個(gè)文件號(hào)*/ if(i>=0)/*文件存在*/ { k=ExistD(username);/*根據(jù)用戶名確定用戶號(hào)*/ if(ifopen[k][i].ifopen==0)/*該文件未打開*/ { printf("\nError.\'%s\'hasbeenclosed.youcannotcloseitagain.\n",fname); } else/*該文件已打開*/ { ifopen[k][i].ifopen=0;/*關(guān)閉,置為0*/ ifopen[k][i].openmode=4;/*修改打開模式為初始的打開模式*/ printf("\'%s\'hasbeenclosedsuccessfully!",fname); } } else/*文件不存在*/ { printf("\nError.\'%s\'dosenotexist.\n",fname); } }}voidDeleteF()/*刪除文件*/{ charfname[MAXNAME]; inti,k,x; charstr[255],str1[255]; if(strcmp(strupr(dirname),strupr(username))!=0)/*用戶名和當(dāng)前目錄不同*/ { printf("\nError.Youcanonlydeletefileinyourselfdir.\n"); } else/*用戶名和當(dāng)前目錄相同了*/ { printf("\nPleaseinputFileName:"); gets(fname); ltrim(rtrim(fname));/*去除空格*/ i=ExistF(fname);/*文件是否存在并返回第幾個(gè)文件號(hào)*/ if(i>=0)/*文件存在*/ { k=ExistD(username);/*根據(jù)用戶名確定用戶號(hào)*/ if(ufd[k]->ufdfile[i].fmode==3)/*該文件的屬性是protect的*/ { printf("\n\'%s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024廬山店鋪轉(zhuǎn)讓合同文本
- 2024至2030年商業(yè)用高效率條碼標(biāo)簽印表機(jī)項(xiàng)目投資價(jià)值分析報(bào)告
- 2024至2030年光控同步感應(yīng)器開關(guān)項(xiàng)目投資價(jià)值分析報(bào)告
- 2024至2030年中國(guó)青木瓜粉數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)連鎖餐飲系統(tǒng)軟件數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)電源供應(yīng)器線扣數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024投資合作協(xié)議合同
- 2024裝修電力工程合同范本
- 2024廣東省勞動(dòng)合同英文版樣本范文
- 2024建筑工程清包合同
- 房地產(chǎn)市場(chǎng)報(bào)告 -2023年第四季度佛山寫字樓市場(chǎng)報(bào)告
- 貨款轉(zhuǎn)讓協(xié)議范本向第三方轉(zhuǎn)讓貨款協(xié)議
- 蘇教小學(xué)美術(shù)四上《第12課老房子》課件
- 專用中國(guó)地圖-可編輯
- 2024年安徽交控集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 科技倫理課件
- 中班數(shù)學(xué)活動(dòng)《5以內(nèi)的相鄰數(shù)》
- (完整版)【部編版】九年級(jí)下冊(cè)《詞四首》-默寫、賞析、練習(xí)題
- 小學(xué)趣味版畫校本課程的開發(fā)與應(yīng)用研究課題匯報(bào)
- 2023復(fù)配巖改性瀝青路面技術(shù)標(biāo)準(zhǔn)
- 煙草專賣執(zhí)法和案卷制作規(guī)范課件
評(píng)論
0/150
提交評(píng)論