《文件系統(tǒng)實(shí)驗(yàn)報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《文件系統(tǒng)實(shí)驗(yàn)報(bào)告.doc(15頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
實(shí)驗(yàn)二 文件系統(tǒng)
實(shí)驗(yàn)報(bào)告
1. 實(shí)驗(yàn)簡介
本實(shí)驗(yàn)要求在假設(shè)的I/O 系統(tǒng)之上開發(fā)一個(gè)簡單的文件系統(tǒng),這樣做既能讓實(shí)驗(yàn)者對文件系統(tǒng)有整體了解,又避免了涉及過多細(xì)節(jié)。用戶通過create, open, read 等命令與文件系統(tǒng)交互。文件系統(tǒng)把磁盤視為順序編號(hào)的邏輯塊序列,邏輯塊的編號(hào)為0 至L-1。I/O 系統(tǒng)利用內(nèi)存中的數(shù)組模擬磁盤。
實(shí)際物理磁盤的結(jié)構(gòu)是多維的:有柱面、磁道、扇區(qū)等概念。I/O 系統(tǒng)的任務(wù)是隱藏磁盤的結(jié)構(gòu)細(xì)節(jié),把磁盤以邏輯塊的面目呈現(xiàn)給文件系統(tǒng)。邏輯塊順序編號(hào),編號(hào)取值范圍為0 至L .. 1,其中L 表示磁盤的存儲(chǔ)塊總數(shù)。實(shí)驗(yàn)中,我們可以利用字符數(shù)組ldisk[L][B] 構(gòu)建磁盤模型,其中B 表示每個(gè)存儲(chǔ)塊的長度。I/O 系統(tǒng)從文件系統(tǒng)接收命令,根據(jù)命令指定的邏輯塊號(hào)把磁盤塊的內(nèi)容讀入命令指定的內(nèi)存區(qū)域,或者把命令指定的內(nèi)存區(qū)域內(nèi)容寫入磁盤塊。
我設(shè)計(jì)的文件系統(tǒng)擁有三個(gè)用戶。
二.具體說明
1.文件系統(tǒng)的組織:磁盤的前k 個(gè)塊是保留區(qū),其中包含如下信息:位圖和文件描述符。位圖用來描述磁盤塊的分配情況。位圖中的每一位對應(yīng)一個(gè)邏輯塊。創(chuàng)建或者刪除文件,以及文件的長度發(fā)生變化時(shí),文件系統(tǒng)都需要進(jìn)行位圖操作。前k 個(gè)塊的剩余部分包含一組文件描述符。每個(gè)文件描述符包含如下信息:
? 文件長度,單位字節(jié)
? 文件分配到的磁盤塊號(hào)數(shù)組。該數(shù)組的長度是一個(gè)系統(tǒng)參數(shù)。在實(shí)驗(yàn)中我們可以把它設(shè)置為一個(gè)比較小的數(shù),例如3。
2.目錄:我們的文件系統(tǒng)中僅設(shè)置一個(gè)目錄,該目錄包含文件系統(tǒng)中的所有文件。除了不需要顯示地創(chuàng)建和刪除之外,目錄在很多方面和普通文件相像。目錄對應(yīng)0 號(hào)文件描述符。初始狀態(tài)下,目錄中沒有文件,所有,目錄對應(yīng)的描述符中記錄的長度應(yīng)為0,而且也沒有分配磁盤塊。每創(chuàng)建一個(gè)文件,目錄文件的長度便增加一分。目錄文件的內(nèi)容由一系列的目錄項(xiàng)組成,其中每個(gè)目錄項(xiàng)由如下內(nèi)容組成:
? 文件名
? 文件描述符序號(hào)
3.對文件的操作:
文件系統(tǒng)需提供如下函數(shù);create, destroy, open, read, write。
? create(filename): 根據(jù)指定的文件名創(chuàng)建新文件。
? destroy(filename): 刪除指定文件。
? open(filename): 打開文件。該函數(shù)返回的索引號(hào)可用于后續(xù)的read, write, lseek, 或close 操作。
? close(index): 關(guān)閉制定文件。
? read(index, mem_area, count): 從指定文件順序讀入count 個(gè)字節(jié)mem_area 指定的內(nèi)存位置。讀操作從文件的讀寫指針指示的位置開始。
? write(index, mem_area, count): 把mem_area 指定的內(nèi)存位置開始的count 個(gè)字節(jié)順序?qū)懭胫付ㄎ募?。寫操作從文件的讀寫指針指示的位置開始。
? lseek(index, pos): 把文件的讀寫指針移動(dòng)到pos 指定的位置。pos是一個(gè)整數(shù),表示從文件開始位置的偏移量。文件打開時(shí),讀寫指針自動(dòng)設(shè)置為0。每次讀寫操作之后,它指向最后被訪問的字節(jié)的下一個(gè)位置。lseek 能夠在不進(jìn)行讀寫操作的情況下改變讀寫指針能位置。
? directory: 列表顯示所有文件及其長度。
三.實(shí)驗(yàn)過程
創(chuàng)建文件create:
此時(shí)顯示文件中的文件:
文件的刪除delete:
打開文件(open):
文件的寫操作(write):
讀文件(read):
關(guān)閉文件(close):
退出系統(tǒng)(exit):
四.實(shí)驗(yàn)代碼
#include
#include
#include
#include
#define NULL 0
typedef struct mdf{//MDF結(jié)構(gòu)體
char username[20];//用戶名
char filename[20];//文件名
struct mdf *next;
}MDF;
typedef struct ufd{//UFD結(jié)構(gòu)體
char filename[20];//文件名
int protect;//文件保護(hù)碼
unsigned int length;//文件長度
struct ufd *next;
}UFD;
typedef struct afd{//AFD結(jié)構(gòu)體
char filename[20];//文件名
int protect;//文件保護(hù)碼
unsigned int point;//文件讀寫指針
struct afd *next;
}AFD;
MDF *pmdf;//全局鏈表頭指針
UFD *pufd;
AFD *pafd;
char UserUFD[20];//已經(jīng)登陸成功的用戶名
void initMDF()//初始化MDF表
{
FILE *fp;
pmdf= (MDF*)malloc(sizeof(MDF));
MDF *p = pmdf;
if((fp = fopen("MDF", "r+")) == NULL){//打開MDF文件
puts("the MDF cannot open!\n");
exit(1);
}
while (!feof(fp)){//把MDF文件中的內(nèi)容裝入鏈表
p->next = (MDF*)malloc(sizeof(MDF));
p = p->next;
fscanf(fp, "%s", p->username);
fscanf(fp, "%s", p->filename);
}
p->next = NULL;
fclose(fp);
}
void printUFD()//打印MDF表
{
UFD *p = pufd->next;
puts("文件名\t\t保護(hù)碼\t\t文件長度\n");
while (p){
printf("%s", p->filename);
printf("\t\t%d" , p->protect);
printf("\t\t%d\n", p->length);
p=p->next;
}
}
void initUFD(char *name)//初始化UFD表
{
FILE *fp;
pufd= (UFD*)malloc(sizeof(UFD));
UFD *p = pufd;
if((fp = fopen(name, "r+")) == NULL){
puts("the UFD cannot open!\n");
exit(1);
}
while (!feof(fp)){//建立UFD鏈表
p->next = (UFD*)malloc(sizeof(UFD));
p = p->next;
fscanf(fp, "%s", p->filename);
fscanf(fp, "%d", &p->protect);
fscanf(fp, "%d", &p->length);
fgetc(fp);
}
p->next = NULL;
fclose(fp);
}
int checkuser()//檢測登陸的用戶名
{
char username[20];
while(1){
puts("請輸入用戶名: \n");
scanf("%s", username);
MDF *p = pmdf;
while(p){
if(strcmp(username, p->username) == 0){
strcpy(UserUFD, p->filename);
initUFD(p->filename);
printUFD();
return 1;
}
p= p->next;
}
puts("同戶名不存在\n");
}
}
void initAFD()//初始化AFD
{
pafd = (AFD*)malloc(sizeof(AFD));
pafd->next = NULL;
}
bool create()//創(chuàng)建文件命令
{
char filename[20];
UFD *p = pufd->next;
AFD *pa = pafd;
puts("請輸入要?jiǎng)?chuàng)建的文件名: \n");
scanf("%s", filename);
while (p){
if(strcmp(filename, p->filename) == 0){
puts("此文件已經(jīng)存在了!\n");
return 0;
}
if(!p->next)
break;
p= p->next;
}
p->next = (UFD*)malloc(sizeof(UFD));
p=p->next;
strcpy(p->filename, filename);
p->protect = 2;
p->length = 0;
p->next = NULL;
while(pa->next){//創(chuàng)建文件后加入到AFD
pa=pa->next;
}
pa->next = (AFD*)malloc(sizeof(AFD));
pa = pa->next;
strcpy(pa->filename ,filename);
pa->protect = 2;
pa->point = 0;
pa->next = NULL;
return 1;
}
bool _delete()//刪除文件命令
{
char filename[20];
puts("請輸入要?jiǎng)h除的文件名: \n");
scanf("%s", filename);
UFD *p = pufd;
UFD *temp;
while (p->next){
if(strcmp(filename, p->next->filename) == 0){
temp = p->next;
p->next = p->next->next;
free(temp);
printf("文件%s刪除成功!\n", filename);
return 1;
}
p= p->next;
}
puts("要?jiǎng)h除的文件不存在!\n");
return 0;
}
bool open()//打開文件命令
{
char filename[20];
unsigned int protect;
puts("請輸入要打開的文件名: \n");
scanf("%s", filename);
puts("請輸入要打開的文件保護(hù)類型: \n");
scanf("%d", &protect);
UFD *p = pufd->next;
AFD *pa = pafd->next;
while (pa){
if(strcmp(filename, pa->filename) == 0){
printf("文件%s已經(jīng)打開!\n",filename);
return 1;
}
if(!pa->next)
break;
pa = pa->next;
}
if(!pa)
pa=pafd;
while (p){
if(strcmp(filename, p->filename) == 0){
pa->next = (AFD*)malloc(sizeof(AFD));
pa = pa->next;
strcpy(pa->filename , p->filename);
pa->protect = protect;
if(protect == 1)
pa->point = 0;
else
pa->point = p->length;
pa->next=NULL;
printf("文件%s已經(jīng)打開!\n",filename);
return 1;
}
p= p->next;
}
puts("要打開的文件不存在!\n");
return 0;
}
void close()//關(guān)閉文件命令
{
char filename[20];
UFD *pu = pufd->next;
puts("請輸入要關(guān)閉的文件名: \n");
scanf("%s", filename);
AFD *p = pafd;
AFD *temp;
while (p&&p->next){
if(strcmp(filename, p->next->filename) == 0){
temp = p->next;
p->next = p->next->next;
if(temp->protect == 2){
while(pu){
if(strcmp(temp->filename, pu->filename) == 0){
pu->length =temp->point;
break;
}
pu = pu->next;
}
}
free(temp);
printf("文件%s關(guān)閉成功!\n", filename);
return ;
}
p= p->next;
}
puts("要關(guān)閉的文件沒有被打開!\n");
}
int read()//讀文件命令
{
char filename[20];
unsigned int length;
AFD *p = pafd->next;
puts("請輸入要讀的文件名: \n");
scanf("%s", filename);
puts("請輸入要讀的長度\n");
scanf("%d", &length);
while (p){
if(strcmp(filename, p->filename) == 0){
p->point += length;
printf("文件%s讀取成功!\n", filename);
return 1;
}
p= p->next;
}
puts("讀取失敗文件沒有打開過!\n");
return 0;
}
int write()//寫文件命令
{
char filename[20];
unsigned int length;
AFD *p = pafd->next;
puts("請輸入要寫的文件名: \n");
scanf("%s", filename);
while (p){
if(strcmp(filename, p->filename) == 0){
if(p->protect != 2){
printf("文件%s不可寫!\n", filename);
return 0;
}
puts("請輸入要寫的長度\n");
scanf("%d", &length);
p->point += length;
printf("文件%s寫入成功!\n", filename);
return 1;
}
p= p->next;
}
puts("寫入失敗文件沒有打開過!\n");
return 0;
}
void destroy()//釋放內(nèi)存
{
MDF *pm = pmdf;
while(pm){
pmdf = pmdf->next;
free(pm);
pm = pmdf;
}
AFD *pa = pafd;
while(pa){
pafd = pafd->next;
free(pa);
pa = pafd;
}
UFD *pu = pufd;
while(pu){
pufd = pufd ->next;
free(pu);
pu = pufd;
}
}
void saveUFD()//保存UFD文件
{
FILE *fp;
UFD *p = pufd->next;
if((fp = fopen(UserUFD, "w")) == NULL){
puts("the UFD cannot open!\n");
exit(1);
}
while (p){
fprintf(fp, "%s", "\n");
fprintf(fp, "%s%s", p->filename,"\t\t");
fprintf(fp, "%d%s", p->protect,"\t\t");
fprintf(fp, "%d", p->length);
p=p->next;
}
fclose(fp);
}
void exit()//推出系統(tǒng)
{
AFD *pa = pafd->next;
UFD *pu = pufd->next;
while(pa){
if(pa->protect == 2){
while(pu){
if(strcmp(pa->filename, pu->filename) == 0){
pu->length = pa->point;
break;
}
pu = pu->next;
}
}
pa =pa->next;
}
saveUFD();
printUFD();
destroy();
}
void operate()//命令識(shí)別
{
while(1){
char command[20];
char name[][8] = {"create", "delete", "open", "close","read", "write","exit"};
puts("請輸入命令: \n");
scanf("%s", command);
if(strcmp(command, name[0] ) == 0)
create();
else if(strcmp(command, name[1] ) == 0)
_delete();
else if(strcmp(command, name[2] ) == 0)
open();
else if(strcmp(command, name[3] ) == 0)
close();
else if(strcmp(command, name[4] ) == 0)
read();
else if(strcmp(command, name[5] ) == 0)
write();
else if(strcmp(command, name[6] ) == 0){
exit();
return;
}else
puts("無效命令,請重新輸入:\n");
}
}
void print()
{
puts("文件系統(tǒng)\n");
puts("***使用說明***:\n");
puts("本文件系統(tǒng)共有三個(gè)用戶分別是user1 user2 user3\n\
系統(tǒng)命令有create, delete, open, close,read, write,exit\
\nexit----------------------------------------退出系統(tǒng)");
}
int main()
{
print();
initMDF();
checkuser();
initAFD();
operate();//命令識(shí)別
return 0;
}
鏈接地址:http://m.hcyjhs8.com/p-9135965.html