日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统课程设计报告(文件系统)

發布時間:2023/12/10 windows 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统课程设计报告(文件系统) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.引言

隨著計算機技術的快速發展,在計算機操作系統中,如何優化任務處理效率成為一大難題。通過一個簡單多用戶文件系統設計,加深對文件系統的理解及內部實現。運用多線程的調度盡可能的優化其效率,解決實際問題。

1.1任務要求

B類:用java語言模仿“生產者——消費者”問題
1.通過Java語言中的wait()和notify()命令模擬操作系統中的P/V操作;
2.為每個生產者/消費者產生一個線程,設計正確的同步算法
3.每個生產者和消費者對有界緩沖區進行操作后,即時顯示有界緩沖區的 當前全部內容、當前指針位置和生產者/消費者線程的自定義標識符。
4.生產者和消費者各有兩個以上。
5.多個生產者或多個消費者之間須共享對緩沖區進行操作的函數代碼。

C類:文件系統
設計一個多用戶文件系統,理解文件系統的層次結構,完成基本的文件系統create、open、close、read/write等基本功能,并實現文件保護操作。實現以此為基礎加入自己設計功能的小型文件系統 。

需要解決的問題:
1.如何讓生產者在緩沖區滿時不加數據。
2.如何讓消費者在緩沖區空時不取數據。
3.如何使多個生產者或消費者線程的處理不發生沖突。
4.如何實現對文件系統的保護。
1.2選題
B類:用java語言模仿“生產者——消費者”問題;
C類:文件系統

當前發展概述

所謂多線程的并發運行,其實是指從宏觀上看,各個線程輪流獲得CPU的使用權,分別執行各自的任務。在運行池中,會有多個處于就緒狀態的線程在等待CPU,JAVA虛擬機的一項任務就是負責線程的調度,線程調度是指按照特定機制為多個線程分配CPU的使用權。Java虛擬機采用搶占式調度模型,是指優先讓可運行池中優先級高的線程占用CPU,如果可運行池中的線程優先級相同,那么就隨機選擇一個線程,使其占用CPU。
文件系統是操作系統用于明確存儲設備或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件機構稱為文件管理系統,簡稱文件系統。文件系統由三部分組成:文件系統的接口,對對象操縱和管理的軟件集合,對象及屬性。從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲并對存入的文件進行保護和檢索的系統。具體地說,它負責為用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,當用戶不再使用時撤銷文件等。

可行性分析

對于運用Java語言模仿“生產者——消費者”問題,以及在Java虛擬機上的線程調度問題,以前學習過Java基礎語法,掌握了Java中wait(),notify()等線程處理的方法。
對于設計多用戶文件系統問題,小文件的高度并發訪問性能低。當前很多服務不僅需要大量的大文件訪問,而且需要小文件的并發訪問。文件系統在訪問一個文件時需要多次讀寫和多次網絡來回,因此對低延遲的要求難度較高,需要深入鉆研。

選題意義

在Java虛擬機上,通過運用Java語言模仿“生產者——消費者”問題,可以進一步加深我們對多線程方面知識的理解。這不僅可以鞏固以前java所學的知識,還能進一步打好有關線程知識的基礎。
通過設計一個多用戶的“文件系統”,從中我們能更深理解文件系統的層次結構和內部實現,并可以熟悉文件系統create、open、close、read/write等基本操作,實現文件保護的同時,運用操作系統的所學知識加入自己設計的操作系統,由此實現對文件系統的創新。

2.需求分析與設計

2.1 需求分析

“生產者消費者”問題是研究多線程程序時繞不開的經典問題之一,它描述是有一塊緩沖區作為倉庫,生產者可以將產品放入倉庫,消費者則可以從倉庫中取走產品。解決生產者/消費者問題的方法可分為兩類:(1)采用某種機制保護生產者和消費者之間的同步;(2)在生產者和消費者之間建立一個管道。第一種方式有較高的效率,并且易于實現,代碼的可控制性較好,屬于常用的模式。第二種管道緩沖區不易控制,被傳輸數據對象不易于封裝等,實用性不強。
同步問題核心在于:如何保證同一資源被多個線程并發訪問時的完整性。常用的同步方法是采用信號或加鎖機制,保證資源在任意時刻至多被一個線程訪問。Java語言在多線程編程上實現了完全對象化,提供了對同步機制的良好支持。在Java中一共有五種方法支持同步,其中前四個是同步方法,一個是管道方法。
1.wait() / notify()方法
2.await() / signal()方法
3.BlockingQueue阻塞隊列方法
4.Semaphore方法
5.PipedInputStream / PipedOutputStream
生產者和消費者在同一時間段內共用同一個存儲空間,如下圖所示,生產者向空間里存放數據,而消費者取用數據,如果不加以協調可能會出現以下情況:

存儲空間已滿,而生產者占用著它,消費者等著生產者讓出空間從而去除產品,生產者等著消費者消費產品,從而向空間中添加產品。互相等待,從而發生死鎖。
要實現多用戶文件系統,首先要實現Login用戶登錄,必須登錄成功才能進入文件系統進行相應操作,進入后,通過樹狀展示文件目錄,右側顯示文件夾圖標或這文件圖標,選中節點鼠標右鍵彈出菜單,有新建目錄,新建文件,刪除文件,打開文件,修改文件,并分別實現其功能。

2.2系統框架和流程

“生產者”與”消費者”問題流程圖:

文件系統流程圖:

用戶登錄模塊:

新建文件模塊:

修改文件模塊:

刪除文件模塊:

2.3 系統流程和模塊描述
本系統為多用戶的文件系統,因為是多用戶使用,所以具備登錄系統,注冊用戶的功能,各個用戶之間的文件系統互不干擾,同時又要實現對文件增刪改查的功能。采用二級目錄,第一級為用戶賬號,第二級對應用戶賬號下的文件。
系統采用結構體存儲用戶,文件目錄等內容。
系統大致為一個二級文件系統,可以實現以下幾個功能::login(用戶登錄)、view(查看文件內容)、create(新建文件)、delete(刪除文件)、modify(修改文件)、dir(列文件目錄)。

用戶登錄模塊:
首先,剛進入系統,還不會有文件系統,顯示用戶登錄模塊。系統分區后,系統初始化要完成文件系統的建立。驗證用戶的身份,輸入用戶名和密碼,登錄成功后會初始化當前用戶文件系統中的信息。如果用戶沒有通過身份驗證,則提示登錄失敗,退出系統。

創建文件模塊:
在用戶登錄后才具有的功能,查找一個未使用的文件塊用來存放用戶的文件信息,構建一個文件系統的元素放入找到的文件塊中。新建文件時要求輸入文件名稱,當文件名稱不與已存在的文件目錄中名稱沖突時,同時文件不發生越界,則文件創建成功。

刪除文件模塊:
在文件目錄中選中要刪除的文件,若文件存在則繼續判斷文件是否被鎖定。如果文件正使用處于鎖定狀態則刪除失敗。若處于非鎖定狀態,則刪除成功。

查看文件模塊:
首先要接受查看文件的名稱,查詢文件是否存在,如果不存在,則無法查看文件。若文件存在,則創建查看文件的結點并復制文件信息,即可查看到用戶文件的數據部分,將數據顯示到界面。

3.數據結構

文件系統數據結構:

typedef struct UFD //存儲文件信息 {char name[10]; //文件名int attribute; //屬性int length; //長度int a[10]; //為文件本身分配10個空間int *p1; //一級索引,100個空間int (*p2)[100]; //二級索引,100*100個空間struct UFD *next; }UFD; typedef struct DIR //存儲目錄信息 {DIR* above; //上一結點char name[10];int length;DIR *next; //下一結點UFD *File_head; //此目錄下的文件指針DIR *Dir_head; //此目錄下目錄鏈表指針 }DIR; class test //定義管理用戶目錄的類 {DIR *now; //當前目錄UFD *Fhead; //文件的頭結點DIR *Dhead; //根目錄的目錄鏈頭結點char code[10]; //密碼char name[10]; //用戶名int length; //用戶空間大小int status; //是否獲得空間 public:void set_status(int);int dele_user();int dis_file(); //顯示文件所占外存塊號int dis_dir(DIR *d);//當前路徑int get_length();char const *get_name();char const *get_code();int get_status();int set_user(char *,char *);//設置用戶名與密碼DIR *get_now();int dele_file(UFD *f); //刪除文件int dele_dir(DIR*); //刪除目錄Test(); //構造~test(); //析構int goback(); //返回上級int dis_now(); //顯示當前目錄int new_file();int new_dir();int open_dir();int open_file();int first_dele_file(); //刪除文件的前部分工作int first_dele_dir(); //刪除目錄的前部分工作int set_code(); }; class Cdisk{ //用戶類 public:Test user[5]; //用戶個數最多為5char code[10];int dis_disk();int first_dele_user();int dele_user(int);int new_user(); //查看當前用戶與外存空間使用情況,后創建新用戶int set_code(); //設置新密碼int login(char); //登陸Cdisk();virtual~Cdisk(); //虛函數,析構 };

4.關鍵技術

Java實現生產者與消費者問題:
生產者消費者問題,描述一組生產者向一組消費者提供產品信息。它們會共享一個有界的緩沖區,生產者向其放入產品信息,消費者從中取出產品信息。只要當前緩沖區未滿,生產者就可放入產品消息,只要緩沖區中存有數據,消費者便可提取。
應滿足以下兩個同步條件:
1.僅僅在有緩沖池中至少有一個緩沖區已存入消息后,消費者才從中提取消息,否則消費者必須要等待。
2.僅僅有緩沖池至少有一個緩沖區為空,生產者才能將消息放入緩沖區,否則生產者必須等待。
使用
1.創建生產者,負責生產產品信息

2.創建消費者,負責消費信息

3.消費者類

4.生產者類


5.核心代碼

public class ProductiveConsumption {private int front=0; //隊頭private int next=0; //隊尾private int bufferLength; //緩沖區大小private String buffer[]; //緩沖區private int emptyNum;public ProductiveConsumption(int bufferLength){this.bufferLength=bufferLength;buffer=new String[bufferLength];emptyNum=bufferLength;}//生產public synchronized void produce(String data){System.out.println("生產前,空緩沖區數目-----------"+emptyNum);System.out.println("***生產者正在生產"+data);while(full()){System.out.println("*****緩沖池已滿,生產等待");try{this.wait();}catch (InterruptedException e){e.printStackTrace();}}this.notify();buffer[next]=data;next=(next+1)%bufferLength;System.out.println("****生產者成功生產:"+data);emptyNum--;System.out.println("生產后,空緩沖區數目-----------"+emptyNum);}//消費public synchronized void consum(){System.out.println("消費前,空緩沖區數目-----------"+emptyNum);while (empty()){System.out.println("*****緩沖池為空,消費等待");try{this.wait();} catch (InterruptedException e){e.printStackTrace();}}System.out.println("***消費者正在消費"+buffer[front]);this.notify();System.out.println("****消費者成功消費:"+buffer[front]);front=(front+1)%bufferLength;emptyNum++;System.out.println("消費后,空緩沖區數目-----------"+emptyNum);}//緩沖區是否已滿public boolean full(){if(emptyNum==0){return true;}return false;}//緩沖區是否為空public boolean empty(){if(bufferLength==emptyNum){return true;}return false;}}

使用synchronized對存儲加鎖,然后用objec原生的wait()和notify()做同步。通過加鎖,限制同一時刻只能有一個讀或寫。
Wait()方法:當緩沖區已滿或空時,生產者/消費者線程就會停止自己的執行,放棄鎖,使自己處于等待狀態,讓其他線程執行。
Notify()方法:但生產者/消費者向緩沖區放入/取出一個產品時,向其他等待的線程發出可執行的通知,同時放棄鎖,使自己處于等待狀態。
6.測試類

文件系統:
空閑空間管理采用位示圖法,文件目錄采用多級目錄使用,采用索引節點結構。
功能模塊
1.創建文件

p=new UFD; //首先開辟一個新的文件結構體 在根目錄鏈中檢查判斷文件是否重名 cout<<"請輸入建立的文件名:";cin>>p->name;if(now==0) //根目錄下的文件鏈f=Fhead;else //當前目錄下的文件鏈f=now->File_head;while(f!=0) //檢查是否文件重名{if(!strcmp(p->name,f->name)){cout<<"此文件已存在!"<<endl;return 0; //退出}f=f->next;} 若空間不足,則無法執行創建操作: if(p->length>disk_empty) //空間不足{cout<<"文件太大,空間不足,當前空間為:"<<disk_empty<<endl;delete p;return 0;} 若空間剩余,則通過位示圖法為其分配空間:disk_empty=disk_empty-p->length; //剩余空閑盤塊//for(i=0;i<p->length&&i<10;i++) //文件較小時,直接地址,文件數據盤塊號for(j;j<10000;j++) //位示圖法if(disk_block[j]==0) //空閑{p->a[i]=j; //得到此空間disk_block[j]=1; //標記為已分配出去j++;break; //跳出尋找,為文件分配下一空間}

2.刪除文件

int test::first_dele_file() //刪除文件的前面工作 {char temp[10],a[5];cout<<"你要刪除的文件名:"<<endl;cin>>temp;UFD *f=Fhead; //數據文件頭指針UFD *above=0;if(now!=0)f=now->File_head; //當前目錄下的數據文件while(f!=0){if(!strcmp(f->name,temp))break; //找到,跳出above=f; //標記第一個文件f=f->next;}if(f==0){cout<<"此文件不存在"<<endl;return 0;}cout<<"確定刪除"<<f->name<<"文件嗎?按0確定,其他鍵取消"<<endl;cin>>a;if(a[0]!='0'){cout<<"已取消刪除文件。"<<endl;return 0;}disk_empty+=f->length; //回收此數據文件的空間大小if(now==0) //根目錄{if(f==Fhead)Fhead=Fhead->next;elseabove->next=f->next;}else{DIR *d=now;while(d!=0){d->length=f->length;d=d->above;}if(f==now->File_head)now->File_head=now->File_head->next;elseabove->next=f->next;}length-=f->length;this->dele_file(f);cout<<"刪除成功"<<endl;return 1; }int test::dele_file(UFD *f) //具體實現刪除文件 {int i=0,m;for(i=0;i<10&&i<f->length;i++) //回收文件具體空間,重置空閑{m=f->a[i];disk_block[m]=0;}if(f->p1!=0) //回收一級索引{for(i=10;i<110&&i<f->length;i++){m=f->p1[i-10];disk_block[m]=0;}delete[](f->p1);}if(f->p2!=0) //回收二級索引{for(i=110;i<f->length;i++){m=(f->p2)[(i-110)/100][(i-110)%100];disk_block[m]=0;}delete[](f->p2);delete f;}f=0; //要刪除的文件為空了return 1; }

3.打開文件:

UFD *f=Fhead; //文件頭指針if(now!=0)f=now->File_head; //指向文件while(f!=0){if(!strcmp(f->name,n)){cout<<"文件打開成功"<<endl;return 1;}f=f->next;}cout<<"當前目錄無此文件"<<endl;

4.顯示當前目錄:

int test::dis_now() //顯示當前目錄 {DIR *d=Dhead;UFD *f=Fhead;if(now!=0){d=now->Dir_head; //當前目錄下的目錄鏈f=now->File_head;}if(d==0&&f==0){cout<<"當前目錄為空"<<endl;return 0;}cout<<"當前目錄大小:";if(now==0)cout<<length;elsecout<<now->length;cout<<endl;if(d==0)cout<<"當前目錄下沒有目錄"<<endl;else{cout<<"當前目錄下包含如下目錄:"<<endl;cout<<setw(14)<<"目錄名稱"<<setw(14)<<"目錄大小"<<endl;while(d!=0){cout<<setw(14)<<d->name<<setw(14)<<d->length<<endl;d=d->next;}}if(f==0)cout<<"當前目錄下沒有文件"<<endl;else{cout<<"當前目錄下包含如下文件:"<<endl;cout<<setw(14)<<"文件名稱"<<setw(14)<<"文件大小"<<setw(14)<<"文件屬性"<<endl;while(f!=0){cout<<setw(14)<<f->name<<setw(14)<<f->length<<setw(14)<<f->attribute<<endl;f=f->next;}}return 1; }

5.運行結果

5.1 運行環境
Windows x64
CPU2.8GHZ,8GB內存
Dev c++5.11編譯器,idea(java)
5.2 服務模式
5.3 運行結果
5.3.1 系統主界面
Java模擬生產者與消費者的系統界面

5.3.2 多用戶文件系統
系統首頁
登錄模塊:可選擇管理員模式和用戶登錄

管理員模式:

可在管理員模式創建系統用戶,刪除用戶,查看當前用戶。
用戶模式:

用戶模式可創建文件,刪除文件,創建目錄,刪除目錄,打開目錄,返回上一層目錄,查看當前目錄,修改密碼,查看文件。
創建文件:

創建目錄:

打開目錄:

查看當前目錄:

直接查看文件:

刪除目錄:

刪除文件:

6.調試和改進

在文件系統設計中,為了減少檢索文件訪問的物理塊的數量,文件系統把文件目錄項中的文件名和其他管理信息分開,后者單獨組成一定長度的數據結構,即為索引節點。把文件控制塊的內容與索引節點分開,這樣加快了目錄檢索速度,還便于實現文件共享,有利于系統的控制和管理。

7.心得和結論

7.1結論和體會

通過這次操作系統課程設計,進一步加深了我對文件屬性,文件操作的認識,在文件系統的設計中,難點應該是文件目錄的管理,其中文件控制塊和索引節點結構起了重要作用。文件控制塊中,包含了文件使用,文件管理等信息。在系統中查找文件時,根據文件名找到控制塊,再通過控制塊獲取到文件信息。
在實現java模擬生產者與消費者問題上,使用synchronized對存儲加鎖,來實現同步機制,進一步理解wait()和notify的方法應用,只要java類擁有這兩個辦法,就可為任何對象實現同步機制。

7.2進一步改進方向

設計文件系統時,為了便于實現,對文件讀寫做了簡化,在執行讀寫命令時,只修改讀寫的指針,并未真正進行讀寫操作,因此未來需要完善讀寫操作。還有要有文件保護措施,在每次打開文件時,應再次設置保護級別,便可有二級保護。

7.3 分析設計方案對系統安全的影響

在文件系統中,增加了用戶和管理員的密碼管理,通過密碼的保護來實現多用戶登錄,多用戶使用各自的控制塊管理文件。
主要參考文獻
[1]張堯學,宋虹,張高,《計算機操作系統教程》[M].清華大學出版社,2013.
[2] 湯小丹,梁紅兵,哲鳳屏,湯子瀛,《計算機操作系統》[M].西安電子科技大學出版社,2014.
[3]王育勤,等,《計算機操作系統》,北京交通大學出版社,2004
[4]倪光南.?Linux影響軟件界走向,成最熱門話題
[5]倪光南.?Linux影響軟件界走向,成最熱門話題

文件系統源代碼cpp文件

#include<string.h> #include<stdlib.h> #include<iostream.h> #include<iomanip.h> #if _MSC_VER>1000 #pragma once #endif //_MSC_VER>1000extern int disk_block[10000]; extern int disk_empty;typedef struct PCB //存儲文件信息 {char name[10]; //文件名int attribute; //屬性int length; //長度int a[10]; //為文件本身分配10個空間int *p1; //一級索引,100個空間int (*p2)[100]; //二級索引,100*100個空間struct PCB *next; }PCB;typedef struct DIR //存儲目錄信息 {char name[20];int length;DIR* above; //上一結點DIR *next; //下一結點PCB *File_head; //此目錄下的文件指針DIR *Dir_head; //此目錄下目錄鏈表指針 }DIR;class test //定義管理用戶目錄的類 {DIR *now; //當前目錄PCB *Fhead; //文件的頭結點DIR *Dhead; //根目錄的目錄鏈頭結點char code[10]; //密碼char name[10]; //用戶名int length; //用戶空間大小int status; //是否獲得空間public:void set_status(int);int dele_user();int dis_file(); //顯示文件所占外存塊號int dis_dir(DIR *d);//當前路徑int get_length();char const *get_name();char const *get_code();int get_status();int set_user(char *,char *);//設置用戶名與密碼DIR *get_now();int dele_file(PCB *f); //刪除文件int dele_dir(DIR*); //刪除目錄test(); //構造~test(); //析構int goback(); //返回上級int dis_now(); //顯示當前目錄int createfile();int new_dir();int open_dir();int open_file();int first_dele_file(); //刪除文件的前部分工作int first_dele_dir(); //刪除目錄的前部分工作int set_code(); };class Cdisk{ //用戶類 public:test user[3]; //用戶個數 char code[10];int dis_disk();int first_dele_user();int dele_user(int);int createuser(); //查看當前用戶與外存空間使用情況,后創建新用戶int set_code(); //設置新密碼int login(char); //登錄 Cdisk();virtual~Cdisk(); //虛函數,析構 };int disk_block[10000]; int disk_empty;Cdisk::Cdisk() //管理磁盤的類,構造函數 {int i=0;char code[10]="123456";for(i=0;i<10000;i++) //初始化所有磁盤塊為空閑disk_block[i]=0;//this->user[0].set_user("student","123");//默認一個用戶disk_empty=10000;cout.setf(ios::left); //設置輸出方式 }Cdisk::~Cdisk() //析構 { }int Cdisk::dele_user(int i) //Cdisk類dele_user的構造 {test C;C=user[i];user[i].dele_user(); //調用Cuse類的成員函數 int dele_user()return 1; }int Cdisk::dis_disk() //檢查磁盤信息 {int i=0;cout<<setw(14)<<"用戶名"<<setw(14)<<"占用空間大小"<<endl;for(i=0;i<3;i++)if(user[i].get_status()==1) //存在的用戶的信息cout<<setw(14)<<user[i].get_name()<<setw(14)<<user[i].get_length()<<endl;cout<<"已用空間:"<<10000-disk_empty<<endl<<"剩余空間:"<<disk_empty<<endl;return 1; }int Cdisk::login(char b) //登錄 {char n[10],c[10];int i;if(b=='1'){cout<<"用戶:管理員 密碼:默認\n"<<endl;system("pause");return 1;}else{if(!user[0].get_status()) //當前不存在用戶{i=0;cout<<"未注冊用戶,請注冊用戶!"<<endl;user[i].set_status(1); //為新用戶分配權利cout<<"請輸入用戶名:"<<endl;cin>>n;cout<<"請輸入密碼:"<<endl;cin>>c;user[i].set_user(n,c); //調用Cuse的成員函數,傳遞用戶名與密碼cout<<"創建用戶成功!"<<endl;return i;}else{cout<<"用戶名:";cin>>n;cout<<"密碼:";cin>>c;cout<<endl;for(i=0;i<3;i++) //查找是否存在此用戶{if(user[i].get_status()) //存在方比較if(!strcmp(n,user[i].get_name())) //相等時為0,此判斷為匹配if(!strcmp(c,user[i].get_code())) //密碼匹配{cout<<"登錄成功!"<<endl;cout<<"歡迎"<<user[i].get_name()<<"登錄"<<endl;return i;}else{cout<<"密碼錯誤"<<endl;return -1;}}cout<<"此用戶不存在!"<<endl;return -1;}} }int Cdisk::set_code() //設置新密碼 {char temp1[10],temp2[10];cout<<"請輸入原密碼"<<endl;cin>>temp1;if(strcmp(temp1,code)) //無疑是針對當前用戶進行操作,故直接code{cout<<"原密碼錯誤!"<<endl;return 0;}while(1){cout<<"請輸入新密碼:"<<endl;cin>>temp1;cout<<"請再次輸入新密碼:"<<endl;cin>>temp2;if(strcmp(temp1,temp2)){cout<<"兩次密碼不相同,請重輸!"<<endl;break;}cout<<"密碼設置成功!"<<endl;strcpy(code,temp1); //保存新密碼break;}return 1; }int Cdisk::createuser() //準備創建新用戶 {char n[10],c[10];int i=0,j;for(i=0;i<3;i++)if(user[i].get_status()==0) //是否有此用戶,此尚未存在break;if(i==3){cout<<"已經達到最大用戶3個,不能再創建!"<<endl;return 0;}user[i].set_status(1); //為新用戶分配權利cout<<"請輸入用戶名:"<<endl;cin>>n;if(i>0) //已有其它用戶存在{for(j=0;j<i-1;j++)if(!strcmp(user[j].get_name(),n)){cout<<"此用戶名已存在!"<<endl;return 0;}}cout<<"請輸入密碼:"<<endl;cin>>c;user[i].set_user(n,c); //調用Cuse的成員函數,傳遞用戶名與密碼cout<<"用戶創建成功!"<<endl;return 1; }int Cdisk::first_dele_user() //刪除用戶 {char n[10],c;int i;cout<<"請輸入你要刪除的用戶名"<<endl;cin>>n;for(i=0;i<3;i++) //在查找用戶的同時,得到用戶序號iif(!strcmp(user[i].get_name(),n)&&user[i].get_status())break; //找到,跳出if(i==3){cout<<"出錯,此用戶不存在!"<<endl;return 0;}cout<<"確認刪除此用戶?確認Y,取消任意鍵"<<endl;cin>>c;if(c!='Y'&&c!='y'){cout<<"已經取消刪除!"<<endl;return 0;}this->dele_user(i);cout<<"用戶刪除成功"<<endl;return 1; }test::test() //構造函數,初始化成員 {status=0; //用戶權利,即是否被創建標記length=0; //空間now=0; //當前目錄Fhead=0; //文件Dhead=0; //目錄 }test::~test() //析構,清除程序占用的內存 {disk_empty+=length;length=0;PCB *f=Fhead;DIR *d=Dhead;while(f!=0) //文件{if(f->next==0){this->dele_file(f);f=0;break;}while(f->next->next!=0)f=f->next;this->dele_file(f->next);f->next=0;f=Fhead;}while(d!=0) //目錄{if(d->next==0){this->dele_dir(d);d=0;break;}while(d->next->next!=0)d=d->next;this->dele_dir(d->next);d->next=0;d=Dhead;} }int test::createfile() //建立新文件 {int i=0,j=0;PCB *f,*p=0;DIR *D;p=new PCB; //開辟一個新的文件結構體if(p==0){cout<<"無可用內存空間,創建文件失敗!"<<endl;return 1;}cout<<"請輸入建立的文件名:";cin>>p->name;if(now==0) //根目錄下的文件鏈f=Fhead;else //當前目錄下的文件鏈f=now->File_head;while(f!=0) //檢查是否文件重名{if(!strcmp(p->name,f->name)){cout<<"此文件已存在!"<<endl;return 0; //退出}f=f->next;}cout<<"\n"<<"長度:";cin>>p->length;cout<<"\n"<<"屬性(0:只讀,1:讀寫):";cin>>p->attribute;cout<<endl;if(p->length>disk_empty) //空間不足{cout<<"文件太大,空間不足,當前空間為:"<<disk_empty<<endl;delete p;return 0;}disk_empty=disk_empty-p->length; //剩余空閑盤塊//for(i=0;i<p->length&&i<10;i++) //文件較小時,直接地址,文件數據盤塊號for(j;j<10000;j++) if(disk_block[j]==0) //空閑{p->a[i]=j; //得到此空間disk_block[j]=1; //標記為已分配出去j++;break; //跳出尋找,為文件分配下一空間}p->p1=0; //一級索引p->p2=0; //二級索引if(p->length>10) //超過10,用一級索引{p->p1=new int[100]; //為一級索引分配100個空間for(i=10;i<p->length&&i<110;i++)for(j;j<10000;j++) //j,繼續前面的值if(disk_block[j]==0){(p->p1)[i-10]=j;disk_block[j]=1;j++;break;}if(p->length>110) //超過110,得用二級索引{p->p2=new int[100][100]; //在一級索引的基礎上,2維for(i=110;i<p->length;i++)for(j;j<10000;j++) //j,繼續前面的值if(disk_block[j]==0){int m=(i-110)/100; //行int k=(i-110)%100; //列p->p2[m][k]=j;disk_block[j]=1;j++;break;}}}if(now==0) //根目錄下的文件{p->next=Fhead; //后繼結點指向頭,即新指點在前Fhead=p; //新結點在頭}else{p->next=now->File_head;now->File_head=p;}length+=p->length; //用戶總空間大小增加if(now!=0) //子目錄下空間大小增加{now->length+=p->length;D=now->above; //上一級目錄while(D!=0) //上級目錄(根目錄已實現)空間增加{D->length+=p->length;D=D->above; //逐級向上}}return 0; }int test::new_dir() //建立新目錄 {DIR *p,*h;cout<<"請輸入新目錄的名字:"<<endl;p=new DIR;cin>>p->name; //目錄名p->Dir_head=0; //目錄下的目錄鏈為空p->length=0; //p->File_head=0; //目錄下的文件為空if(now==0) //當前為主目錄h=Dhead; //第一次時,h=0;指向目錄鏈elseh=now->Dir_head;//當前的目錄鏈while(h!=0) //此目錄下存在其它子目錄{if(!strcmp(h->name,p->name)){cout<<"此目錄已存在!"<<endl;return 0;}h=h->next;}if(now==0) //當前為主目錄{p->above=0; //主目錄里目錄的上一結點為0p->next=Dhead; //把原目錄接入新目錄后面(Dhead初始為0)Dhead=p; //Dhead始終指向最新目錄結點}else{p->above=now; //當前目錄為新目錄的上一結點p->next=now->Dir_head; //反序插入新目錄now->Dir_head=p; //更新目錄鏈}cout<<"目錄創建成功"<<endl;return 1; }int test::goback() //向上返回 {if(now==0){cout<<"已是主目錄,不能向上!"<<endl;return 0;}now=now->above; //上一結點return 1; }int test::open_dir() //打開目錄 {char name[10];DIR *p;if(now==0) //當前主目錄p=Dhead;elsep=now->Dir_head; //p指向目錄鏈cout<<"請輸入你要打開的目錄名:"<<endl;cin>>name;//int flag=0;while(p!=0){if(strcmp(p->name,name)==0){now=p; //找到目錄,now標記return 1;}p=p->next;}cout<<"當前沒此目錄"<<endl;return 0; }int test::first_dele_file() //刪除文件的前面工作 {char temp[10],a[5];cout<<"你要刪除的文件名:"<<endl;cin>>temp;PCB *f=Fhead; //數據文件頭指針PCB *above=0;if(now!=0)f=now->File_head; //當前目錄下的數據文件while(f!=0){if(!strcmp(f->name,temp))break; //找到,跳出above=f; //標記第一個文件f=f->next;}if(f==0){cout<<"此文件不存在"<<endl;return 0;}cout<<"確定刪除"<<f->name<<"文件嗎?按0確定,其他鍵取消"<<endl;cin>>a;if(a[0]!='0'){cout<<"已取消刪除文件。"<<endl;return 0;}disk_empty+=f->length; //回收此數據文件的空間大小if(now==0) //根目錄{if(f==Fhead)Fhead=Fhead->next;elseabove->next=f->next;}else{DIR *d=now;while(d!=0){d->length=f->length;d=d->above;}if(f==now->File_head)now->File_head=now->File_head->next;elseabove->next=f->next;}length-=f->length;this->dele_file(f);cout<<"刪除成功"<<endl;return 1; }int test::dele_file(PCB *f) //具體實現刪除文件 {int i=0,m;for(i=0;i<10&&i<f->length;i++) //回收文件具體空間,重置空閑{m=f->a[i];disk_block[m]=0;}if(f->p1!=0) //回收一級索引{for(i=10;i<110&&i<f->length;i++){m=f->p1[i-10];disk_block[m]=0;}delete[](f->p1);}if(f->p2!=0) //回收二級索引{for(i=110;i<f->length;i++){m=(f->p2)[(i-110)/100][(i-110)%100];disk_block[m]=0;}delete[](f->p2);delete f;}f=0; //要刪除的文件為空了return 1; }int test::first_dele_dir() //刪除目錄的前奏 {char n[10];char c;DIR *p,*above=0;p=Dhead; //指向根目錄下的目錄鏈if(now!=0)p=now->Dir_head; //指向當前目錄下的目錄鏈cout<<"要刪除的目錄名:"<<endl;cin>>n;while(p!=0){if(!strcmp(p->name,n))break; //找到要刪除的目錄,跳出above=p; //保存前一結點p=p->next;}if(p==0){cout<<"沒有這個目錄!"<<endl;return 0;}cout<<"確定刪除當前目錄及此目標上的所有信息嗎?按0確定,其他鍵取消"<<endl;cin>>c;if(c!='0')return 0;disk_empty+=p->length; //回收磁盤空間if(now==0){if(p==Dhead) //如果是根目錄下頭結點,直接移動DheadDhead=Dhead->next;elseabove->next=p->next;//中間抽掉目標}else{if(p==now->Dir_head)now->Dir_head=now->Dir_head->next;elseabove->next=p->next;above=now; //當前目錄while(above!=0){above->length-=p->length;//用above標記當前目錄,進行大小更新above=above->above; //向上一級}}length-=p->length; //根目錄大小更新this->dele_dir(p);p=0;cout<<"刪除成功!"<<endl;return 1; }int test::dele_dir(DIR *p) //具體實現刪除目錄的工作 {int flag=0;DIR *d=p->Dir_head; //當前目錄下的目錄鏈表PCB *f=p->File_head; //當前目錄下的文件鏈if(f!=0){while(p->File_head->next!=0)//刪除目錄里的文件{f=p->File_head;while(f->next->next!=0)f=f->next;this->dele_file(f->next);f->next=0;}if(p->File_head->next==0){this->dele_file(p->File_head); //刪除頭文件p->File_head=0;}}if(d!=0) //刪除目錄下的目錄{while(p->Dir_head->next!=0){d=p->Dir_head;while(d->next->next!=0)d=d->next;this->dele_dir(d->next);d->next=0;}if(p->Dir_head->next==0){this->dele_dir(p->Dir_head);//刪除目錄鏈頭結點p->Dir_head=0;}}delete p; //釋放p占用的內存p=0; //置0return 1; }int test::dis_now() //顯示當前目錄 {DIR *d=Dhead;PCB *f=Fhead;if(now!=0){d=now->Dir_head; //當前目錄下的目錄鏈f=now->File_head;}if(d==0&&f==0){cout<<"當前目錄為空"<<endl;return 0;}cout<<"當前目錄大小:";if(now==0)cout<<length;elsecout<<now->length;cout<<endl;if(d==0)cout<<"當前目錄下沒有目錄"<<endl;else{cout<<"當前目錄下包含如下目錄:"<<endl;cout<<setw(14)<<"目錄名稱"<<setw(14)<<"目錄大小"<<endl;while(d!=0){cout<<setw(14)<<d->name<<setw(14)<<d->length<<endl;d=d->next;}}if(f==0)cout<<"當前目錄下沒有文件"<<endl;else{cout<<"當前目錄下包含如下文件:"<<endl;cout<<setw(14)<<"文件名稱"<<setw(14)<<"文件大小"<<setw(14)<<"文件屬性"<<endl;while(f!=0){cout<<setw(14)<<f->name<<setw(14)<<f->length<<setw(14)<<f->attribute<<endl;f=f->next;}}return 1; }int test::open_file() //打開文件 {char n[10];cout<<"請輸入要打開的文件名"<<endl;cin>>n;PCB *f=Fhead; //文件頭指針if(now!=0)f=now->File_head; //指向文件while(f!=0){if(!strcmp(f->name,n)){cout<<"文件打開成功"<<endl;return 1;}f=f->next;}cout<<"當前目錄無此文件"<<endl;return 0; }DIR *test::get_now() //得到當前目錄路徑 {return now; }int test::set_user(char *n,char *c)//建立用戶與密碼 {strcpy(name,n);strcpy(code,c);status=1;return 1; }void test::set_status(int b)//標記分配 {status=b; }int test::get_status()//探取是否分配 {return status; }const char* test::get_code()//得到密碼 {return code; }const char* test::get_name()//得到名字 {return name; }int test::get_length()//得到長度 {return length; }int test::dis_dir(DIR *d)//顯示目錄 {if(d==0)return 0;if(d->above!=0)this->dis_dir(d->above);//遞歸調用此功能cout<<" "<<d->name<<'\n';return 0; }int test::dis_file()//查看文件 {int i;char n[10];PCB *f=Fhead;if(now!=0)f=now->File_head;cout<<"請輸入要查看的文件名:"<<endl;cin>>n;while(f!=0){if(!strcmp(n,f->name)) //找到此文件,跳出break;f=f->next;}if(f==0){cout<<"當前目錄下沒此文件"<<endl;return 0;}if(f->attribute==0)cout<<"此為只讀文件,";elsecout<<"此為讀寫文件,";cout<<"占用硬盤塊號如下:"<<endl;for(i=0;i<f->length&&i<10;i++) //直接存放的{cout<<setw(6)<<f->a[i];if((i+1)%10==0)cout<<endl;}for(i=10;i<f->length&&i<110;i++) //一級索引存放的{cout<<setw(6)<<f->p1[i-10];if((i+1)%10==0)cout<<endl;}for(i=110;i<f->length;i++) //二級索引存放的{cout<<setw(6)<<f->p2[(i-110)/100][(i-110)%100];if((i+1)%10==0)cout<<endl;}cout<<endl;return 1; }int test::dele_user()//刪除用戶 {length=0; //用戶空間置0Fhead=0;Dhead=0;now=0;status=0;return 1; }int main() {char c;Cdisk D; //管理員類的對象int i=1,n,flag=1,t=0;while(flag){cout<<"---------------多用戶文件系統----------------"<<endl;cout<<" 1.管理員"<<endl;cout<<" 2.用戶登錄"<<endl;cout<<" 3.退出"<<endl;cout<<endl;cout<<""<<endl;cout<<"請選擇操作:";cin>>c;switch(c){case '1':n=D.login(c);flag=1;system("cls");cout<<"管理員登錄成功!"<<endl;while(flag){cout<<""<<endl;cout<<"1.創建用戶"<<endl;cout<<"2.刪除用戶"<<endl;cout<<"3.查看當前用戶"<<endl;cout<<"4.返回登錄窗口"<<endl;cout<<"---------------------------"<<endl;cout<<"請選擇操作:";cin>>c;cout<<endl;switch(c){case '1':D.createuser();break;case '2':D.first_dele_user();break;case '3':D.dis_disk();break;case '4':/*{if(t==0) //t作標記,防止重復設置密碼出錯strcpy(D.code,"123");D.set_code();t++;break;}*/ {flag=0;system("cls");}/*case '5':{flag=0;system("cls");}*/ break;default:cout<<"請輸入1-4!"<<endl;}}flag=1;break;case '2':n=D.login(c);if(n==-1)break;while(flag){cout<<"----------------------------------------------"<<endl;cout<<"1.創建文件 2.刪除文件"<<endl;cout<<"3.創建目錄 4.刪除目錄"<<endl;cout<<"5.打開目錄 6.返回上一級目錄"<<endl;cout<<"7.查看當前目錄 8.查看文件"<<endl;cout<<"0.退出"<<endl;cout<<"-----------------------------------------------"<<endl;cout<<"用戶:"<<D.user[n].get_name()<<'\n'<<"目錄為:\nroot\n";D.user[n].dis_dir(D.user[n].get_now());cout<<endl;cout<<"請輸入選擇:";cin>>c;cout<<endl;switch(c){case '1':D.user[n].createfile();break;case '2':D.user[n].first_dele_file();break;case '3':D.user[n].new_dir();break;case '4':D.user[n].first_dele_dir();break;case '5':D.user[n].open_dir();break;case '6':D.user[n].goback();break;case '7':D.user[n].dis_now();break;case '8':D.user[n].dis_file();//D.user[n].set_code();break;case '0':{flag=0;system("cls");}break;default:cout<<"請輸入0-9"<<endl;}}flag=1;break;case '3':flag=0;break;default:cout<<"請輸入1-3!"<<endl;}} }

總結

以上是生活随笔為你收集整理的操作系统课程设计报告(文件系统)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。