文件系统的设计与实现(操作系统课程设计)
轉發請注明:http://blog.csdn.net/tianqingdezhuanlan/article/details/51344739
源碼下載地址:http://download.csdn.net/download/u013255737/9513460
?????????????????????
?一、設計目的、意義
1.通過模擬文件系統的實現,深入理解操作系統中文件系統的理論知識, 加深對教材中的重要算法的理解。同時通過編程實現這些算法,更好地掌握操作系統的原理及實現方法,提高綜合運用各專業課知識的能力。
2.意義:本文件系統采用多級目錄,其中第一級對應于用戶賬號,第二級對應于用戶賬號下的文件,第三級對應文件夾下的文件,以此類推。另外,為了簡單本文件系統未考慮文件共享、文件系統安全以及管道文件與設備文件等特殊內容。
二、設計分析
- 用戶登錄
?? 用戶分為超級管理員、管理員和普通用戶。超級管理員具有創建用戶并設置權限的權限;
管理員與超級管理員權限基本相同。
- 建立文件
模擬文件系統進行“建立文件”的處理。
- 打開文件
約定操作類型與文件屬性不符合和正處在“建立”狀態的文件不允許打開。
- 關閉文件
對某個文件不需要再讀或寫的時候,用戶應關閉該文件。
- 讀文件
文件打開后可順序讀文件中的記錄,讀長度表示本次操作需讀的記錄個數。
- 寫文件
執行寫文件操作時要區分兩種情況,第一種是在執行create后要求寫,第二種是執行open后要求寫。對第二種情況可認為用戶要對一個已建立好的文件進行修改。一個文件可以分多次寫,既可按記錄順序寫也可隨機寫一個記錄,采用順序寫時可省略記錄號。
- 刪除文件
把請求撤消的文件從擁護文件目錄表中除名,收回該文件站用的存儲區域。
- 文件列表
將目前本用戶本路徑的文件列出,并列出相關的屬性。
- 結束
退出程序,返回原有操作系統。
三、方案分析
3.1?主要的數據結構
通過分析課程設計要求,具體設計出如下數據結構:
//用戶類型定義
struct user {char name[10];//用戶名int pride;//用戶權限,1為管理員,0為普通用戶char pass[10];//用戶密碼 };//定義空白區項
struct freeb {int number;struct freeb * next; };//定義文件打開項
struct fileb {int parent;//所在父節點char name[15];//文件名int pride;//讀寫權限,0只讀,1讀寫int? rex;//讀寫狀態,0為沒有,1讀2寫struct fileb * next; };//定義文件索引項
struct findex {char name[15];int number;int parent;char kind;struct findex * next; };//定義目錄表項
struct dreitem {char name[25];//目錄或者文件名稱int share; //共享數int parent;//上層目錄int pride;//文件操作權限,0只讀,1讀寫int empty;//是否是空閑塊,0為空閑塊,1為非空char kind;//類型,文件為f,文件夾為d };3.2:流程圖
3.2.1主流程圖:
3.2.2創建文件夾流程圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?3.2.3創建文件流程圖:
3.2.4寫文件流程圖:
3.2.5進入文件函數流程圖:
3.2.6讀文件流程圖:
3.2.7刪除流程圖:
四、功能模塊實現
4.1 login 登陸:
用戶輸入用戶名和密碼,在user文件中查找是否有此用戶,核對密碼。正確則登陸成功,當前目錄設定到當前用戶文件夾下。
4.2 createuser()新建用戶:
先根據提示輸入用戶名,再判斷此用戶名是否已存在,若存在則重新輸入,若沒有,則用戶創建成功。函數結束。? ? ? ????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
4.3intlist()初始化空閑區鏈表以及文件索引鏈:
本函數在程序用運行后,對空閑區進行初始化。
4.4 newdrec()新建目錄:
輸入參數為要建立的類型,f為文件,d為文件夾。并輸入權限(0只讀,1讀寫)。在創建目錄時,并檢測是否有重名的目錄,若有則創建失敗;沒有重名的就在空閑區添加,否則,直接在文件中添加。
4.5 lsfile()列出當前路徑下的文件:
查找當前目錄下的各種文件并列舉出來。
4.6 back()目錄后退
檢測當前是否處于根目錄下,不是則返回到上一目錄;若當前處于根目錄下,則無法后退。
五、最終結果分析
1:磁盤格式化后進入登錄界面
2:先用超級管理員登陸后顯示幫助信息并創建用戶
3用戶登陸后并列出當前目錄下的內容
4.打開文件
5.關閉文件
6,當前路徑
六、設計體會
?第一、操作系統這次課程設計讓我學習到了很多計算機方面的知識,在一定程度上對以前的所學知識進一步加深,更讓我有了一個系統的了解。操作系統是計算機的軟件的系統的基礎,具有一定平臺性。掌握好這門課程對我們以后學習計算機知識有一個很大的幫助。
第二、本次課程設計讓我明白了編寫程序一定要動手去寫代碼,進行實際操作方可進取得一定性的進步,還要進行與組內人員之間的團結與協作。共同學習,共同克服困難,取得共同進步。
七、附錄
? 源代碼:
#include <stdio.h> #include <string.h> #include <process.h> #include <malloc.h> #include <stdlib.h> #include <conio.h> #include <stdlib.h> #include <iostream> #define getb(type) (type*)malloc(sizeof(type)) using namespace std; int usernowpride;//全局變量,當前用戶類型 char usernowname[10];//全局變量,當前用戶名 int nowlevel; //全局變量,當前目錄層次 char usernowpath[200] = "\\\0"//用戶類型定義 struct user {char name[10];//用戶名int pride;//用戶權限,1為管理員,0為普通用戶char pass[10];//用戶密碼 };//定義空白區項 struct freeb {int number;struct freeb * next; };struct freeb *fblk=NULL;//全局變量,系統空閑區鏈//定義文件打開項struct fileb {int parent;//所在父節點char name[15];//文件名int pride;//讀寫權限,0只讀,1讀寫int? rex;//讀寫狀態,0為沒有,1讀2寫struct fileb * next; };struct fileb *flink=NULL;//全局變量,系統打開文件鏈//定義文件索引項 struct findex {char name[15];int number;int parent;char kind;struct findex * next; };struct findex *fidx=NULL;//全局變量,文件索引鏈//定義目錄表項 struct dreitem {char name[25];//目錄或者文件名稱int share; //共享數int parent;//上層目錄int pride;//文件操作權限,0只讀,1讀寫int empty;//是否是空閑塊,0為空閑塊,1為非空char kind;//類型,文件為f,目錄為d };#include"FSMain.h"//新建用戶 bool createuser() {struct user newuser;char name[10];char pass[10];int pride;if(usernowpride!=1){cout<<"當前用戶沒有新建用戶的權限\n";return false;}FILE *fp;if((fp = fopen("user","ab+"))==NULL){cout<<"用戶表打開失敗\n";return false;}else{cout<<"請輸入用戶名:";cin>>name;if(strcmp(name,"root")==0){printf("Error:此為超級管理員\n");return false;}rewind(fp);while(!feof(fp)){fread(&newuser,sizeof(struct user),1,fp);if(strcmp(newuser.name,name)==0){cout<<"該用戶名已經存在\n";fclose(fp);return false;}}cout<<"請輸入用戶密碼:";cin>>pass;cout<<"請輸入用戶權限(0普通用戶,1管理員):";cin>>pride;strcpy(newuser.name,name);strcpy(newuser.pass,pass);newuser.pride=pride; //?????FILE fpuser;//為新建用戶建立用戶目錄文件if(!fopen(newuser.name,"ab+")){cout<<"用戶創建失敗\n";//如創建失敗則把已經建立的用戶目錄刪除char cmd[20] = "DEL ";strcat(cmd,newuser.name);system(cmd);fclose(fp);return false;}if(!fwrite(&newuser,sizeof(struct user),1,fp)){cout<<"創建失敗\n";fclose(fp);return false;}else{cout<<"用戶創建成功\n";fclose(fp);return true;}} }//用戶登陸bool login() {char name[10];char pass[10];cout<<"\n\t\t\t○用戶名:";cin>>name;cout<<"\t\t\t○密? 碼:";cin>>pass;if((strcmp("root",name)==0)&&(strcmp("123456",pass)==0))//管理員{usernowpride = 1;strcpy(usernowname,"root");return true;}FILE *fp=NULL;struct user actuser;if(!(fp=fopen("user","ab+"))){cout<<"Error:用戶表錯誤\n";return false;}rewind(fp);while(!feof(fp)){fread(&actuser,sizeof(struct user),1,fp);if((strcmp(actuser.name,name)==0)&&(strcmp(actuser.pass,pass)==0)){usernowpride = actuser.pride;//記錄當前用戶的權限strcpy(usernowname,actuser.name);//記錄當前用戶的主路徑nowlevel=-1;//記錄當前目錄層次fclose(fp);//設置路徑if(strcmp(usernowpath,"\\")!=0)????????????? //不是根目錄就添加斜杠{strcat(usernowpath,"\\");}strcat(usernowpath,usernowname);return true;}}cout<<"Error:用戶名或密碼無效,請核對后再輸入\n";fclose(fp);return false;}//初始化空閑區鏈表以及文件索引鏈void intlist(){//-----------------------------清空各鏈表fidx=NULL;fblk=NULL;//-----------------------------int i=0;struct dreitem dnow;FILE *fp;if(!(fp=fopen(usernowname,"rb"))){cout<<"Error:打開用戶目錄失敗\n";return ;}else{int enp;int sp;fseek(fp,0,2);enp=ftell(fp);fseek(fp,0,0);sp=ftell(fp);if(sp==enp) return;while(!feof(fp)){fread(&dnow,sizeof(struct dreitem),1,fp);if(dnow.empty==0){//把空閑區連到空閑鏈表中struct freeb *fb =getb(struct freeb);fb->number=i;fb->next=NULL;struct freeb *p=fblk;if(p==NULL){fblk=getb(struct freeb);fblk->next=fb;}else{while(p->next!=NULL){p=p->next;}p->next=fb;}}else{//建立索引表struct findex *fi =(struct findex*)malloc(sizeof(struct findex));strcpy(fi->name,dnow.name);fi->number=i;fi->kind=dnow.kind;fi->parent=dnow.parent;fi->next=NULL;struct findex *pi=fidx;if(pi==NULL){fidx=getb(struct findex);fidx->next=fi;}else{while(pi->next!=NULL){pi=pi->next;}pi->next=fi;}}i++;}fclose(fp);return ;}}//新建目錄void newdrec(char ch)//輸入參數為要建立的類型,f為文件,d為文件夾{struct dreitem dnow;char name[15];char pride;//權限,0只讀,1讀寫int i;//記錄空閑區區號bool cancrd = true;//用于判斷是否有重名文件cout<<"請輸入名字:";fflush(stdin);scanf("%s",&name);//判斷是否已經存在相同名字的文件或者目錄struct findex *fi=fidx;while(fi){if((strcmp(fi->name,name)==0)&&(fi->parent==nowlevel)&&(fi->kind==ch)){cout<<"Error:此文件或者目錄已經存在\n";cancrd=false;break;}fi=fi->next;}if(!cancrd) return;cout<<"請輸入權限(0只讀,1讀寫):";cin>>pride;dnow.empty=0;strcpy(dnow.name,name);dnow.parent=nowlevel;if(pride=='0'){dnow.pride=0;}else{dnow.pride=1;}dnow.share=0;dnow.kind=ch;dnow.empty=1;FILE *fp;if(!(fp=fopen(usernowname,"rb+"))){cout<<"錯誤";return ;}else{if(fblk==NULL||fblk->next==NULL)?????? //空閑區沒有就直接在文件添加{fseek(fp,0,2);fwrite(&dnow,sizeof(struct dreitem),1,fp);cout<<"創建成功\n";fclose(fp);return;}else{struct freeb *p=fblk->next;//拿第一個空閑區來存放文件if(p!=NULL){//fblk=p->next;i = p->number;fblk->next=p->next;}free(p);fseek(fp,i*sizeof(struct dreitem),0);fwrite(&dnow,sizeof(struct dreitem),1,fp);cout<<"創建成功\n";fclose(fp);return;}}}//列表當前路徑下的文件void lsfile(){long ep;FILE *fp;struct dreitem drenow;fp=fopen(usernowname,"rb");fseek(fp,0,2);ep=ftell(fp);fseek(fp,0,0);cout<<"Name\tPride\tKind\tShare\tParent\n";while(ep!=ftell(fp)){fread(&drenow,sizeof(struct dreitem),1,fp);if(drenow.parent==nowlevel&&drenow.empty!=0){cout<<drenow.name<<"\t";cout<<drenow.pride<<"\t";cout<<drenow.kind<<"\t";cout<<drenow.share<<"\t";cout<<drenow.parent<<"\n";}}cout<<"文件列表結束\n";fclose(fp);}//目錄后退bool back(){if(nowlevel==-1){cout<<"Error:當前已為用戶根目錄,無法再回退\n";return false;}char name[15];int i;i=nowlevel;struct dreitem drecnow;FILE *fp;fp=fopen(usernowname,"rb");fseek(fp,i*sizeof(struct dreitem),0);fread(&drecnow,sizeof(struct dreitem),1,fp);fclose(fp);strcpy(name,drecnow.name);nowlevel=drecnow.parent;char cc;???????? //檢測'\0'位置int ccidx=0;????????? //記錄最好一個'\'位置int j=0;cc=usernowpath[j];while(cc!='\0'){j++;cc=usernowpath[j];if(cc=='\\'){ccidx=j;}}if(ccidx!=0){usernowpath[ccidx]='\0';}return true;}//進入路徑bool path(char chpath[15]){struct dreitem drenow;char mypath[15];int i=0;strcpy(mypath,chpath);if(strcmp(mypath,"..")==0){if(back()){return true;}else{return false;}}FILE *fp;fp=fopen(usernowname,"rb");while(!feof(fp)){fread(&drenow,sizeof(struct dreitem),1,fp);if((strcmp(drenow.name,mypath)==0)&&(drenow.kind=='d')&&(drenow.parent==nowlevel)){nowlevel=i;fclose(fp);if(strcmp(usernowpath,"\\")!=0)????????????? //不是根目錄就添加斜杠{strcat(usernowpath,"\\");}strcat(usernowpath,mypath);return true;}i++;}fclose(fp);return false;}//進入路徑完整版void intopath(){int tempnl=nowlevel;char tempunp[200];strcpy(tempunp,usernowpath);char wholepath[100];char name[15];cout<<"輸入要進入的路徑:";cin>>wholepath;int i=0;char cc=wholepath[i];while(cc!='\0'){int j=0;name[j]=cc;while(cc!='\0'&&cc!='\\'){name[j]=cc;j++;i++;cc=wholepath[i];}if(i!=0){name[j]='\0';if(!path(name)){cout<<"Error:路徑輸入錯誤,請核對\n";//如果路徑錯誤,則還原nowlevel=tempnl;strcpy(usernowpath,tempunp);return;}}if(cc=='\0') break;i++;cc=wholepath[i];}}//刪除文件,遞歸刪除文件夾和文件夾里面的內容//刪除文件bool remove(int p){bool isfind=false;int i=0;int temp=0;struct dreitem drecnow;FILE *fp;fp=fopen(usernowname,"rb+");long ep;fseek(fp,0,2);ep=ftell(fp);fseek(fp,0,0);while(ep!=ftell(fp)){fread(&drecnow,sizeof(struct dreitem),1,fp);if(drecnow.parent==p){isfind=true;temp=p;remove(i);}i++;}if(!isfind){drecnow.empty=0;strcpy(drecnow.name,"??? ");drecnow.parent=-1;fseek(fp,p*sizeof(struct dreitem),0);fwrite(&drecnow,sizeof(struct dreitem),1,fp);fclose(fp);return true;}else{remove(temp);fclose(fp);return false;}}void del(){char name[15];cout<<"輸入要刪除的文件:";cin>>name;findex *fb=fidx;//用于索引表findex *fi;fileb *fob=flink;//用于已打開文件鏈表if(fb==NULL||fb->next==NULL)//搜索索引表{cout<<"Error:沒有此文件\n";return;}bool isit=true;while(fb!=NULL&&fb->next!=NULL){fi=fb;fb=fb->next;if((strcmp(fb->name,name)==0)&&(fb->parent==nowlevel)){isit=false;if(remove(fb->number)){fi->next=fb->next;free(fb);cout<<"該文件已被刪除\n";return;}}}if(isit){cout<<"Error:沒有此文件\n";}else{cout<<"該文件已被刪除\n";}}//打開文件void openfile(){long ep;int i=0;FILE *fp;struct dreitem drenow;char name[15];cout<<"輸入要打開的文件名:";cin>>name;struct fileb *fb=flink;while(fb!=NULL&&fb->next!=NULL){fb=fb->next;if((strcmp(fb->name,name)==0)&&(fb->parent==nowlevel)){cout<<"Error:該文件已經打開\n";return;}}fp=fopen(usernowname,"rb");?????????????????????? //可用索引節點fseek(fp,0,2);ep=ftell(fp);fseek(fp,0,0);while(ep!=ftell(fp)){fread(&drenow,sizeof(struct dreitem),1,fp);if((strcmp(drenow.name,name)==0)&&(drenow.parent==nowlevel)&&(drenow.kind=='f')){//添加到打開鏈表fileb *pb=getb(struct fileb);strcpy(pb->name,name);pb->parent=nowlevel;pb->next=NULL;pb->rex=0;pb->pride=drenow.pride;if(flink==NULL){flink=getb(struct fileb);flink->next=pb;}else{pb->next=flink->next;flink->next=pb;}cout<<"文件已經打開\n";fclose(fp);//這里是否要更新顯示已打開鏈表return;}i++;}cout<<"Error:當前目錄下無此文件,請核對\n";fclose(fp);}//顯示當前打開文件列表void disfilelist(){if(flink==NULL||flink->next==NULL){cout<<"當前打開文件隊列空\n";return;}else{cout<<"當前打開文件隊列如下:(文件名|父節點|讀寫權限|讀寫狀態)\n";fileb *fb=flink;while(fb!=NULL&&fb->next!=NULL){fb=fb->next;printf("%s|%d|%d|%d->",fb->name,fb->parent,fb->pride,fb->rex);}cout<<"**\n";}}//關閉文件void closefile(){char name[15];cout<<"輸入要關閉的文件:";cin>>name;if(flink==NULL||flink->next==NULL){cout<<"Error:該文件沒有打開\n";return;}fileb *fb=flink;fileb *ffb=NULL;while(fb!=NULL&&fb->next!=NULL){ffb=fb;fb=fb->next;if((strcmp(fb->name,name)==0)&&(fb->parent==nowlevel)){ffb->next=fb->next;free(fb);cout<<"文件已經關閉\n";return;}}cout<<"Error:當前路徑下找不到你要關閉的文件,請確定文件名已經路徑是否正確\n";}//讀寫文件,該文件必須先打開后才可以進行讀寫操作void rwfile(int ch)?????????? //讀寫文件,輸入1為讀文件,輸入2為寫文件{char name[15];cout<<"要操作的文件名:";cin>>name;if(flink==NULL||flink->next==NULL){cout<<"Error:該文件尚未打開\n";???????????????????????? //可以調用文件打開函數,以后先修改return;}fileb *fb=flink;while(fb!=NULL&&fb->next!=NULL){fb=fb->next;if((strcmp(fb->name,name)==0)&&(fb->parent==nowlevel)){//char ch;if(fb->rex!=ch&&fb->rex!=0){if(ch==2){if(fb->pride!=1){cout<<"Error:該文件只讀,沒有寫權限\n";return;}else{cout<<"當前文件正在讀進程,是否終止讀進程進行寫?(y OR n):";}}else{cout<<"當前文件正在寫進程,是否終止寫進程進行讀?(y OR n):";}fflush(stdin);cin>>ch;if(ch=='y'||ch=='Y'){if(ch==2){fb->rex=1;cout<<"文件正在讀...\n";}else{fb->rex=2;cout<<"文件正在寫...\n";}}}else{if(ch==2&&fb->pride!=1){cout<<"Error:該文件只讀,沒有寫權限\n";return;}fb->rex=ch;if(ch==1){cout<<"文件正在讀...\n";}else{cout<<"文件正在寫...\n";}}return;}}}//設置共享void setshare(){cout<<"要共享的文件:";}//顯示當前路徑void dispathlist(){cout<<usernowpath<<endl;}//注銷void logout(){strcpy(usernowname,"? ");nowlevel=-1;fblk=NULL;fidx=NULL;strcpy(usernowpath,"\\");flink=NULL;}//修改用戶類型void setpride(){char name[15];cout<<"輸入用戶名字:";cin>>name;if((strcmp("root",name)==0))//超級用戶{cout<<"Error:超級管理員權限不可以更改\n";return ;}FILE *fp=NULL;struct user actuser;if(!(fp=fopen("user","rb+"))){cout<<"Error:用戶表錯誤\n";return ;}rewind(fp);long np;while(!feof(fp)){np=ftell(fp);fread(&actuser,sizeof(struct user),1,fp);if((strcmp(actuser.name,name)==0)){if(actuser.pride==1){int pp=1;cout<<"該用戶是管理員\n輸入0設置普通用戶:";cin>>pp;if(pp==0){actuser.pride=0;}}else if(actuser.pride==0){int pp=0;cout<<"該用戶是普通用戶\n輸入1設置為管理員:";cin>>pp;{if(pp==1){actuser.pride=1;}}}fseek(fp,np,0);fwrite(&actuser,sizeof(struct user),1,fp);fclose(fp);return;}}}int main(){int choince;while(1){system("cls");while(1){system("cls");printf("\n\n");printf("\t? ***********************************************\n");printf("\t? *????? 多用戶多級目錄文件系統的實現? ?? *\n");printf("\t? ***********************************************\n");printf("\t? + ?????????????????? + \n");printf("\t? + 學號:201358503230? 姓名:田慶 + \n");printf("\t? + +\n");printf("\t? ***********************************************\n");printf("\t?????? *********用│║戶│║登│║錄*********\n");printf("\t? ***********************************************\n");if(login()) break;}if(strcmp(usernowname,"root")==0){system("cls");printf("超級管理員,歡迎你^_^\n");printf("************************************************************************\n");printf("1.新建用戶? 2.刪除用戶? 3.修改用戶? 4.注銷\n");printf("************************************************************************\n");printf(":) ");bool lout=false;while(1){fflush(stdin);scanf("%d",&choince);switch(choince){case 1:createuser();break;case 2:printf("該功能尚未實現:<\n");break;case 3:setpride();break;case 4:char out;printf("真的要注銷嗎?(y OR n):");fflush(stdin);scanf("%c",&out);if(out=='y'||out=='Y'){lout=true;logout();}break;default:printf("Error:錯誤命令\n");break;}printf(":) ");if(lout)break;}}else{intlist();system("cls");cout<<"%s,歡迎你^_^\n"<<usernowname;cout<<"************************************************************************\n";printf("1.文件列表? 2.新建??? 3.進入路徑? 4.刪除??? 5.新建用戶\n");printf("6.打開文件? 7.關閉文件? 8.讀文件?? 9.寫文件?? 10.回退上層\n");printf("11.當前路徑 12.清屏?????? 13.注銷\n");printf("************************************************************************\n");printf(":) ");bool lout=false;while(1){fflush(stdin);scanf("%d",&choince);switch(choince){case 1:lsfile();break;case 2:int cc;printf("1.新建文件夾 2.新建文件");scanf("%d",&cc);if(cc==1){newdrec('d');}if(cc==2){newdrec('f');}intlist();break;case 3:intopath();break;case 4:del();intlist();break;case 5:createuser();break;case 6:openfile();disfilelist();break;case 7:closefile();disfilelist();break;case 8:rwfile(1);break;case 9:rwfile(2);break;case 10:back();break;case 11:dispathlist();break;case 12:system("cls");printf("%s,歡迎你^_^\n",usernowname);printf("************************************************************************\n");printf("1.文件列表? 2.新建??????? 3.進入路徑? 4.刪除??????? 5.新建用戶\n");printf("6.打開文件? 7.關閉文件? 8.讀文件?? 9.寫文件?? 10.回退上層\n");printf("11.當前路徑 12.清屏?????? 13.注銷\n");printf("************************************************************************\n");break;case 13:char out;printf("真的要注銷嗎?(y OR n):");fflush(stdin);scanf("%c",&out);if(out=='y'||out=='Y'){lout=true;logout();}break;default:printf("Error:錯誤命令\n");break;}printf(":) ");if(lout)break;}}}printf("完成\n");return 0;} ?轉發請注明:http://blog.csdn.net/tianqingdezhuanlan/article/details/51344739
源碼下載地址:http://download.csdn.net/download/u013255737/9513460
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的文件系统的设计与实现(操作系统课程设计)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(1979)vue之电商管理系统
- 下一篇: 前端学习(1560):ng-class颜