




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課 程 設 計 報 告課程名稱 操作系統 課題名稱 模擬實現單級目錄、單級索引的索引文件系統 專 業 計算機科學與技術 班 級 學 號 姓 名 指導教師 周鐵山 2013年 月 日湖南工程學院課 程 設 計 任 務 書 課程名稱 操作系統 課 題 模擬實現單級目錄、單級索引的索引文件系統 專業班級 計算機1181 學生姓名 學 號 指導老師 周鐵山 審 批 任務書下達日期 2013 年 月 日 任務完成日期 2013年 月 日一、 課程設計的性質和目的操作系統課程設計是計算機專業的專業課程,通過課程設計使學生進一步鞏固課堂所學知識,全面熟悉、掌握操作系統的基本設計方法和技巧,進一步提高分析問題
2、、解決問題及上機操作能力,為將來從事計算機工作打下一定的專業基礎。二、 設計課題課題一:模擬實現單級目錄的FAT文件系統基本思路:用二進制文件空間模擬磁盤空間,用文件塊操作模擬磁盤塊操作。 基本設計要求:1、實現如下文件系統功能(過程或函數):a、 打開文件系統 FILE *OPENSYS(char *filename);b、 關閉文件系統 int CLOSESYS(FILE *stream);c、 顯示目錄 void LISTDIR(void);d、 建立文件 int FCREATE(char *filename);e、 刪除文件 int FDELETE(char *filename);f、
3、 打開文件 int FOPEN(char *filename);g、 關閉文件 int FCLOSE(int fileid);h、 文件塊讀 int FREAD(void *ptr, int n, int fileid);i、 文件塊寫 int FWRITE(void *ptr, int n, int fileid);j、 判斷文件結束 int FEOF(int fileid);k、 獲取文件指針 long FGETPOS(int fileid);l、 設置文件指針 int FSETPOS(int fileid, long offset);m、 取得文件長度 long FGETLEN(char
4、 *filename);2、提供文件系統創建程序3、有功能檢測模塊4、為簡化程序設計,假定目錄區域大小固定。文件系統空間劃分:保留扇區FAT表區(或字節映像圖區)根目錄區文件分區可以使用的C語言文件操縱函數:FILE *fopen(const char *filename, const char *mode);int fclose(FILE *stream);int fseek(FILE *stream, long offset, int whence);long ftell(FILE *stream);size_t fread(void *ptr, size_t size, size_t n
5、, FILE *stream);size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);課題二:模擬實現單級目錄、單級索引的索引文件系統使用鏈接域將同一文件的各索引塊按順序連接起來;其余各項同課題一。三、 課程設計報告要求1、 設計報告要求A4紙打印成冊;2、 使用學院統一的封面;3、 課程設計報告每人一份,必須包含如下幾個方面的內容:1) 基本設計思想;2) 主要數據結構;3) 主要實施流程;4) 所有源代碼;5) 課程設計總結與體會。四、 分組及選題辦法1、 按學號順序一人一組,學號為奇數者為課題一,偶數者為課
6、題二。2、 成績考核按個人課題完成情況、設計報告質量及對課程設計的態度等綜合評定。五、設計進度安排1、 講課及上機調試時間安排: 上機時間:十八周 周一至周三每天上午8:0012:00 2、 其余時間:查閱資料,確定方案,設計課題相關程序。3、 個人答辯,交課程設計報告。主要數據結構提示:1、 單級目錄FAT文件系統:1) 常量 #define BlockSize 512#define DirSize 322) 保留扇區結構struct ReserveBlock int sysblocknum; /*文件系統總扇區數*/ int resblocknum; /*保留扇區扇區數*/ int fat
7、blocknum; /*FAT表扇區數*/ int rootblocknum; /*根目錄區扇區數*/ char fillcharBlockSize-4*sizeof(int);/*填充字節*/;3) 目錄結構 struct DirBlock char filename11; /*文件名限長11個字符*/char fillcharDirSize-4*sizeof(int)-sizeof(long int)-11; /*填充字節*/ long filelen; /*文件長度*/ int year,month,day; /*日期*/ int firstblockaddr; /*文件首塊扇區號*/;
8、 4) FCB(文件控制塊)結構struct FCBBlock int fileid; /*文件標識*/ struct DirBlock fileinfo; /*目錄信息*/ long filepos; /*文件讀寫指針*/ int fdtblockaddr; /*目錄項所在塊號*/ int fdtblockindex; /*目錄項所在塊內序號*/ struct FCBBlock *next;/*指向下一個文件控制塊的指針*/;2、 單級目錄單級索引文件系統:1) 常量 #define BlockSize 512#define DirSize 322) 保留扇區結構struct Reserve
9、Block int sysblocknum; /*文件系統總扇區數*/int resblocknum; /*保留扇區扇區數*/ int mapblocknum; /*字節映像圖扇區數*/ int rootblocknum; /*根目錄區扇區數*/ char fillcharBlockSize-4*sizeof(int); /*填充字節*/;3) 目錄結構 struct DirBlock char filename11; /*文件名限長11個字符*/char fillcharDirSize-4*sizeof(int)-sizeof(long int)-11; /*填充字節*/ long file
10、len; /*文件長度*/ int year,month,day; /*日期*/ int firstindexaddr; /*文件首索引塊扇區號*/; 4) 索引塊結構 struct IndexBlock int dataaddrBlockSize/sizeof(int)-1; /*數據塊塊號數組*/ int nextindexaddr; /*本文件下一索引塊塊號*/; 5) 索引節點結構 struct IndexNode struct IndexBlock block; /*索引塊數據*/ int blockaddr; /*本節點索引塊塊號*/struct IndexNode *nextno
11、de; /*指向下一索引節點的指針*/;6) FCB(文件控制塊)結構struct FCBBlock int fileid; /*文件標識*/ struct DirBlock fileinfo; /*目錄信息*/ long filepos; /*文件讀寫指針*/ int fdtblockaddr; /*目錄項所在塊號*/ int fdtblockindex; /*目錄項所在塊內序號*/struct FCBBlock *next; /*指向下一個文件控制塊的指針*/ struct IndexNode *firstindexnode; /*指向第一個索引節點的指針*/;目錄一、程序的功能1二、程序
12、的基本設計思路1三、主要的數據結構1四、主要實施流程2五、程序調試及其運行結果4六、設計總結與心得體會5七、附錄(源程序清單)7 湖南工程學院課程設計報告 一、程序的功能 該程序主要模擬實現單級目錄、單級索引的索引文件系統,該系統要求能打開文件系統;關閉文件系統;顯示目錄;建立文件;刪除文件;打開文件;關閉文件;文件塊讀;文件塊寫;判斷文件結束;獲取文件指針;設置文件指針;取得文件長度等功能。要求使用鏈接域將同一文件的各索引塊按順序連接起來。二、程序的基本設計思路 模擬實現單級目錄、單級索引的索引文件系統基本思路:用二進制文件空間模擬磁盤空間,用文件塊操作模擬磁盤塊操作。在一個文件系統中對文件
13、進行操作,實現文件的創建、讀寫等等操作。在創建文件時先在目錄項中進行查找,若創建的文件已存在,文件的創建首先檢驗目錄是否為空,為空則把文件夾或文件連接到該目錄下,不為空則把檢查目錄下是否有同名文件夾或文件,有則提示創建不成功,而文件夾打開是則把文件夾名稱及其地址壓入打開文件夾棧,文件關閉則把文件夾名稱及其地址從打開文件夾棧中拋出。文件夾和文件的刪除,文件夾下沒有打開的文件或文件沒有打開才能刪除,否則刪除失敗,每次操作成功都要更改目錄和FCB信息。該過程都保存在文件中,是對文件的操作。本系統建于Windows平臺,開發環境為WIN-TC。三、主要的數據結構1.常量#define BlockSiz
14、e 512#define DirSize 322.保留扇區結構struct ReserveBlockint sysblocknum; /*文件系統總扇區數*/int resblocknum; /*保留扇區扇區數*/int mapblocknum; /*字節映像圖扇區數*/int rootblocknum; /*根目錄區扇區數*/char fillcharBlockSize-4*sizeof(int); /*填充字節*/;3.目錄結構struct DirBlockchar filename11; /*文件名限長11個字符*/char fillcharDirSize-4*sizeof(int)-s
15、izeof(long int)-11; /*填充字節*/long filelen; /*文件長度*/int year,month,day; /*定義年月日*/int firstindexaddr; /*文件首索引塊扇區號*/; 4.索引塊結構struct IndexBlockint dataaddrBlockSize/sizeof(int)-1; /*數據塊塊號數組*/int nextindexaddr; /*本文件下一索引塊塊號*/; 5.索引節點結構 struct IndexNodestruct IndexBlock block; /*索引塊數據*/int blockaddr; /*本節點
16、索引塊塊號*/struct IndexNode *nextnode; /*指向下一索引節點的指針*/;6.FCB(文件控制塊)結構struct FCBBlockint fileid; /*文件標識*/struct DirBlock fileinfo; /*目錄信息*/long filepos; /*文件讀寫指針*/int fdtblockaddr; /*目錄項所在塊號*/int fdtblockindex; /*目錄項所在塊內序號*/struct FCBBlock *next; /*指向下一個文件控制塊的指針*/ struct IndexNode *firstindexnode; /*指向第一
17、個索引節點的指針* /四、主要實施流程用到的某些函數流程圖 圖一、FCLOSE函數 圖二、FCREATE 函數 圖三、FDELETE函數 圖四、OPENSYS 函數五、 程序調試及其運行結果 下面是程序調試時的一些截圖。 圖五、輸入扇區塊數 圖六、 成功創建文件 圖七、未打開文件,不能進行寫操作 圖八、 成功刪除文件 圖九、文件刪 之后不能打開,顯示不能找到文件六、設計總結與心得體會這次課程設計對我們來說很重要,從中我也是收益很多。也有很多感受。 第一,通過這次C語言程序設計,讓我更深地體會到了上機操作有助于將書本上的知識系統化、現實化,更加鍛煉了我自己的查漏補缺的能力。
18、書本上的知識永遠是死的,只有將其運用到實際的生活中才會變成活的,而課設恰好給了我們這樣一個機會。 第二,課程設計是一個綜合性的課程,不僅能檢測我們的學習這門課的熟練程度,還能讓我們溫習課程,達到復習和鞏固的效果,在課程設計的過程中我們不斷地遇到問題,不斷的在圖書館和網上、書本上查找資料,不斷的向老師、同學請教問題,所以慢慢的解決問題,而這就是一個不斷提升自己的過程。課程設計也教會了我們怎么樣利用自己身邊有的資源,如書本、網絡、老師和同學,怎樣和同學互相學習、互相幫助、互相合作。 總的來說,此次課程設計算是個較為完整的程序,將學到過的知識鞏固,吃透。尤其是答辯的時候,老師問的
19、問題更加是考驗你的基礎,當你掌握的很好的時候,將知識融會貫通的時候,回答問題當然容易。當然我沒有很好掌握,所以沒有回答出老師的問題。這也是我得到的一筆財富:知識并不是僅僅從課堂上學到的就夠了,課堂上的知識僅僅只是一個引導作用七、附錄源程序代碼#include <stdio.h>#include <string.h>#include <stdlib.h>#define BlockSize 512#define DirSize 32#define RootSize 2struct ReserveBlock int sysblocknum;/*文件系統總扇區數*/
20、 int resblocknum;/*保留扇區扇區數*/ int fatblocknum;/*FAT表扇區數*/ int rootblocknum;/*根目錄區扇區數*/ char fillcharBlockSize-4*sizeof(int);/*填充字節*/;struct DirBlock char filename11; /*文件名限長11個字符*/ char fillcharDirSize-4*sizeof(int)-sizeof(long int)-11; /*填充字節*/ long filelen; /*文件長度*/ int year,month,day; /*日期*/ int f
21、irstblockaddr; /*文件首塊扇區號*/;struct FCBBlock int fileid; /*文件標識*/ struct DirBlock fileinfo; /*目錄信息*/ long filepos; /*文件讀寫指針*/ int fdtblockaddr; /*目錄項所在塊號*/ int fdtblockindex; /*目錄項所在塊內序號*/ struct FCBBlock *next;/*指向下一個文件控制塊的指針*/;struct ReserveBlock sys1;struct FCBBlock *fcb;struct DirBlock fil32,*dir;
22、/*目錄項*/int *fat1;char *str,*ptr;char fillcharBlockSize;FILE *fp;FILE *OPENSYS(char *filename) int i; fp=fopen(filename,"rb+"); fread(&sys1,1,BlockSize,fp); fat1=(int *)malloc(sys1.sysblocknum); for(i=0;i<sys1.fatblocknum;i+) fread(fat1,sizeof(int)*sys1.sysblocknum,1,fp);/*把基本文件系統都讀進
23、來*/ fseek(fp,(sys1.fatblocknum+sys1.resblocknum)*BlockSize,0);/*改指針位置*/ dir=fil;/*目錄指針*/ fread(dir,DirSize*32,1,fp); return fp; int CLOSESYS(FILE *stream) int i; fseek(stream,sys1.resblocknum*BlockSize,0); fwrite(fat1,sizeof(int)*sys1.sysblocknum,1,stream); fseek(fp,(sys1.fatblocknum+sys1.resblocknu
24、m)*BlockSize,0); fwrite(dir,DirSize*32,1,fp); fclose(fp); return 1;void LISTDIR(void)/*顯示目錄*/ int i,flag=0; for(i=0;i<32;i+) if(fili.firstblockaddr!=0) if(flag=0) printf("filename n"); flag=1; /*標示*/ printf("%sn",fili.filename); int FCREATE(char *filename)/*建立文件*/ int i,flag=0
25、,j,k=0,flag1=0,flag2=0,a; int n,m; while(1) a=strlen(filename);/*文件名長度*/ if(a>10) printf("This file length too long!n"); printf("input file name again:"); scanf("%s",filename); else break; while(1) for(i=0;i<32;i+) if(strcmp(filename,fili.filename)=0) printf("
26、;the name already exist n"); printf("input name again:"); flag1=1; break; if(flag1=0) break; scanf("%s",filename); flag1=0; for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i<sys1.sysblocknum;i+) if(fat1i=0) flag+;/*統計磁盤上為空數目*/ if(flag=0) printf("ci pan yi
27、 man");/*統計結果為0,則磁盤已滿*/ return 0; printf("kong xian kuai shu:%dn",flag); printf("input file length:"); for(j=0;j<32;j+) if(filj.firstblockaddr=0) break; while(1) scanf("%d",&dirj.filelen);/*輸入目錄項中文件的長度*/ n=(dirj.filelen/BlockSize)+(dirj.filelen%BlockSize?1:0
28、); if(n<0|n>flag)/*文件長度小于0或大于空閑的空間 */ printf("input length too long!n"); printf("input again:"); else break; for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i<sys1.sysblocknum;i+)/*文件內容區域*/ if(fat1i=0) k+; if(flag2=0) dirj.firstblockaddr=i+1; flag2=1; else if
29、(k>=n)/*n 文件長度*/ fat1m=i+1; fat1i=-1; break; else fat1m=i+1; m=i; strcpy(dirj.filename,filename); dirj.filenamea='0' printf("input year:"); scanf("%d",&dirj.year); printf("input month:"); scanf("%d",&dirj.month); printf("input day:"
30、;); scanf("%d",&dirj.day); return (1);int FDELETE(char *filename)/*刪除文件 */int i,j,k,n,flag=0; struct FCBBlock *p;/*文件控制塊指針*/ p=fcb; while(p)if(strcmp(filename,filp->fdtblockindex.filename)=0)/*目錄項所在序號 */ printf("the file has open,please close it before delete !n"); return
31、0; else p=p->next; for(i=0;i<32;i+)/*查找要關閉的文件 */ if(strcmp(filename,fili.filename)=0) flag=1; break; if(flag=0)printf("file cannot find!n");return 0;j=fili.firstblockaddr;while(1) k=fat1j-1; fseek(fp,(j-1)*BlockSize,0);/*將指針指向文件的第一個扇區的位置 */ fwrite(&fillchar,1,BlockSize,fp); fat1j
32、-1=0; if(k=-1) break; else j=k;memset(&fili,0,DirSize);return 1;int FOPEN(char *filename)/*打開文件*/ int i,j=0,k,flag=0; struct FCBBlock *p,*q,*r; p=fcb; for(i=0;i<32;i+) if(strcmp(filename,fili.filename)=0)/*找到要打開的文件*/ flag=1; break; if(flag=0) printf("file cannot find!n"); return 0;
33、while(p) j+; if(strcmp(filename,filp->fdtblockindex.filename)=0) printf("This file has open!n"); return 0; q=p; p=p->next; if(fcb=NULL) fcb=(struct FCBBlock *)malloc(sizeof(struct FCBBlock); fcb->fileid=j+1;/*文件標示*/ fcb->filepos=0;/*文件讀寫指針 */ fcb->next=NULL;/*指向下一個文件控制指針 */
34、fcb->fdtblockindex=i; else r=(struct FCBBlock *)malloc(sizeof(struct FCBBlock); r->fileid=j+1; r->filepos=0; r->next=NULL; r->fdtblockindex=i; q->next=r; /*f->next=NULL; */ return 1;long FGETLEN(int fileid)/*獲取文件指針 */ struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid)/*
35、尋找要找的指針*/ return(p->filepos); p=p->next; printf("get faile!n"); return(0);int FCLOSE(char *filename)/*關閉文件 */ int flag=0; struct FCBBlock *f,*p; f=fcb; if(strcmp(filename,filfcb->fdtblockindex.filename)=0) flag=1; fcb=fcb->next; p=fcb; while(p) p->fileid-=1; p=p->next; re
36、turn flag; p=f; f=f->next; while(f) if(strcmp(filename,filf->fdtblockindex.filename)=0) flag=1; p=f->next; /*p=p->next;*/ while(p) p=p->next; p->fileid-=1; free(f); return flag; p=f; f=f->next; if(flag=0) printf("This file has not open!n'"); return flag; return 0;i
37、nt FREAD(char *str, int n, int fileid)/*文件塊讀*/ int m,i,j=0,k,l,len; char a3; struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid) break; else p=p->next; len=filp->fdtblockindex.filelen;/*文件長度*/ l=p->filepos;/*文件讀寫指針:該塊在文件的相對位置*/ printf("now file pos is:"); printf("%dn&
38、quot;,l); printf("is writing as now file pos?(y/n):"); scanf("%s",a); if(a0='n'|a0='N') printf("input pos:"); while(1) scanf("%d",&l); if(filp->fdtblockindex.filelen<(l+n)/*? */ printf("too large!ninput again:"); else break;
39、 while(1) if(n>filp->fdtblockindex.filelen) printf("too large!n"); printf("input read size,again:"); scanf("%d",&n); else break; str=(char *)malloc(filp->fdtblockindex.filelen+1); m=(len/BlockSize)+(len%BlockSize?1:0); k=filp->fdtblockindex.firstblockadd
40、r; if(m>1) fseek(fp,(k-1)*BlockSize,0); fread(str,BlockSize,1,fp); k=fat1k-1; for(i=1;i<(m-1);i+) fseek(fp,fat1k-1*BlockSize,0); fread(&stri*BlockSize,BlockSize,1,fp); k=fat1k-1; fseek(fp,(k-1)*BlockSize,0); fread(&stri*BlockSize,len-i*BlockSize,1,fp); else fseek(fp,(k-1)*BlockSize,0);
41、 fread(str,len,1,fp); strn+l='0' if(l!=0) str=&strl; p->filepos=n+l; printf("%sn",str); return 1; void FWRITE(char *ptr, int n, int fileid) char a3; long l; int m,i=0,j,k=0,num,flag=0,flag1=0,b; struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid) break; else p=p->
42、next; l=p->filepos; printf("now file pos is:"); printf("%dn",l); printf("is writing as now file pos?(y/n):"); scanf("%s",a); if(a0='n'|a0='N') printf("input pos:"); while(1) scanf("%d",&l); if(filp->fdtblockindex.f
43、ilelen<(l+n) printf("too large!ninput again:"); else break; j=(l/BlockSize)+(l%BlockSize?1:0); if(l=0) j=1; num=filp->fdtblockindex.firstblockaddr; for(i=1;i<j;i+) num=fat1num; do if(flag=0) fseek(fp,(num-1)*BlockSize+l-(i-1)*BlockSize,0); flag=1; else fseek(fp,(num-1)*BlockSize,0
44、); num=fat1num-1; if(n+l)-(i-1)*BlockSize)>BlockSize ) if(flag1=0) fwrite(&ptr0,j*BlockSize-l,1,fp); flag1=1; else fwrite(&ptrj*BlockSize-l+k*BlockSize,BlockSize,1,fp); else m=j*BlockSize-l+(k-1)*BlockSize; b=n-(j*BlockSize-l+(k-1)*BlockSize); fwrite(&ptrm,b,1,fp); k+; i+; while(n+l)-
45、(i-1)*BlockSize)>1); p->filepos=l+n;int FEOF(int fileid) int flag; struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid) break; if(p->filepos>filp->fdtblockindex.filelen) return 0; else return 1;long FGETPOS(int fileid)struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid)
46、return (p->filepos); else p=p->next; printf("get faile!n"); return(0);int FSETPOS(int fileid, long offset)struct FCBBlock *p; p=fcb; while(p) if(p->fileid=fileid) while(offset>filp->fdtblockindex.filelen|offset<0) printf("set error!This pos >file lengthn"); p
47、rintf("input file pos ,again:"); scanf("%d",offset); p->filepos=offset; return 1; else p=p->next; printf("get faile!n"); return(0);void DISPLAY() printf("tt please input you order:n"); printf("tt 建立文件:creatn"); printf("tt 顯示目錄:listn"); printf("tt 刪除文件:deln"); printf("tt 打開文件:openn"); prin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- HY/T 0460.5-2024海岸帶生態系統現狀調查與評估技術導則第5部分:珊瑚礁
- 起重平臺維修合同協議
- 解除商鋪轉讓合同協議
- 貨運物流租賃合同協議
- 豆皮代加工合同協議
- 豆腐經銷代理合同協議
- 購房合同轉讓合同協議
- 講課合作協議合同協議
- 貼牌加工合同合同協議
- cdr考試試題及答案2015
- 2025年導游從業資格通關秘籍
- 中國法院知識產權司法保護狀況2024
- 外賣配送員工作流程總結
- 新式茶飲產業的技術發展現狀與未來創新趨勢
- 【國浩律師事務所】2025中國企業出海戰略與法律支持需求調研報告
- 2025中國低空經濟城市發展指數報告
- 湖南省長沙市岳麓區湖南師范大學附中2025屆高三下學期第六次檢測化學試卷含解析
- 蘭州2025年中國農業科學院蘭州畜牧與獸藥研究所招聘16人筆試歷年參考題庫附帶答案詳解
- 課題申報書:教育強國背景下加快構建現代職業教育體系研究
- 山東省公共衛生臨床中心招聘考試真題2024
- 貴州國企招聘2024貴州頁巖氣勘探開發有限責任公司招聘42人筆試參考題庫附帶答案詳解
評論
0/150
提交評論