導航:首頁 > 文件目錄 > 二級文件系統的設計

二級文件系統的設計

發布時間:2023-01-25 04:54:56

⑴ 操作系統課程設計---文件管理系統模擬

可以使用Bai Hi通知我
有時間可能完成你所面臨的任務
同樣的要求也可能通知我

ES:\\

⑵ 為linux系統設計一個簡單的二級文件系統。要求做到以下幾點:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MEM_D_SIZE 1024*1024 //總磁碟空間為1M
#define DISKSIZE 1024 //磁碟塊的大小1K
#define DISK_NUM 1024 //磁碟塊數目1K
#define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小
#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目錄起始盤塊號
#define ROOT_DISK_SIZE sizeof(struct direct) //根目錄大小
#define DIR_MAXSIZE 1024 //路徑最大長度為1KB
#define MSD 5 //最大子目錄數5
#define MOFN 5 //最大文件深度為5
#define MAX_WRITE 1024*128 //最大寫入文字長度128KB

struct fatitem /* size 8*/
{
int item; /*存放文件下一個磁碟的指針*/
char em_disk; /*磁碟塊是否空閑標志位 0 空閑*/
};

struct direct
{
/*-----文件控制快信息-----*/
struct FCB
{
char name[9]; /*文件/目錄名 8位*/
char property; /*屬性 1位目錄 0位普通文件*/
int size; /*文件/目錄位元組數、盤塊數)*/
int firstdisk; /*文件/目錄 起始盤塊號*/
int next; /*子目錄起始盤塊號*/
int sign; /*1是根目錄 0不是根目錄*/

}directitem[MSD+2];

};

struct opentable
{
struct openttableitem
{
char name[9]; /*文件名*/
int firstdisk; /*起始盤塊號*/
int size; /*文件的大小*/
}openitem[MOFN];
int cur_size; /*當前打文件的數目*/
};

struct fatitem *fat; /*FAT表*/
struct direct *root; /*根目錄*/
struct direct *cur_dir; /*當前目錄*/
struct opentable u_opentable; /*文件打開表*/
int fd=-1; /*文件打開表的序號*/
char *bufferdir; /*記錄當前路徑的名稱*/
char *fdisk; /*虛擬磁碟起始地址*/

void initfile();
void format();
void enter();
void halt();
int create(char *name);
int open(char *name);
int close(char *name);
int write(int fd,char *buf,int len);
int read(int fd,char *buf);
int del(char *name);
int mkdir(char *name);
int rmdir(char *name);
void dir();
int cd(char *name);
void print();
void show();

void initfile()
{
fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申請 1M空間*/
format();

}

void format()
{
int i;
FILE *fp;

fat = (struct fatitem *)(fdisk+DISKSIZE); /*計算FAT表地址,引導區向後偏移 1k)*/
/*-----初始化FAT表------------*/
fat[0].item=-1; /*引導塊*/
fat[0].em_disk='1';

for(i=1;i<ROOT_DISK_NO-1;i++) /*存放 FAT表的磁碟塊號*/
{
fat[i].item=i+1;
fat[i].em_disk='1';
}

fat[ROOT_DISK_NO].item=-1; /*存放根目錄的磁碟塊號*/
fat[ROOT_DISK_NO].em_disk='1';

for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)
{
fat[i].item = -1;
fat[i].em_disk = '0';
}
/*-----------------------------------------------*/
root = (struct direct *)(fdisk+DISKSIZE+FATSIZE); /*根目錄的地址*/
/*初始化目錄*/
/*---------指向當前目錄的目錄項---------*/
root->directitem[0].sign = 1;
root->directitem[0].firstdisk = ROOT_DISK_NO;
strcpy(root->directitem[0].name,".");
root->directitem[0].next = root->directitem[0].firstdisk;
root->directitem[0].property = '1';
root->directitem[0].size = ROOT_DISK_SIZE;
/*-------指向上一級目錄的目錄項---------*/
root->directitem[1].sign = 1;
root->directitem[1].firstdisk = ROOT_DISK_NO;
strcpy(root->directitem[1].name,"..");
root->directitem[1].next = root->directitem[0].firstdisk;
root->directitem[1].property = '1';
root->directitem[1].size = ROOT_DISK_SIZE;
if((fp = fopen("disk.dat","wb"))==NULL)
{
printf("Error:\n Cannot open file \n");
return;
}
for(i=2;i<MSD+2;i++) /*-子目錄初始化為空-*/
{
root->directitem[i].sign = 0;
root->directitem[i].firstdisk = -1;
strcpy(root->directitem[i].name,"");
root->directitem[i].next = -1;
root->directitem[i].property = '0';
root->directitem[i].size = 0;
}

if((fp = fopen("disk.dat","wb"))==NULL)
{
printf("Error:\n Cannot open file \n");
return;
}
if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*把虛擬磁碟空間保存到磁碟文件中*/
{
printf("Error:\n File write error! \n");
}

fclose(fp);

}
void enter()
{
FILE *fp;
int i;

fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char)); /*申請 1M空間*/
if((fp=fopen("disk.dat","rb"))==NULL)
{
printf("Error:\nCannot open file\n");
return;
}
if(!fread(fdisk,MEM_D_SIZE,1,fp)) /*把磁碟文件disk.dat 讀入虛擬磁碟空間(內存)*/
{
printf("Error:\nCannot read file\n");
exit(0);
}
fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FAT表地址*/
root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目錄地址*/
fclose(fp);
/*--------------初始化用戶打開表------------------*/
for(i=0;i<MOFN;i++)
{
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk = -1;
u_opentable.openitem[i].size = 0;
}
u_opentable.cur_size = 0;

cur_dir = root; /*當前目錄為根目錄*/
bufferdir = (char *)malloc(DIR_MAXSIZE*sizeof(char));
strcpy(bufferdir,"Root:");
}

void halt()
{
FILE *fp;
int i;

if((fp=fopen("disk.dat","wb"))==NULL)
{
printf("Error:\nCannot open file\n");
return;
}
if(!fwrite(fdisk,MEM_D_SIZE,1,fp)) /*把虛擬磁碟空間(內存)內容讀入磁碟文件disk.dat */
{
printf("Error:\nFile write error!\n");
}
fclose(fp);

free(fdisk);
free(bufferdir);
return;
}

int create(char *name)
{

int i,j;

if(strlen(name)>8) /*文件名大於 8位*/
return(-1);

for(j=2;j<MSD+2;j++) /*檢查創建文件是否與已存在的文件重名*/
{
if(!strcmp(cur_dir->directitem[j].name,name))
break;
}
if(j<MSD+2) /*文件已經存在*/
return(-4);

for(i=2;i<MSD+2;i++) /*找到第一個空閑子目錄*/
{
if(cur_dir->directitem[i].firstdisk==-1)
break;
}
if(i>=MSD+2) /*無空目錄項*/
return(-2);
if(u_opentable.cur_size>=MOFN) /*打開文件太多*/
return(-3);

for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++) /*找到空閑盤塊 j 後退出*/
{
if(fat[j].em_disk=='0')
break;
}
if(j>=DISK_NUM)
return(-5);
fat[j].em_disk = '1'; /*將空閑塊置為已經分配*/
/*-----------填寫目錄項-----------------*/
strcpy(cur_dir->directitem[i].name,name);
cur_dir->directitem[i].firstdisk = j;
cur_dir->directitem[i].size = 0;
cur_dir->directitem[i].next = j;
cur_dir->directitem[i].property = '0';
/*---------------------------------*/
fd = open(name);
return 0;

}

int open(char *name)
{
int i, j;

for(i=2;i<MSD+2;i++) /*文件是否存在*/
{
if(!strcmp(cur_dir->directitem[i].name,name))
break;
}
if(i>=MSD+2)
return(-1);
/*--------是文件還是目錄-----------------------*/
if(cur_dir->directitem[i].property=='1')
return(-4);

/*--------文件是否打開-----------------------*/
for(j=0;j<MOFN;j++)
{
if(!strcmp(u_opentable.openitem[j].name,name))
break;
}
if(j<MOFN) /*文件已經打開*/
return(-2);

if(u_opentable.cur_size>=MOFN) /*文件打開太多*/
return(-3);

/*--------查找一個空閑用戶打開表項-----------------------*/
for(j=0;j<MOFN;j++)
{
if(u_opentable.openitem[j].firstdisk==-1)
break;
}
/*--------------填寫表項的相關信息------------------------*/
u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk;
strcpy(u_opentable.openitem[j].name,name);
u_opentable.openitem[j].size = cur_dir->directitem[i].size;
u_opentable.cur_size++;
/*----------返回用戶打開表表項的序號--------------------------*/
return(j);
}

int close(char *name)
{
int i;

for(i=0;i<MOFN;i++)
{
if(!strcmp(u_opentable.openitem[i].name,name))
break;
}
if(i>=MOFN)
return(-1);
/*-----------清空該文件的用戶打開表項的內容---------------------*/
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk = -1;
u_opentable.openitem[i].size = 0;
u_opentable.cur_size--;

return 0;
}

int write(int fd, char *buf, int len)
{
char *first;
int item, i, j, k;
int ilen1, ilen2, modlen, temp;
/*----------用 $ 字元作為空格 # 字元作為換行符-----------------------*/
char Space = 32;
char Endter= '\n';

for(i=0;i<len;i++)
{
if(buf[i] == '$')
buf[i] = Space;
else if(buf[i] == '#')
buf[i] = Endter;
}

/*----------讀取用戶打開表對應表項第一個盤塊號-----------------------*/

item = u_opentable.openitem[fd].firstdisk;

/*-------------找到當前目錄所對應表項的序號-------------------------*/
for(i=2;i<MSD+2;i++)
{
if(cur_dir->directitem[i].firstdisk==item)
break;
}
temp = i; /*-存放當前目錄項的下標-*/
/*------找到的item 是該文件的最後一塊磁碟塊-------------------*/
while(fat[item].item!=-1)
{
item =fat[item].item; /*-查找該文件的下一盤塊--*/
}

/*-----計算出該文件的最末地址-------*/
first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;

/*-----如果最後磁碟塊剩餘的大小大於要寫入的文件的大小-------*/
if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len)
{
strcpy(first,buf);
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
else
{
for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++)
{/*寫一部分內容到最後一塊磁碟塊的剩餘空間(位元組)*/
first[i] = buf [i];
}
/*-----計算分配完最後一塊磁碟的剩餘空間(位元組) 還剩下多少位元組未存儲-------*/
ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);
ilen2 = ilen1/DISKSIZE;
modlen = ilen1%DISKSIZE;
if(modlen>0)
ilen2 = ilen2+1; /*--還需要多少塊磁碟塊-*/

for(j=0;j<ilen2;j++)
{
for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*尋找空閑磁碟塊*/
{
if(fat[i].em_disk=='0')
break;
}
if(i>=DISK_NUM) /*--如果磁碟塊已經分配完了-*/
return(-1);
first = fdisk+i*DISKSIZE; /*--找到的那塊空閑磁碟塊的起始地址-*/
if(j==ilen2-1) /*--如果是最後要分配的一塊-*/
{
for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE;k++)
first[k] = buf[k];
}
else/*-如果不是要最後分配的一塊--*/
{
for(k=0;k<DISKSIZE;k++)
first[k] =buf[k];
}

fat[item].item = i; /*--找到一塊後將它的序號存放在上一塊的指針中-*/
fat[i].em_disk = '1'; /*--置找到的磁碟快的空閑標志位為已分配-*/
fat[i].item = -1; /*--它的指針為 -1 (即沒有下一塊)-*/
}
/*--修改長度-*/
u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;
cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;
}
return 0;
}

int read(int fd, char *buf)
{
int len = u_opentable.openitem[fd].size;
char *first;
int i, j, item;
int ilen1, modlen;

item = u_opentable.openitem[fd].firstdisk;

ilen1 = len/DISKSIZE;
modlen = len%DISKSIZE;
if(modlen!=0)
ilen1 = ilen1+1; /*--計算文件所佔磁碟的塊數-*/

first = fdisk+item*DISKSIZE; /*--計算文件的起始位置-*/

for(i=0;i<ilen1;i++)
{
if(i==ilen1-1) /*--如果在最後一個磁碟塊-*/
{
for(j=0;j<len-i*DISKSIZE;j++)
buf[i*DISKSIZE+j] = first[j];
}
else /*--不在最後一塊磁碟塊-*/
{
for(j=0;j<len-i*DISKSIZE;j++)
buf[i*DISKSIZE+j] = first[j];
item = fat[item].item; /*-查找下一盤塊-*/
first = fdisk+item*DISKSIZE;
}
}
return 0;
}

int del(char *name)
{
int i,cur_item,item,temp;

for(i=2;i<MSD+2;i++) /*--查找要刪除文件是否在當前目錄中-*/
{
if(!strcmp(cur_dir->directitem[i].name,name))
break;
}

⑶ 操作系統課程設計——為LINUX 設計一個簡單的二級文件系統

懸賞分:10?

⑷ 操作系統實驗簡單文件管理系統 謝謝 急急急

我有c#的。。。不過和你的要求還有點點區別。。。不存在用戶的區別,只是文件分級(類似於windows)

⑸ 用c++設計一個簡單的二級文件系統

這些你都可以到相關的C++討人論壇上找到

⑹ 用C語言設計一個簡單的二級文件系統

簡單嗎,我這有手機的文件系統最簡單功能實現都要上萬行

⑺ 操作系統linux 二級文件系統具體是怎麼實現的

說通抄俗一點就類似於數組加上鏈表的結構,i_addr[8]數組中每一個元素都指向了一個磁碟塊,如果那個磁碟塊中也存放了一個i_addr[8]數組,並且那個數組中的每個元素也指向了一個磁碟塊,那麼這就是二級的索引文件結構了~
建議看一下操作系統原理(龐麗萍)一書中的文件系統一章
這個東西是Unix V的一種典型的文件系統~呵呵~

⑻ 常見的文件系統有哪些

常見的文件系統有FAT、NTFS、ExtFAT、ext2、ext3、reiserFS、VFAT、APFS。

1、FAT文件系統。

FAT文件系統誕生於1977年,它最初是為軟盤設計的文件系統,但是後來隨著微軟推出dos和win 9x系統,FAT文件系統經過適配被逐漸用到了硬碟上,並且在那時的20年中,一直是主流的文件系統。

2、NTFS文件系統。

它是一種比FAT32功能更加強大的文件系統,從windows 2000之後的windows系統的默認文件系統都是NTFS,而且這些windows系統只能夠安裝在NTFS格式的磁碟上。NTFS系統是一個日誌性的文件系統,系統中對文件的操作都可以被記錄下來,當系統崩潰之後,利用日誌功能可以修復數據。

3、ExtFAT文件系統。

ExFAT也是微軟開發的文件系統,它是專門為快閃記憶體檔設計的文件系統,單個文件突破了4G的限制,而且分區的最大容量可達64ZB,建議512TB。 ExFAT在windows,Linux以及Mac系統上,都可以讀寫,作為U盤或者是移動硬碟的格式還是比較合適的。

4、ext2文件系統。

ext2是為解決ext文件系統的缺陷而設計的可擴展的、高性能的文件系統,又被稱為二級擴展文件系統。它是Linux文件系統中使用最多的類型,並且在速度和CPU利用率上較為突出。ext2存取文件的性能極好,並可以支持256位元組的長文件名,是GNU/Linux系統中標準的文件系統。

5、ext3文件系統。

ext3是ext2文件系統的日誌版本,它在ext2文件系統中增加了日誌的功能。ext3提供了3種日誌模式:日誌(journal)、順序(ordered)和回寫(writeback)。與ext2相比,ext3提供了更好的安全性以及向上向下的兼容性能。

6、reiserFS文件系統。

reiserFS是Linux環境下最穩定的日誌文件系統之一,使用快速的平衡二叉樹(binary tree)演算法來查找磁碟上的自由空間和已有的文件,其搜索速度高於ext2,reiserFS能夠像其他大多數文件系統一樣,可動態的分配索引節,而無須在文件系統中創建固定的索引節。

7、VFAT文件系統。

VFAT主要用於處理長文件的一種文件名系統,它運行在保護模式下並使用VCACHE進行緩存,並具有和Windows系列文件系統和Linux文件系統兼容的特性。因此VFAT可以作為Windows和Linux交換文件的分區。

8、APFS文件系統。

APFS是蘋果公司發布的新的文件格式,替代目前所使用的HFS+格式。這一全新文件系統專門針對快閃記憶體/SSD進行優化,提供了更強大的加密、寫入時復制元數據、空間分享、文件和目錄克隆、快照、目錄大小快速調整、原子級安全存儲基元,以及改進的文件系統底層技術。

閱讀全文

與二級文件系統的設計相關的資料

熱點內容
ps入門必備文件 瀏覽:348
以前的相親網站怎麼沒有了 瀏覽:15
蘋果6耳機聽歌有滋滋聲 瀏覽:768
怎麼徹底刪除linux文件 瀏覽:379
編程中字體的顏色是什麼意思 瀏覽:534
網站關鍵詞多少個字元 瀏覽:917
匯川am系列用什麼編程 瀏覽:41
筆記本win10我的電腦在哪裡打開攝像頭 瀏覽:827
醫院單位基本工資去哪個app查詢 瀏覽:18
css源碼應該用什麼文件 瀏覽:915
編程ts是什麼意思呢 瀏覽:509
c盤cad佔用空間的文件 瀏覽:89
不銹鋼大小頭模具如何編程 瀏覽:972
什麼格式的配置文件比較主流 瀏覽:984
增加目錄word 瀏覽:5
提取不相鄰兩列數據如何做圖表 瀏覽:45
r9s支持的網路制式 瀏覽:633
什麼是提交事務的編程 瀏覽:237
win10打字卡住 瀏覽:774
linux普通用戶關機 瀏覽:114

友情鏈接