![操作系統(tǒng)實(shí)驗(yàn)文件管理C++代碼_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/c467458f-62ca-442a-a09f-f1ad7788c94a/c467458f-62ca-442a-a09f-f1ad7788c94a1.gif)
![操作系統(tǒng)實(shí)驗(yàn)文件管理C++代碼_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/c467458f-62ca-442a-a09f-f1ad7788c94a/c467458f-62ca-442a-a09f-f1ad7788c94a2.gif)
![操作系統(tǒng)實(shí)驗(yàn)文件管理C++代碼_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/c467458f-62ca-442a-a09f-f1ad7788c94a/c467458f-62ca-442a-a09f-f1ad7788c94a3.gif)
![操作系統(tǒng)實(shí)驗(yàn)文件管理C++代碼_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/c467458f-62ca-442a-a09f-f1ad7788c94a/c467458f-62ca-442a-a09f-f1ad7788c94a4.gif)
![操作系統(tǒng)實(shí)驗(yàn)文件管理C++代碼_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/c467458f-62ca-442a-a09f-f1ad7788c94a/c467458f-62ca-442a-a09f-f1ad7788c94a5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、#include<stack>/ 數(shù)據(jù)塊的大小/ 數(shù)據(jù)塊的塊數(shù)/ i 節(jié)點(diǎn)的大小/ i 節(jié)點(diǎn)的數(shù)目/ 打開文件表的數(shù)目using namespace std; #define BLKSIZE 512 #define BLKNUM 512 #define INODESIZE 32 #define INODENUM 32 #define FILENUM 8/ 用戶typedef struct/ 用戶名/ 密碼char user_name10;char password10; User;/i 節(jié)點(diǎn)typedef struct文件 i 節(jié)點(diǎn)號(hào)文件名文件類型 文件所有者 父目錄的 i 節(jié)點(diǎn)號(hào)
2、 文件長度short inum; /char file_name10; / char type; /char user_name10; / short iparent;/short length;/short address2; /存放文件的地址 Inode;/ 打開文件表typedef structshort inum;/ i節(jié)點(diǎn)號(hào)char file_name10; /文件名short mode;/讀寫模式 (1:read, 2:write,/3:read and write) File_table;/ 申明函數(shù) void login(void);void init(void); int a
3、nalyse(char *); void save_inode(int); int get_blknum(void); void read_blk(int); void write_blk(int); void release_blk(int); void pathset();void del(int);/ 用戶命令處理函數(shù)void help(void);void cd(void);void dir(void);void mkdir(void);void creat(void);void open(void);void read(void);void write(void);void clos
4、e(void);void delet(void);void logout(void);void command(void);void quit();/main.cpp 文件/#include "head.h"/ 定義全局變量char choice;int argc; / 用戶命令的參數(shù)個(gè)數(shù) char *argv5;/ 用戶命令的參數(shù)intinum_cur;/ 當(dāng)前目錄char temp2*BLKSIZE; / 緩沖區(qū)char bitmapBLKNUM; / 位圖數(shù)組Inode inode_arrayINODENUM; / i 節(jié)點(diǎn)數(shù)組File_table file_arra
5、yFILENUM;/ 打開文件表數(shù)組文件系統(tǒng)名稱FILE*fp;/ 打開文件指針char image_name10 = "data.dat" /創(chuàng)建映像hd,并將所有用戶和文件清除void format(void)int i;Inode inode;printf("Will be to format filesystem.n");printf("WARNING:ALL DATA ON THIS FILESYSTEM WILL BE LOST!n");printf("Proceed with Format(Y/N)"
6、);scanf("%c", &choice);getchar();if(choice = 'y') | (choice = 'Y')if(fp=fopen(image_name, "w+b") = NULL)printf("Can't create file %sn", image_name);exit(-1);for(i = 0; i < BLKSIZE; i+) fputc('0', fp);inode.inum = 0;strcpy(inode.file_na
7、me, "/");inode.type = 'd'strcpy(inode.user_name, "/");inode.iparent = 0;inode.length = 0;inode.address0 = -1;inode.address1 = -1;fwrite(&inode, sizeof(Inode), 1, fp);inode.inum = -1;for(i = 0; i < 31; i+) fwrite(&inode, sizeof(Inode), 1, fp);for(i = 0; i < B
8、LKNUM*BLKSIZE; i+) fputc('0', fp);fclose(fp);/ 打開文件 user.txtif(fp=fopen("user.txt", "w+") = NULL)printf("Can't create file %sn", "user.txt"); exit(-1);fclose(fp);successful.Pleasefirstprintf("Filesystem created login!n");return ;/ 功能 : 用戶
9、登陸,如果是新用戶則創(chuàng)建用戶void login(void)char *p;int flag;char user_name10;char password10;char file_name10 = "user.txt"doprintf("login:");gets(user_name);printf("password:");p=password;while(*p=getch()if(*p = 0x0d)*p='0' / 將輸入的回車鍵轉(zhuǎn)換成空格break;printf("*"); / 將輸入的密碼
10、以 "*" 號(hào)顯示p+;flag = 0;if(fp = fopen(file_name, "r+") = NULL)printf("nCan't open file %s.n", file_name);printf("This filesystem not exist, it will be create!n");format();login();while(!feof(fp)fread(&user, sizeof(User), 1, fp);/ 已經(jīng)存在的用戶 , 且密碼正確if(!strcmp
11、(user.user_name, user_name) &&!strcmp(user.password, password)fclose(fp);printf("n");return ;/ 已經(jīng)存在的用戶 , 但密碼錯(cuò)誤else if(!strcmp(user.user_name, user_name)password isprintf("nThis user is exist, but incorrect.n");flag = 1;fclose(fp);break;if(flag = 0) break;while(flag);/ 創(chuàng)建新
12、用戶if(flag = 0)printf("nDo you want to creat a new user(y/n):");scanf("%c", &choice);gets(temp);if(choice = 'y') | (choice = 'Y')strcpy(user.user_name, user_name);strcpy(user.password, password);fwrite(&user, sizeof(User), 1, fp);fclose(fp);return ;if(choic
13、e = 'n') | (choice = 'N')login();/ 功能 : 將所有 i 節(jié)點(diǎn)讀入內(nèi)存void init(void)int i;if(fp = fopen(image_name, "r+b") = NULL)printf("Can't open file %s.n", image_name);exit(-1);/ 讀入位圖for(i = 0; i < BLKNUM; i+)bitmapi = fgetc(fp);/ 顯示位圖/ 讀入 i 節(jié)點(diǎn)信息for(i = 0; i < INODE
14、NUM; i+)fread(&inode_arrayi, sizeof(Inode), 1, fp);/ 顯示 i 節(jié)點(diǎn)/ 當(dāng)前目錄為根目錄inum_cur = 0;/ 初始化打開文件表for(i = 0; i < FILENUM; i+)file_arrayi.inum = -1;/ 功能 : 分析用戶命令 , 將分析結(jié)果填充 argc 和 argv/ 結(jié)果: 0-13 為系統(tǒng)命令 , 14 為命令錯(cuò)誤int analyse(char *str)int i;char temp20;char *ptr_char;char *syscmd="help", &qu
15、ot;cd", "dir", "mkdir", "create", "open", "read", "write","logout","close", "delet", "clear","format","quit"argc = 0;for(i = 0, ptr_char = str; *ptr_char != '0' ptr_ch
16、ar+)if(*ptr_char != ' ')while(*ptr_char != ' ' && (*ptr_char != '0')tempi+ = *ptr_char+;argvargc = (char *)malloc(i+1);strncpy(argvargc, temp, i);argvargci = '0'argc+;i = 0;if(*ptr_char = '0') break;if(argc != 0)for(i = 0; (i < 14) && strcmp
17、(argv0, syscmdi); i+);return i;elsereturn 14;/功能:將num號(hào)i節(jié)點(diǎn)保存到hd.datvoid save_inode(int num)if(fp=fopen(image_name, "r+b") = NULL)printf("Can't open file %sn", image_name); exit(-1);fseek(fp, BLKNUM +num*sizeof(Inode), SEEK_SET);fwrite(&inode_arraynum, sizeof(Inode), 1, fp)
18、; fclose(fp);/ 功能: 申請一個(gè)數(shù)據(jù)塊int get_blknum(void)int i;for(i = 0; i < BLKNUM; i+)if(bitmapi = '0') break;/ 未找到空閑數(shù)據(jù)塊if(i = BLKNUM)printf("Data area is full.n");exit(-1);bitmapi = '1'if(fp=fopen(image_name, "r+b") = NULL)printf("Can't open file %sn", i
19、mage_name);exit(-1);fseek(fp, i, SEEK_SET);fputc('1', fp);fclose(fp);return i;/功能:將i節(jié)點(diǎn)號(hào)為num的文件讀入tempvoid read_blk(int num)int i, len;char ch;int add0, add1;len = inode_arraynum.length;add0 = inode_arraynum.address0;if(len > 512)add1 = inode_arraynum.address1;if(fp = fopen(image_name, &quo
20、t;r+b") = NULL)printf("Can't open file %s.n", image_name);exit(-1);fseek(fp, BLKSIZE+INODESIZE*INODENUM +add0*BLKSIZE, SEEK_SET); ch = fgetc(fp);for(i=0; (i < len) && (ch != '0') && (i < 512); i+)tempi = ch;ch = fgetc(fp);if(i >= 512) fseek(fp,BLKS
21、IZE+INODESIZE*INODENUM+add1*BLKSIZE,SEEK_SET);ch = fgetc(fp);for(; (i < len) && (ch != '0'); i+)tempi = ch;ch = fgetc(fp);tempi = '0'fclose(fp);/ 功能: 將 temp 的內(nèi)容輸入 hd 的數(shù)據(jù)區(qū) void write_blk(int num)int i, len;int add0, add1;add0 = inode_arraynum.address0;len = inode_arraynum.l
22、ength;if(fp = fopen(image_name, "r+b") = NULL)printf("Can't open file %s.n", image_name);exit(-1);fseek(fp, BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE, SEEK_SET);for(i=0; (i<len)&&(tempi!='0')&&(i < 512); i+)fputc(tempi, fp);if(i = 512)add1 = inode_
23、arraynum.address1;fseek(fp, BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE, SEEK_SET);for(; (i < len) && (tempi != '0'); i+)fputc(tempi, fp);fputc('0', fp);fclose(fp);/功能:釋放文件塊號(hào)為num的文件占用的空間void release_blk(int num)FILE *fp;if(fp=fopen(image_name, "r+b") = NULL)printf(&q
24、uot;Can't open file %sn", image_name);exit(-1);bitmapnum = '0'fseek(fp, num, SEEK_SET);fputc('0', fp);fclose(fp);/ 功能 : 顯示幫助命令void help(void)printf("command: nhelp - show help menu nclear - clear the screen ncd - change directory n mkdir - make directory n create - crea
25、te a new file n open - open a exist file n read - read a file nwrite - write something to a file n close - close a file ndelet - delete a exist file or directory n format - format a exist filesystem n logout - exit user nquit - exit this systemn");/ 設(shè)置文件路徑void pathset()char path50;int m,n;if(in
26、ode_arrayinum_cur.inum = 0) strcpy(path,user.user_name);elsestrcpy(path,user.user_name);m=0;n=inum_cur;while(m != inum_cur)while(inode_arrayn.iparent != m)n = inode_arrayn.iparent;strcat(path,"/");strcat(path,inode_arrayn.file_name);m = n;n = inum_cur;printf("%s$",path);/ 功能: 切換目
27、錄 (cd . 或者 cd dir1)void cd(void)int i;if(argc != 2)printf("Command cd must have two args. n"); return ;if(!strcmp(argv1, ".")inum_cur = inode_arrayinum_cur.iparent;elsefor(i = 0; i < INODENUM; i+) if(inode_arrayi.inum>0)&&(inode_arrayi.type='d')&&(in
28、ode_arrayi.iparent=inum_cur)&& !strcmp(inode_arrayi.file_name,argv1)&&!strcmp(inode_arrayi.user_name,user.use r_name)break;if(i = INODENUM)printf("This directory isn't exsited.n");elseinum_cur = i;/ 功能 : 顯示當(dāng)前目錄下的子目錄和文件 (dir)void dir(void)int i;int dcount=0,fcount=0;shor
29、t bcount=0;if(argc != 1)printf("Command dir must have one args. n");return ;/ 遍歷 i 節(jié)點(diǎn)數(shù)組 , 顯示當(dāng)前目錄下的子目錄和文件名 for(i = 0; i < INODENUM; i+)if(inode_arrayi.inum> 0) && (inode_arrayi.iparent = inum_cur)&&!strcmp(inode_arrayi.user_name,user.user_name) if(inode_arrayi.type = &
30、#39;d') dcount+;printf("%-20s<DIR>n", inode_arrayi.file_name);else fcount+;bytesn",bcount+=inode_arrayi.length; printf("%-20s%12dinode_arrayi.file_name,inode_arrayi.length);printf("n%d file(s)%11dbytesn",fcount,bcount);printf(" %d dir(s) %11d bytes FreeSp
31、acen",dcount,1024*1024-bcount);/ 功能: 在當(dāng)前目錄下創(chuàng)建子目錄 (mkdir dir1)void mkdir(void)int i;if(argc != 2)printf("command mkdir must have two args. n");return ;/ 遍歷 i 節(jié)點(diǎn)數(shù)組 , 查找未用的 i 節(jié)點(diǎn)for(i = 0; i < INODENUM; i+)if(inode_arrayi.inum < 0) break;if(i = INODENUM)printf("Inode is full.n&
32、quot;);exit(-1);inode_arrayi.inum = i;strcpy(inode_arrayi.file_name, argv1); inode_arrayi.type = 'd'strcpy(inode_arrayi.user_name,user.user_name);inode_arrayi.iparent = inum_cur;inode_arrayi.length = 0;save_inode(i);/ 功能: 在當(dāng)前目錄下創(chuàng)建文件 (creat file)void create(void)int i;if(argc != 2)printf(&quo
33、t;command creat must have two args. n");return ;for(i = 0; i < INODENUM; i+)if(inode_arrayi.inum > 0) &&(inode_arrayi.type = 'f') &&!strcmp(inode_arrayi.file_name, argv1) printf("This file is exsit.n");return ;for(i = 0; i < INODENUM; i+)if(inode_array
34、i.inum < 0) break;if(i = INODENUM)printf("Inode is full.n");exit(-1);inode_arrayi.inum = i;strcpy(inode_arrayi.file_name, argv1);inode_arrayi.type = 'f'strcpy(inode_arrayi.user_name, user.user_name);inode_arrayi.iparent = inum_cur;inode_arrayi.length = 0;save_inode(i);/ 功能: 打開當(dāng)前
35、目錄下的文件 (open file1)void open()int i, inum, mode, filenum;if(argc != 2)printf("command open must have two args. n");return ;for(i = 0; i < INODENUM; i+)if(inode_arrayi.inum > 0) &&(inode_arrayi.type = 'f') &&!strcmp(inode_arrayi.file_name,argv1)&&!strcm
36、p(inode_arrayi.user_name,user.user_name)break;if(i = INODENUM)printf("The file you want to open doesn't exsited.n");return ;inum = i;andprintf("Please input open mode:(1: read, 2: write, 3: readwrite):");scanf("%d", &mode);getchar();if(mode < 1) | (mode >
37、3)printf("Open mode is wrong.n");return;for(i = 0; i < FILENUM; i+)if(file_arrayi.inum < 0) break;if(i = FILENUM)printf("The file table is full, please close some file.n");return ;filenum = i;file_arrayfilenum.inum = inum;strcpy(file_arrayfilenum.file_name,inode_arrayinum.f
38、ile_name);file_arrayfilenum.mode = mode;printf("Open file %s by ", file_arrayfilenum.file_name);if(mode = 1) printf("read only.n");else if(mode = 2) printf("write only.n");else printf("read and write.n");/ 功能: 從文件中讀出字符 (read file1) void read()int i, inum;if(ar
39、gc != 2)printf("command read must have two args. n");return;for(i = 0; i < FILENUM; i+)if(file_arrayi.inum > 0) && !strcmp(file_arrayi.file_name,argv1) break;if(i = FILENUM)printf("Open %s first.n", argv1);return ;else if(file_arrayi.mode = 2)printf("Can't
40、read %s.n", argv1);return ;inum = file_arrayi.inum;printf("The length of %s:%d.n", argv1, inode_arrayinum.length); if(inode_arrayinum.length > 0)read_blk(inum);for(i = 0; (i < inode_arrayinum.length) && (tempi != '0'); i+)printf("%c", tempi);/ 功能: 向文件中寫
41、入字符 (write file1)void write()int i, inum, length;if(argc != 2)printf("Command write must have two args. n");return ;for(i = 0; i < FILENUM; i+)if(file_arrayi.inum>0)&&!strcmp(file_arrayi.file_name,argv1) break;if(i = FILENUM)printf("Open %s first.n", argv1);return ;
42、else if(file_arrayi.mode = 1)printf("Can't write %s.n", argv1);return ;inum = file_arrayi.inum;printf("The length of %s:%dn", inode_arrayinum.file_name, inode_arrayinum.length);if(inode_arrayinum.length = 0)i=0;inode_arrayinum.address0 = get_blknum();printf("Input the da
43、ta(CTRL+Z to end):n"); while(i<1023&&(tempi=getchar()!=EOF) i+;tempi='0'length=strlen(temp)+1;inode_arrayinum.length=length;if(length > 512)inode_arrayinum.address1 = get_blknum(); save_inode(inum);write_blk(inum);elseprintf("This file can't be written.n");/
44、功能: 關(guān)閉已經(jīng)打開的文件 (close file1)void close(void)int i;if(argc != 2)printf("Command close must have two args. n");return ;for(i = 0; i < FILENUM; i+)if(file_arrayi.inum > 0) &&!strcmp(file_arrayi.file_name, argv1) break;if(i = FILENUM)printf("This file doesn't be opened.n&
45、quot;); return ;elsefile_arrayi.inum = -1;printf("Close %s success!n", argv1);/ 回收 i 節(jié)點(diǎn),有文件則刪除文件void del(int i)inode_arrayi.inum = -1;if(inode_arrayi.length > 0)release_blk(inode_arrayi.address0);if(inode_arrayi.length >= 512)release_blk(inode_arrayi.address1); save_inode(i);/ 刪除子目錄樹
46、和文件void delet(void)if(argc != 2)printf("Command delete must have two args. n");return ;int n,t,i;stack<int> istk;for(i = 0; i < INODENUM; i+)/查找待刪除子目錄if(inode_arrayi.inum >=0) &&(inode_arrayi.iparent = inum_cur)&& (!strcmp(inode_arrayi.file_name,argv1)&&(!strcmp(inode_arrayi.user_name,user.user_name) n=inode_arrayi.inum;break;if(i=INODENUM) puts("Directory ERROR");elseistk.push(n);while(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國PE粘塵墊數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年醫(yī)用膠帶(布)項(xiàng)目投資價(jià)值分析報(bào)告
- 2025年防腐碳磚項(xiàng)目可行性研究報(bào)告
- 2025年鋼制工作臺(tái)項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國趴地式固定電風(fēng)扇行業(yè)投資前景及策略咨詢研究報(bào)告
- 短期用工合同模板2025年
- 2025年二手車買賣合同范文轎車版式
- 2025年度智能機(jī)器人研發(fā)與應(yīng)用合同規(guī)范
- 土地使用權(quán)出租合同范本
- 2025年單位體檢服務(wù)合同樣本
- 紅樓夢詩詞全集
- 像科學(xué)家一樣思考-怎么做-怎么教-
- 苯胺合成靛紅工藝
- 三年級(jí)上冊數(shù)學(xué)脫式計(jì)算大全600題及答案
- 2024年度農(nóng)村電子商務(wù)ppt演示課件
- 計(jì)算機(jī)控制系統(tǒng) 課件 第10章 網(wǎng)絡(luò)化控制系統(tǒng)的分析與設(shè)計(jì)
- 高原反應(yīng)的癥狀和處理方法
- 南京大學(xué)儀器分析習(xí)題集
- 空調(diào)維保應(yīng)急預(yù)案
- 2023年高考語文全國乙卷作文范文及導(dǎo)寫(解讀+素材+范文)課件版
- 模塊建房施工方案
評(píng)論
0/150
提交評(píng)論