实验四 文件系统实验
- 格式:doc
- 大小:130.00 KB
- 文档页数:24
广州大学学生实验报告开课学院及实验室:计算机科学与工程实验室 2015 年12 月8日实验课操作系统实验成绩程名称实验项实验4 文件系统指导老师陈康民目名称一、实验目的1. 对文件管理有进一步了解2. 利用文件备份实验加深对文件管理的了解3. 熟悉fopen()、fread()、 fwrite()、fclose() 的使用二、实验内容利用函数fopen(), fread(), fwrite(), fclose() 来实现简单的文件备份,即将一个文件的内容拷贝到另一个文件中去。
三、实验原理利用函数fopen(), fread(), fwrite(), fclose() 来实现简单的文件备份四、实验设备PC(操作系统:Fedora,含GCC)五、实验要求完成利用函数fopen(), fread(), fwrite(), fclose() 来实现简单的文件备份,即将一个文件的内容拷贝到另一个文件中去。
并进行分析参考程序提供错误解决方案。
六、实验程序9.c:#include <sys/types.h>#include <stdio.h>#include <stdlib.h>int main(void){char buf; //建立缓冲区FILE *source, *backup; //设立FILE结构指针if ((source = fopen("source.dat", "r")) == NULL) //若以只读形式source.dat成功打开,则fopen()返回FILE指针source{printf("Error in opening file.\n");exit(1);}if ((backup = fopen("backup.dat", "w")) == NULL) //若以只写形式backup.dat无法打开,则创建文件不成功{printf("Error in creating file.\n");exit(1);}while (fread(&buf, sizeof(buf), 1, source) == 1) //用fread函数读取source的一个buf大小的数据到缓冲区{if (fwrite(&buf, sizeof(buf), 1, backup) == 0) //用fwrite函数把一个buf大小的缓冲区数据写入backup{//若写入错误,则打印“写入文件错误”printf("Error in wrinting file.\n");exit(1);}}if (ferror(source)) //读取文件source出现错误{printf("Error in reading file.\n");exit(1);}if (fclose(source)) //source流的关闭出现错误{printf("Error in close file.\n");exit(1);}if (fclose(backup)) //backup流的关闭出现错误{printf("Error in close file.\n");exit(1);}return 0;}9.c结果截图实验结果1:源文件source.dat内容如下:编译运行后多了个Backup.dat文件实验分析1:此方案1,用char buf;重新定义缓冲区,程序中if (!(source = fopen("source.dat", "r")))和if (!(backup = fopen("backup.dat", "w")))中的表达式虽然没有错误,但这种写法不太好,因fopen()返回的是一个地址或者空值,这样写会影响程序的可读性,同时在某些机器上可能引发错误,所以改为if ((source = fopen("source.dat", "r")) == NULL)和if ((backup = fopen("backup.dat", "w")) == NULL)。
实验4:文件管理实验
一、目的:
1、加深对文件、目录、文件系统等概念的理解。
2、掌握Linux 文件系统的目录结构。
3、掌握有关Linux 文件系统操作的常用命令。
4、了解有关文件安全性方面的知识。
二、条件:
需要一个Linux的环境
1、在Win10系统启用Linux子系统
2、在Win10应用商店安装Ubuntu应用
3、
三、过程:
1、浏览文件系统
用到pwd、ls、mkdir、cd命令
不带参数的cd命令,工作目录回到了用户的默认目录
cd ../.. 执行后,工作目录回到了/根目录
2、查看文件
用到data、head、tail、ls、man、date、cp、mv、rm命令
man date
建立链接后第2个字段从1变成2
3、文件查找和目录
用到了find、grep命令
4、修改文件存取权限
chmod命令
四、总结:Linux是一个多用户的现代操作系统,提供了丰富和强大的文件管理的命令。
掌握这些命令对于我们深入Linux学习是必需的。
实验四文件管理实验◆实验名称:文件管理实验◆仪器、设备:计算机◆参考资料:操作系统实验指导书◆实验目的:设计一个n个用户的文件系统,用户在一次运行中只能打开一个文件,有Create、delete、open、close、read、write等命令。
◆实验内容:为DOS系统设计一个简单的二级文件系统。
要求可以实现下列几条命令CREATE 创建文件DELETE 删除文件OPEN 打开文件CLOSE 关闭文件READ 读文件WRITE 写文件◆实验原理、数据(程序)记录:#define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/#define MAXCHILD 50 /*the largest child*/#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/void CreateF() /*Create File*/{int fpaddrno,flag=1,i;char fname[MAXNAME],str[50],str1[50],strtext[255],a[25];char fmode[25];int FindPANo(); /*find out physical address num*/int WriteF1(); /*write file*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0){printf("\nError. You must create file in your own dir.\n");wgetchar=1;}else{ printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));if (ExistF(fname)>=0){printf("\nError. Name \'%s\' has already existed.\n",fname);wgetchar=1;} else{printf("Please input FileMode(0-Read Only, 1-Write Only, 2-Read and Write, 3-Protect):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)||(strcmp(fmode ,"3")==0)){fpaddrno=FindPANo();if (fpaddrno>=0){i=ExistD(username);strcpy(ufd[i]->ufdfile[fcount[i]].fname,fname);ufd[i]->ufdfile[fcount[i]].fpaddr=fpaddrno;ufd[i]->ufdfile[fcount[i]].fmode=atoi(fmode);ifopen[i][fcount[i]].ifopen=0;ifopen[i][fcount[i]].openmode=4;strcpy(str,"c:\\osfile\\file\\file");itoa(fpaddrno,str1,10);strcat(str,str1);fp_file=fopen(str,"wb");fclose(fp_file);fcount[i]++;while(flag){printf("Input text now(Y/N):");gets(a);ltrim(rtrim(a));ufd[i]->ufdfile[fcount[i]-1].flength=0;if(strcmp(strupr(a),"Y")==0){fp_file=fopen(str,"wb+");ufd[i]->ufdfile[fcount[i]-1].flength=WriteF1();flag=0;} else if(strcmp(strupr(a),"N")==0){flag=0;wgetchar=1;}} printf("\n\'%s\' has been created successfully!\n",fname);} else{printf("\nFail!No Disk Space. Please format your disk.\n");wgetchar=1;}} else {printf("\nError. FileMode\'s Range is 0-3\n");wgetchar=1;}}}}int ExistF(char *filename) /*Whether FileName Exist,Exist-i,Not Exist-0*/{int i,j;int exist=0;int ExistD(char *dirname);j=ExistD(dirname);for(i=0;i<fcount[j];i++)if (strcmp(strupr(ufd[j]->ufdfile[i].fname),strupr(filename))==0){exist=1;break;}if (exist) return(i);else return(-1);}int FindPANo() /*find out physical address num*/{int i;for(i=0;i<MAX;i++)if (fpaddrno[i]==0) {fpaddrno[i]=1;break;}if (i<MAX) return(i);else return(-1);}int WriteF1() /*write file*/{int length=0;char c;printf("Please input text(\'#\' stands for end):\n");while((c=getchar())!='#'){fprintf(fp_file,"%c",c);if (c!='\n') length++;} fprintf(fp_file,"\n");fclose(fp_file);return(length);}******************************************************************************* void DeleteF() /*Delete File*/{char fname[MAXNAME];char str[50],str1[50];int i,j,k,flag=1;char a[25]; /*whether delete*/char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0){printf("\nError. You can only delete file in your own dir.\n");wgetchar=1;}else{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1){printf("\nError. \'%s\' is in open status. Close it before delete.\n",fname);wgetchar=1;}else{while(flag){printf("\'%s\' will be deleted. Are you sure(Y/N):",fname);gets(a);ltrim(rtrim(a));if(strcmp(strupr(a),"Y")==0){fpaddrno[ufd[k]->ufdfile[i].fpaddr]=0;itoa(ufd[k]->ufdfile[i].fpaddr,str,10);for(j=i;j<fcount[k]-1;j++){strcpy(ufd[k]->ufdfile[j].fname,ufd[k]->ufdfile[j+1].fname);ufd[k]->ufdfile[j].fpaddr=ufd[k]->ufdfile[j+1].fpaddr;ufd[k]->ufdfile[j].flength=ufd[k]->ufdfile[j+1].flength;ufd[k]->ufdfile[j].fmode=ufd[k]->ufdfile[j+1].fmode;ifopen[k][j]=ifopen[k][j+1];}fcount[k]--;strcpy(str1,"c:\\osfile\\file\\file");strcat(str1,str);remove(str1);flag=0;printf("\n\'%s\' has been deleted successfully.\n",fname);wgetchar=1;}else if(strcmp(strupr(a),"N")==0){printf("\nError. \'%s\' hasn\'t been deleted.\n",fname);wgetchar=1;flag=0;}}}}else {printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}******************************************************************************* void OpenF() /*Open File*/{char fname[MAXNAME];char str[25],str1[25],fmode[25];int i,k;char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0){printf("\nError. Please change to ufd dir before open.\n");wgetchar=1;return;}printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(dirname);if(!ifopen[k][i].ifopen){if (ufd[k]->ufdfile[i].fmode==3){printf("\nError. The file\'s mode is FORBID. Can not open.\n");wgetchar=1;}else{printf("Please input FileOpenMode(0-Read Only,1-Write Only,2-Read and Write):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)){if(fmode[0]=='0') /*open file with read only mode*/{strcpy(str,"read only");if((ufd[k]->ufdfile[i].fmode==0)||(ufd[k]->ufdfile[i].fmode==2)) ifopen[k][i].ifopen=1;}else if(fmode[0]=='1') /*open file with write only mode*/{strcpy(str,"write only");if((ufd[k]->ufdfile[i].fmode==1)||(ufd[k]->ufdfile[i].fmode==2)) ifopen[k][i].ifopen=1;}else if(fmode[0]=='2') /*open file with read and write mode*/{strcpy(str,"read and write");if(ufd[k]->ufdfile[i].fmode==2) ifopen[k][i].ifopen=1;}if(ufd[k]->ufdfile[i].fmode==0) strcpy(str1,"read only"); /*FileMode*/else if(ufd[k]->ufdfile[i].fmode==1) strcpy(str1,"write only");else if(ufd[k]->ufdfile[i].fmode==2) strcpy(str1,"read and write");if(ifopen[k][i].ifopen==1){ifopen[k][i].openmode=atoi(fmode);if (ifopen[k][i].openmode==0) strcpy(str,"read only");else if(ifopen[k][i].openmode==1) strcpy(str,"write only");else if(ifopen[k][i].openmode==2) strcpy(str,"read and write");printf("\n\'%s\' has been opened. OpenMode is %s,FileModeis %s\n",fname,strupr(str),strupr(str1));wgetchar=1;} else{printf("\nError. \'%s\' hasn\'t been opened. OpenMode Error. OpenMode is %s,but FileMode is %s\n",fname,strupr(str),strupr(str1));wgetchar=1;}} else {printf("\nError. FileOpenMode\'s Range is 0-2\n");wgetchar=1;}}} else {printf("\nError. \'%s\' is in open status.\n",fname);wgetchar=1;}} else{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}******************************************************************************* void CloseF() /*Close File*/{int i,k,n=0;char fname[MAXNAME];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0){printf("\nError. Please convert to ufd dir before close.\n");wgetchar=1;return;}k=ExistD(dirname);printf("\nOpen File(s) In This Ufd:\n"); /*display openned file*/for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1) {printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");} printf("\n%d files openned.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){ifopen[k][i].ifopen=0;ifopen[k][i].openmode=4;printf("\n\'%s\' has been closed successfully.\n",fname);wgetchar=1;} else {printf("\nError.\'%s\' is in closing status.\n",fname);wgetchar=1;}} else {printf("\nError. \'%s\' is not exist.\n",fname);wgetchar=1;}}}******************************************************************************* void ReadF() /*Read File*/{int i,k,n=0;char fname[MAXNAME];char str[255],str1[255],c;char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) {printf("\nError.Please convert to ufd dir before read.\n");wgetchar=1;return;}printf("\nCaution:Open file first\n");printf("Opened File(s) List:\n");k=ExistD(dirname);for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1)if ((ifopen[k][i].openmode==0) ||(ifopen[k][i].openmode==2)){printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d files openned.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){if((ifopen[k][i].openmode==0) ||(ifopen[k][i].openmode==2)){itoa(ufd[k]->ufdfile[i].fpaddr,str,10);strcpy(str1,"file");strcat(str1,str);strcpy(str,"c:\\osfile\\file\\");strcat(str,str1);fp_file=fopen(str,"rb");fseek(fp_file,0,0);printf("\nThe text is:\n\n");printf(" ");while(fscanf(fp_file,"%c",&c)!=EOF)if (c=='\n') printf("\n ");else printf("%c",c);printf("\n\n%d Length.\n",ufd[k]->ufdfile[i].flength);fclose(fp_file);wgetchar=1;}else{printf("\nError.\'%s\' has been opened with WRITE ONLY mode. It isn\'tread.\n",fname);wgetchar=1;}}else {printf("\nError.\'%s\' is in closing status. Please open it beforeread\n",fname);wgetchar=1;}}else {printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}******************************************************************************* void WriteF() /*Write File*/{int i,k,n=0;char fname[MAXNAME];char str[50],str1[50],a[50];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);int WriteF1(); /*write file*/if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) {printf("\nError. Please convert to ufd dir before write.\n");wgetchar=1;return;}k=ExistD(dirname);printf("\nOpen File(s) with write only mode or read and write mode:\n");/*display openned files with writable mode*/for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1)if ((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2)){printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d files open.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){if((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2)){itoa(ufd[k]->ufdfile[i].fpaddr,str,10);strcpy(str1,"file");strcat(str1,str);strcpy(str,"c:\\osfile\\file\\");strcat(str,str1);if (ufd[k]->ufdfile[i].flength!=0){printf("\n\'%s\' has text. Overwrite or Append(O-overwrite,A-Append,else-not write):",fname);gets(a);ltrim(rtrim(a));if (fp_file!=NULL) fclose(fp_file);if (strcmp(strupr(a),"O")==0){printf("\nOverwrite\n");fp_file=fopen(str,"wb");ufd[k]->ufdfile[i].flength=0;ufd[k]->ufdfile[i].flength=WriteF1();}else if(strcmp(strupr(a),"A")==0){printf("\nAppend\n");fp_file=fopen(str,"ab");ufd[k]->ufdfile[i].flength=ufd[k]->ufdfile[i].flength+WriteF1();}else{printf("\nError.\'%s\' has not been written.\n",fname);fclose(fp_file);wgetchar=1;} }else{fp_file=fopen(str,"wb");ufd[k]->ufdfile[i].flength=WriteF1();}}else{printf("\nError. \'%s\' has been opened with read only mode.It isn\'twrited.\n",fname);wgetchar=1;}}else{printf("\nError. \'%s\' is in closing status. Please open it beforewrite\n",fname);wgetchar=1;}}else{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}◆实验结果及分析通过实验实现了有Create、delete、open、close、read、write等命令的简单的文件系统。
实验四文件操作一、实验目的1.熟悉和理解文件系统的概念和文件系统的类型。
2.掌握文件系统的挂载方法。
3.学会Linux中数据备份的方法。
4.了解Linux系统中文件系统的管理机制。
二、实验内容1.挂载文件系统。
2.监视文件系统状态。
3.维护文件系统。
4.软盘的使用。
5.硬盘的使用。
6.数据备份和压缩。
7.在GNOME下管理磁盘三、实验环境1.装有Linux系统的计算机。
2.软磁盘和光盘各一张。
四、实验步骤(一)挂载文件系统1.手工挂载文件系统①用mount命令挂载文件系统。
命令格式:mount [-fnrvw] [-t type] device dir其中:-t type:指定文件系统类型;device:待安装文件系统的块设备名;dir:安装点(目录);-f: 模拟一个文件系统的挂装过程,用它可以检查一个文件系统是否可以正确挂装。
-n:挂装一个文件系统,但不在fstab文件中生成与之对应的设置项。
-v:命令进展注释,给出mount命令每个操作步骤的注释。
-r:将文件系统挂载为只读模式;-w:将文件系统挂载为读写模式。
操作:在软驱中插入一张磁盘,然后将软驱挂载为msdos文件类型。
②挂载软磁盘的命令:mount -t msdos /dev/fd0 /mnt/floppy挂载完成后,用ls命令查看软磁盘中包括的文件。
③用mount命令还可以显示所有已安装的文件系统。
命令格式:mount [-hV]2.手工卸载文件系统用umount命令卸载文件系统。
命令格式:umount [-hV]umount [-a] [-n] [-v] [-t types]其中:-h:显示帮助信息。
-V:显示版本信息。
-a:表示要卸载/etc/fstab中的所有文件系统;-n:卸除时不要将信息存入/etc/mtab文件中。
-v:执行时显示详细的信息。
-t types:指定文件系统的类型。
操作:卸载软盘的msdos文件系统。
①命令:umount -t msdos /dev/fd0卸载完成后,从软盘驱动器中取出软盘。
实验四磁盘和文件系统管理心得前言实验四主要涉及磁盘和文件系统的管理,通过对磁盘分区、文件系统格式化、文件的创建、删除和修改等操作,我们能够更好地理解和掌握磁盘和文件系统的相关概念和原理。
本文将从以下几个方面对实验四的心得进行全面、详细、完整且深入地探讨。
磁盘分区的原理与方法磁盘分区是指将一个物理硬盘分成多个逻辑区域的操作。
通过对磁盘进行合理分区,可以充分利用磁盘空间,并为不同用途的数据提供不同的存储空间。
磁盘分区有两种常见的方法:主引导记录(Master Boot Record,MBR)分区和GUID分区表(GUID Partition Table,GPT)。
MBR分区MBR分区是一种传统的分区方式,适用于BIOS引导的系统。
MBR分区表将硬盘的第一个扇区(512字节)用于存储分区表的信息,包括主引导记录、分区表项等。
MBR分区最多支持4个主分区或3个主分区加一个扩展分区。
其中,扩展分区可以进一步划分逻辑分区。
GPT分区GPT分区是一种新的分区方式,适用于UEFI引导的系统。
GPT分区通过GUID(全局唯一标识符)来标识分区,解决了MBR分区的一些限制,如只能支持最多4个主分区等。
GPT分区表存储在硬盘末尾的一个独立区域,可以容纳更多的分区信息。
文件系统的选择与格式化文件系统是操作系统用来管理和组织文件的一种方式。
常见的文件系统有FAT32、NTFS、ext4等。
在进行文件系统格式化之前,我们需要选择适合自己需求的文件系统。
FAT32文件系统FAT32是一种通用的文件系统,在各个操作系统中都能够良好地兼容。
它支持的单个文件最大为4GB,簇大小可以灵活配置。
然而,FAT32文件系统对于大容量硬盘的利用率较低,而且不支持文件权限和加密等高级功能。
NTFS文件系统NTFS是Windows操作系统中常用的文件系统,它支持大容量硬盘,单个文件最大支持16TB。
NTFS文件系统具有更高的稳定性和安全性,支持文件权限、加密和压缩等功能。
实验四磁盘和文件系统管理心得实验四磁盘和文件系统管理心得一、实验背景磁盘和文件系统管理是计算机操作系统中非常重要的一部分,它涉及到了计算机存储和数据管理的方方面面。
在本次实验中,我们主要学习了磁盘的分区、格式化以及文件系统的创建与管理等内容。
二、实验过程1. 磁盘分区在Windows操作系统中,我们可以通过“磁盘管理”来对硬盘进行分区。
首先需要在“我的电脑”中找到硬盘驱动器,右键点击选择“管理”,进入“计算机管理”界面后,在左侧的菜单栏中选择“磁盘管理”,然后就可以对硬盘进行分区操作了。
2. 磁盘格式化在将硬盘进行分区之后,我们还需要对每个分区进行格式化。
格式化可以将硬盘上的数据清空,并为其创建一个新的文件系统。
在Windows操作系统中,我们同样可以通过“磁盘管理”来进行格式化操作。
3. 文件系统创建与管理在Linux操作系统中,我们可以使用mkfs命令来创建文件系统。
例如,在Ubuntu下创建ext4文件系统时,可以使用以下命令:sudo mkfs.ext4 /dev/sdb1其中,“/dev/sdb1”表示要创建文件系统的设备名称。
除了创建文件系统之外,我们还可以使用一些命令来管理文件系统。
例如,使用mount命令可以将文件系统挂载到指定的目录下:sudo mount /dev/sdb1 /mnt此时,/dev/sdb1设备上的文件系统就会被挂载到/mnt目录下。
另外,我们还可以使用umount命令来卸载已经挂载的文件系统:sudo umount /mnt三、实验心得通过本次实验,我对磁盘和文件系统管理有了更深入的了解。
在实际应用中,我们需要根据具体情况来对磁盘进行分区和格式化,并创建适合自己的文件系统。
同时,在管理文件系统时,我们也需要注意保护数据安全,并遵循相关规范和标准。
总之,在今后的学习和工作中,我将继续深入研究磁盘和文件系统管理相关知识,并不断提升自己的技能水平。
实验四磁盘和文件系统管理心得
实验四磁盘和文件系统管理心得
在本次实验中,我们学习了磁盘和文件系统的管理。
通过实验,我对磁盘和文件系统的概念及其管理方式有了更深入的了解和体验。
首先,磁盘管理是操作系统最基本的功能之一。
磁盘是计算机存储信息的主要设备,因此,对磁盘的管理显得尤为重要。
在实验中,我了解了磁盘的分区和格式化两个重要操作。
分区可以将一个大磁盘划分为多个逻辑分区,方便对不同的数据进行管理。
而格式化则是将分区或整个磁盘进行数据擦除,以便重新存储数据。
此外,我还学习了磁盘空间的管理,包括磁盘空间的容量、使用情况等,这些都是磁盘管理的重要内容。
其次,文件系统管理也是操作系统的重要功能之一。
文件系统是指计算机用来管理文件的一组规则和程序。
在实验中,我学习和掌握了文件的基本操作,如文件的创建、删除、拷贝和移动等。
同时,我还学习了文件系统的组成和结构,包括目录、文件描述符和索引节点等。
这些知识对文件系统的管理非常有帮助。
总之,通过本次实验,我深入了解了磁盘和文件系统的管理方式,掌握了它们的基本操作和原理,并且实践了相关操作。
这些知识对我今
后的计算机学习和工作都将有帮助。
实验四文件系统实验一. 目的要求1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二. 例题:1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。
另外,为打开文件设置了运行文件目录(AFD)。
3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4、算法与框图:①因系统小,文件目录的检索使用了简单的线性搜索。
②文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
③程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD)打开文件目录(AFD)(即运行文件目录)文件目录指针文件名··文件系统算法的流程图如下:三. 实验题:1、增加2~3个文件操作命令,并加以实现。
(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。
代码如下://1、增加2~3个文件操作命令,并加以实现。
(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。
#include<iostream>#include<string>#include<conio.h>using namespace std;struct TYPE_UFD{string File_Name;bool Read;bool Write;bool Execute;int Length_File;};struct TYPE_MFD{string User_Name;TYPE_UFD *Pointer;};struct TYPE_AFD{int File_ID;bool Read;bool Write;bool Execute;int Pointer;};class TYPE_FILE_SYSTEM{public:void Initial( void );void Start( void );private:int _Number_Users;int _Number_Files;int _MaxNumber_Open_Files;TYPE_MFD *_MFD;TYPE_UFD *_UFD;TYPE_AFD *_AFD;};void TYPE_FILE_SYSTEM::Initial( void ){_Number_Users = 10;_Number_Files = 10;_MaxNumber_Open_Files = 5;_UFD = new TYPE_UFD [_Number_Users*_Number_Files];_MFD = new TYPE_MFD [_Number_Users];int i=0;for( i=0 ; i<_Number_Users ; i++ ){_MFD[i].Pointer = &(_UFD[i*_Number_Files]);}_AFD = new TYPE_AFD [_MaxNumber_Open_Files];_MFD[0].User_Name = "zaq";_UFD[0].File_Name = "file1.txt";_UFD[0].Length_File = 10;_UFD[0].Read = true;_UFD[0].Write = false;_UFD[0].Execute = true;_UFD[1].File_Name = "file2.txt";_UFD[1].Length_File = 20;_UFD[1].Read = true;_UFD[1].Write = false;_UFD[1].Execute = false;for( i=2 ; i<_Number_Files ; i++ ){_UFD[i].File_Name = "";_UFD[i].Length_File = -1;_UFD[i].Read = false;_UFD[i].Write = false;_UFD[i].Execute = false;}}void TYPE_FILE_SYSTEM::Start( void ){int User_ID;int i,temp_int;string temp;char choice;int Number_Open_Files;string User_Name;string Command;TYPE_UFD *UFD;do{do{cout << "已创建用户名为zaq\n指令有:create delete open dir diropen write read logout shutdown \n\n";cout << "请输入用户名:";cin >> User_Name;for( User_ID=0 ; User_ID<_Number_Users ; User_ID++ ){if( _MFD[User_ID].User_Name == User_Name )break;}if( User_ID == _Number_Users )cout << "用户名错误,请再次输入." << endl;}while( User_ID == _Number_Users );cout << "欢迎登录, " << User_Name << " !" << endl;UFD = _MFD[User_ID].Pointer;for( i=0 ; i<_MaxNumber_Open_Files ; i++ ){_AFD[i].File_ID = -1;}Number_Open_Files = 0;do{cout << "C:\\" << User_Name << ">" ;cin >> Command;if( Command == "dir" ){cout << endl;cout << "打开用户" << User_Name <<"的文件" << endl;cout << "\t" << "State\t" << "Length\t" << "File name" << endl;for( i=0 ; i<_Number_Files ; i++ ){if( UFD[i].Length_File != -1 ){cout << "\t" ;if( UFD[i].Read == true )cout << "R";elsecout << "-";if( UFD[i].Write == true )cout << "W";elsecout << "-";if( UFD[i].Execute == true )cout << "E";elsecout << "-";cout << "\t";cout << UFD[i].Length_File;cout << "\t";cout << UFD[i].File_Name << endl;}}cout << endl;}else if( Command == "diropen" ){cout << endl;cout << "打开用户" << User_Name << "的文件"<<endl;cout << "\t" << "State\t" << "Open File name" << endl;for( i=0 ; i<_MaxNumber_Open_Files ; i++ ){if( _AFD[i].File_ID != -1 ){cout << "\t" ;if( _AFD[i].Read == true )cout << "R";elsecout << "-";if( _AFD[i].Write == true )cout << "W";elsecout << "-";if( _AFD[i].Execute == true )cout << "E";elsecout << "-";cout << "\t";cout << UFD[_AFD[i].File_ID].File_Name << endl;}}cout << endl;}else if( Command == "create" ){for( i=0 ; i<_Number_Files ; i++ )if( UFD[i].Length_File == -1 )break;if( i == _Number_Files )cout << "Error: 已有名为" << _Number_Files << " 的文件." << endl;else{cout << "请输入新文件信息:" << endl;cout << "文件名: ";cin >> temp;UFD[i].File_Name = temp;cout << "文件权限: ";cout << "Read (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )UFD[i].Read = true;elseUFD[i].Read = false;cout << endl;cout << "Write (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )UFD[i].Write = true;elseUFD[i].Write = false;cout << endl;cout << "Execute (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )UFD[i].Execute = true;elseUFD[i].Execute = false;cout << endl;cout << "Length :";cin >> temp_int;if( temp_int > 0 )UFD[i].Length_File = temp_int;cout << "新文件" << UFD[i].File_Name << " 已建立!" << endl;}}else if( Command == "delete" ){cout << "请输入文件名:";cin >> temp;for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files )cout << "文件名错误,请再次输入." << endl;else{UFD[i].Length_File = -1;cout << "文件" << UFD[i].File_Name << " 已删除." << endl;}}else if( Command == "open" ){if( Number_Open_Files == _MaxNumber_Open_Files )cout << "Error: 你已经打开了" <<Number_Open_Files << " 文件." << endl;else{cout << "请输入文件名:";cin >> temp;for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files )cout << "文件名错误,请再次输入." << endl;else{Number_Open_Files++;for( temp_int=0 ;temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == -1 )break;_AFD[temp_int].File_ID = i;_AFD[temp_int].Pointer = 0;cout << "请定义打开方式:" << endl;if( UFD[i].Read == true ){cout << "Read (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )_AFD[temp_int].Read = true;else_AFD[temp_int].Read = false;cout << endl;}else_AFD[temp_int].Read = false;if( UFD[i].Write == true ){cout << "Write (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )_AFD[temp_int].Write = true;else_AFD[temp_int].Write = false;cout << endl;}else_AFD[temp_int].Write = false;if( UFD[i].Execute == true ){cout << "Execute (y/n):";do{choice = getch();}while( choice!='y' && choice!='n' );if( choice == 'y' )_AFD[temp_int].Execute = true;else_AFD[temp_int].Execute = false;cout << endl;}else_AFD[temp_int].Execute;cout << "文件" << temp << " 已打开." << endl;}}}else if( Command == "logout" ){cout << "再见, " << User_Name << " !" << endl;break;}else if( Command == "close" ){cout << "请输入文件名:";cin >> temp;for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files )cout << "文件名错误,请再次输入." << endl;else{for( temp_int=0 ;temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == i )break;if( temp_int == _MaxNumber_Open_Files )cout << "文件" << temp << " 未打开." << endl;else{_AFD[temp_int].File_ID = -1;Number_Open_Files--;cout << "文件" << temp << " 已关闭." << endl;}}}else if( Command == "read" ){cout << "请输入文件名:";cin >> temp;for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files )cout << "文件名错误,请再次输入." << endl;else{for( temp_int=0 ;temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == i )break;if( temp_int == _MaxNumber_Open_Files )cout << "文件" << temp << " 未打开." << endl;else{if( _AFD[temp_int].Read == true )cout << "文件" << temp << " 成功读取." << endl;elsecout << "Error: 文件打开模式错误." << endl;}}}else if( Command == "write" ){cout << "请输入文件名:";cin >> temp;for( i=0 ; i<_Number_Files ; i++ )if( (UFD[i].Length_File!=-1)&&(UFD[i].File_Name==temp) )break;if( i == _Number_Files )cout << "文件名错误,请再次输入." << endl;else{for( temp_int=0 ;temp_int<_MaxNumber_Open_Files ; temp_int++ )if( _AFD[temp_int].File_ID == i )break;if( temp_int == _MaxNumber_Open_Files )cout << "文件" << temp << " 未打开." << endl;else{if( _AFD[temp_int].Write == true )cout << "文件" << temp << " 成功写入." << endl;elsecout << "Error: 文件打开模式错误." << endl;}}}else if( Command == "shutdown" ){cout << "正在注销........" << endl;cout << "再见, " << User_Name << " !" << endl;cout << "正在关机.........." << endl;break;}else{cout << "指令错误,请再次输入." << endl;}}while( Command != "logout" && Command != "shutdown" );}while( Command != "shutdown" );}int main(){TYPE_FILE_SYSTEM FS;FS.Initial();FS.Start();return 0;}2、编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。
1实验目的通过实验了解linux的文件系统结构。
通过练习使用linux命令查看文件系统信息;通过编程掌握文件操作函数使用。
2实验内容●学习通过linux命令查看文件系统信息状况●通过编程掌握文件系统调用操作3实验步骤3.1l inux文件及目录命令操作,熟悉常见linux文件操作命令,如:使用ls查看当前目录,使用cd改变当前工作目录,使用pwd 显示当前工作目录等3.2使用df、du命令查看文件系统及文件磁盘空间状况。
查阅资料简述命令输出包含哪些内容。
3.3使用ls –i及stat命令查看文件inod e信息,查阅资料简述stat命令输出包含哪些内容。
3.4文件系统创建3.5用dd 命令创建一个指定大小的文件(使用/dev/zero 作为源进行文件复制)3.5.1用mke2fs 在这个文件上创建一个文件系统,查阅资料总结mke2fs的功能说明,并简述输出所描述的信息。
3.5.2用dump2fs查看fs相关信息,查阅资料简述dump2fs的功能说明。
3.5.3使用od查看fs文件系统“磁盘”内容,并查阅ext2文件系统格式说明,了解其中的数据组成。
3.5.3.1查看超级快内容:od -tx1 -Ax fs -N1024 -j10243.5.3.2查看GDT块:od -tx1 -Ax fs -N1024 -j20483.5.3.3查看bl ock bitmap:od -tx1 -Ad fs -N1024 -j6144 查看inodebitmap:od -tx1 -Ad fs -N1024 -j71683.5.3.4查看inode tabl e:od -tx1 -Ad fs -N1024 -j8192查看databl ock:od -tx1 -Ad fs -N1024 -j245763.5.4使用mount 命令将新建的文件系统fs关联到一个回环设备后挂装到挂装点/mnt3.5.5在/mnt目录中创建子目录、文件后再使用dump2fs查看fs的free bl ocks等的信息变化或使用od命令查看信息变化。
试验四文件系统之蔡仲巾千创作一、二、实验目的1、用高级语言编写和调试一个简单的文件系统, 模拟文件管理的工作过程.从而对各种文件把持命令的实质内容和执行过程有比力深入的了解.2、要求设计一个n个用户的文件系统, 每次用户可以保管M个文件.用户在一次运行中只能翻开一个文件, 对文件必需设置呵护办法, 且至少有create、delete、open、close、read、write等命令.三、实验题目:采纳二级目录结构实现磁盘文件把持.要求:1.普通文件的目录项包括文件名, 文件类型, 文件长度, 指向文件内容的指针内容.2.目录文件的目录项包括目录名, 指向下一级目录块的指针内容.假定每个目录文件最多只能占用一个块;3.法式功能方面的要求:需要实现一个命令行把持界面, 包括如下命令:4.法式实现方面的要求:(1)、对重名(创立时), 文件不存在(删除时), 目录不存在(改变目录时)等毛病把持情况, 法式应该做出相应处置并给犯毛病信息, 可是法式不得因此而退出.(2)、界面友好, 法式强壮.(3)、设置界面的提示符, 提示的命令以及调试的方法应和前面的要求一致.不要自己设计命令或者附加不要求的功能.:执行文件名:Project1.exe四.实验分析1)总论:该系统是一个多用户、多任务的实时把持系统.对用户和用户的文件数目并没有上限.也就是说该系统允许任何用户申请空间, 而且在其目录下的文件数目其实不做任何的限制.该系统的把持命令如下:①、bye-用户注销命令.当使用该命令时, 用户退出系统.命令格式:run\bye↙系统注销该用户并回到登岸界面.②、close-删除用户注册信息命令.执行该命令后, 用户在系统中的所有信息, 包括该用户目录下的所有文件都被删除.命令格式:run\close↙.完成后返回登岸界面.③、create-在以后目录下创立一个文件, 且该文件不能跟系统中的文件重名.该文件的管理信息登录到用户文件信息管理模块中.命令格式:run\create>file1↙.其中file1为要创立的文件名称.执行完该命令后回到执行命令行.④、delete-删除以后用户目录下的一个文件.命令格式:run\delete>file1↙.返回命令行.⑤、list-显示以后注册目录下的所有文件信息, 包括文件名、文件长度、文件把持权限.命令格式:run\list↙.⑥、chmod-改变某个文件的执行权限, 但前提是该文件是该用户目录下的文件.命令格式:run\chmod>file1↙.⑦、open-在window界面下翻开某个文件.命令格:run\open>file1↙.执行该命令后, 文件file1将用在windows界面下的文件形式翻开.用户可以在这个方式中对文件进行修改, 并将修改后的内容保管.⑧、read-读文件信息.将文件信息读入并显示在终端.命令格式:run\read>file1↙.⑨、write-向某个文件写入新的信息.用户可以选择用覆盖原来内容的方式和在文件的末尾拔出新信息的方式写入信息. 2)_系统采纳二级文件目录.设置主目录(MFD)和用户文件目录(UFD), 分别以文件的方式保管在磁盘中.在主目录中又注册用户的用户名和另一标识表记标帜该用户目录下是否有文件的指针标识表记标帜.用户文件目录用用户名作为文件名保管在磁盘, 以便检索时方便对应.在用户文件目录中保管着该目录下所有的文件的文件名称、呵护码、文件长度. 3)该系统年夜量使用高级语言中的文件把持函数, 所以能实际看到文件的创立写入、读出、删除等效果.4) 实验流程图5)源法式:#include<iostream.h>#include<stdio.h> #include<stdlib.h> #include<string.h> #include "conio.h" #include<dos.h>#define NULL 0#define keynum 10#define getspace(type) (type*)malloc(sizeof(type))char cmd[64]; //寄存用户输入命令char buffer[36];//char user[32];//寄存以后登岸的用户名typedef char ALFA[12];ALFA KWORD[keynum];struct UFD{//用户文件管理模块char filename[32]; //文件名int safecode; //文件呵护码long length; //文件长度}*curfile = NULL;struct MFD{//用户登岸信息管理模块char username[32]; //用户名bool filepoint; //用户目录下的文件指针, false暗示目录为空}*curuser = NULL,*elseuser=NULL;typedef UFD UFD;typedef MFD MFD;void main();void KeyWord()//初始化命令关键字{strcpy(KWORD[ 1],"bye");strcpy(KWORD[ 2],"chmod");strcpy(KWORD[ 3],"close");strcpy(KWORD[ 4],"create");strcpy(KWORD[ 5],"delete");strcpy(KWORD[ 6],"list");strcpy(KWORD[ 7],"open"); strcpy(KWORD[ 8],"read");strcpy(KWORD[ 9],"write");}int LoginDisplay() //登岸选项把持函数{int SELETE_1 = 0;do{cout<<" *****请选择把持*****\n1、用户登岸 2、用户注册 0、退出"<<endl;cin>>SELETE_1;}while(SELETE_1<0 || SELETE_1>2);system("cls");return SELETE_1;}bool Login(int SELETE)//用户登岸, 注册函数{FILE *fp,*fp1,*fp2;char name[12];switch(SELETE){case 1://用户登岸if((fp = fopen("LOGIN.exe","rb")) == NULL)//翻开用户注册目录管理文件{cout<<"\n毛病:不能翻开登岸文件."<<endl;getch();system("cls");return false;}curuser = getspace(MFD);cout<<"\n*****登岸*****\n用户名:";cin>>name; //输入用户登岸名while(!feof(fp)) //检查该用户是否合法{fread(curuser,sizeof(MFD),1,fp);if(strcmp(curuser->username,name)==0)break;}if(feof(fp)) //如果没有找到跟以后登岸用户名相同的管理信息, 提示犯错{cout<<"\n毛病:该用户不存在."<<endl;fclose(fp);return false;}else{fclose(fp);return true;}break;case 2: //新用户注册if((fp=fopen("LOGIN.exe","ab"))==NULL)//如果登岸信息管理文件不存在fp=fopen("LOGIN.exe","wb+"); //创立该信息管理文件char name[12];curuser = getspace(MFD);while(1){cout<<"\n *****新用户注册*****"<<endl;cout<<"用户名:";cin>>name; //输入用户注册名fp1 = fopen("LOGIN.exe","rb");while(!feof(fp1))//检查该用户名是否被另外用户占用{fread(curuser,sizeof(MFD),1,fp1);if(strcmp(curuser->username,name) == 0)//该名称已经被使用{cout<<"\n该用户已经存在, 请重新输入!"<<endl;getch();break;}}if(feof(fp1))//该名称没有被另外用户占用{strcpy(curuser->username,name);curuser->filepoint = NULL;fwrite(curuser,sizeof(MFD),1,fp);strcpy(user,curuser->username);//生成用户文件管理模块strcat(user,".exe"); //用于管理用户目录下的各个文件fp2=fopen(user,"wb+");fclose(fp2);cout<<"\n注册胜利!"<<endl; //提示注册胜利fclose(fp1);fclose(fp);break;}}fp = fopen("LOGIN.exe","rb"); //显示以后注册用户的名称while(1){fread(curuser,sizeof(MFD),1,fp);if(feof(fp))break;cout<<curuser->username<<endl;getch();}fclose(fp);return true;break;default:return false;break;}}void DisplayUFD()//打印用户信息, 包括用户的各个文件//名称、长度和把持权限的设置信息{if(curuser->filepoint == false)//以后用户目录下没有任何文件存在cout<<"\n用户 "<<curuser->username<<" 文件夹是空的"<<endl;else{//存在文件, 将所有文件信息打印在终端FILE *fp;char filename[12];strcpy(filename,curuser->username);strcat(filename,".exe");if((fp=fopen(filename,"rb"))==NULL)//翻开用户文件信息管理模块{cout<<"\n无法翻开用户:"<<curuser->username<<" 的文件!"<<endl;getch();return;}else{//读入并将用户全部文件信息打印在终端cout<<"用户:"<<curuser->username<<"目录下的文件:"<<endl;UFD *ufd;int i=0;ufd = getspace(UFD); //申请寄存用户文件模块的空间while(1){fread(ufd,sizeof(UFD),1,fp);if(feof(fp))//全部输出完毕, 结束break;else//打印信息cout<<ufd->filename<<"\t"<<ufd->length<<"\t"<<ufd->safecode<<endl;}}fclose(fp);}}void ByeFile(bool BOOL)//注销函数, 调用次函数用户可以退出系统{FILE *infile,*outfile;char out[50];strcpy(out,"outfilelocate.exe");if((infile=fopen("LOGIN.exe","rb"))==NULL){cout<<"\n保管毛病."; // fclose(infile);return;}else{if((outfile=fopen(out,"wb+"))==NULL)//申请一个缓冲区管理模块//寄存用户更新后的全部信息{cout<<"\n保管毛病.";// fclose(outfile);fclose(infile);return;}else{MFD *mfd = getspace(MFD);while(1){//将旧文件管理信息读出, 并保管到新的文件信息管理模块中fread(mfd,sizeof(MFD),1,infile);if(feof(infile))break;if((strcmp(mfd->username,curuser->username))==0){if(BOOL)//更新以后用户信息的把持fwrite(curuser,sizeof(MFD),1,outfile);else continue;//如果用户想把自己的注册目录从系统中完全删除//则执行该把持}elsefwrite(mfd,sizeof(MFD),1,outfile);//写入新的模块}fclose(infile);fclose(outfile);remove("LOGIN.exe");//将旧的该用户的文件管理模块删除rename(out,"LOGIN.exe");//将新的用户的文件管理模块重命名为用户目录下的管理模块}}system("cls");main();}bool ClearUserFile()//用户要将自己的注册目录从系统完全删除//首先将该用户目录下的全部文件删除{FILE *fp;char file[50];strcpy(file,curuser->username);strcat(file,".exe");if((fp=fopen(file,"rb"))==NULL) //翻开用户文件信息管理模块{// fclose(fp);cout<<"\n把持失败.";return true;}else{//将该用户目录下的文件逐个从磁盘删除UFD *ufd = getspace(UFD);while(1){fread(ufd,sizeof(UFD),1,fp);if(feof(fp))break;elseremove(ufd->filename);//删除文件}fclose(fp);return true;}}void ClearUserMes()//删除用户全部信息{char name[50];strcpy(name,curuser->username);strcat(name,".exe");remove(name); //从磁盘中删除用户文件信息管理模块ByeFile(false);//更新系统的用户登岸信息管理模块}void DeleteUser()//删除用户注册目录的把持{char ch;cout<<"\n该把持将会是你在系统所有信息删除, 下次登岸时你必需重新申请用户名!"<<endl;cout<<"\n你确定要删除你在系统中的注册信息吗?Y/N"<<endl;cin>>ch;switch(ch)//提示用户确认删除{case 'Y':case 'y':if(ClearUserFile())//如果用户的全部文件已经删除//则可以将该用户的文件信息管理模块也从磁盘中删除//以免在没完全删除文件却删了该文件信息管理模块//使得这些文件无法再进行管理造成磁盘空间的浪费ClearUserMes();//删除文件信息管理模块break;default:cout<<"\n你取消了此把持!";break;}}void CreatFile()//在以后用户目录下创立文件{FILE *fp;curuser->filepoint=true;if((fp=fopen(buffer,"r"))==NULL)//如果没有跟用户输入文件名相同的文件{if((fp=fopen(buffer,"w"))==NULL){cout<<"\n创立文件失败!";// fclose(fp);return;}fclose(fp);}else{//用户要创立的文件已经存在cout<<"\n该文件已经存在, 创立另一个文件?Y/N";char ch;cin>>ch;switch(ch){case 'Y':case 'y':cout<<"\n输入新文件名:";cin>>buffer;strcat(buffer,".txt");fclose(fp);if((fp=fopen(buffer,"w"))==NULL){cout<<"\n创立文件失败!";// fclose(fp);return;}fclose(fp);break;default:fclose(fp);return;}}strcpy(user,curuser->username);strcat(user,".exe");curfile = getspace(UFD);strcpy(curfile->filename,buffer);//文件名curfile->length=0; //该文件长度为零curfile->safecode=30; //设置该文件的默认权限//11 00, 文件主有读和写权, 其他用户没有读写权if((fp=fopen(user,"ab"))==NULL){cout<<"\n毛病:你可能不是合法用户."<<endl;getch();}else{fwrite(curfile,sizeof(UFD),1,fp);//将该文件信息写入用户文件信息管理模块中cout<<"\n文件"<<curfile->filename<<" 创立胜利!";}fclose(fp);}void DeleteFile()//删除以后目录下一个文件的把持{char ch;FILE *infile,*outfile;cout<<"\n确定要删除文件:"<<buffer<<" Y/N"<<endl;cin>>ch;//提示用户确认删除switch(ch){case 'Y':case 'y'://更新用户文件信息管理模块, 这里同样使用缓冲区模块来更新//方法与上面将到的类似char out[50],in[50];strcpy(out,"outfilelocate.exe");strcpy(in,curuser->username);strcat(in,".exe");if((infile=fopen(in,"rb"))==NULL)//翻开该用户的文件信息管理模块{cout<<"\n保管毛病.";//fclose(infile);return;}else{if((outfile=fopen(out,"wb+"))==NULL){cout<<"\n保管毛病.";// fclose(outfile);fclose(infile);return;}else{UFD *ufd = getspace(UFD);while(1){fread(ufd,sizeof(UFD),1,infile);//从旧模块读出信息if(feof(infile))break;if((strcmp(ufd->filename,buffer))==0)//要进行更新的信息continue;elsefwrite(ufd,sizeof(UFD),1,outfile);//写入新模块}fclose(infile);fclose(outfile);remove(in);//在磁盘移除就模块rename(out,in); //新模块命名为以后用户文件信息管理模块}}remove(buffer);//从磁盘中删除该文件break;default:break;}}void ListAllFile()//显示以后用户目录下的文件信息{DisplayUFD();}void OpenFile()//在window模式下翻开该文件{}bool QueryModElse(bool BOOL,bool &flag)//查询其它用户目录下文件的文件//当该文件的权限允许以后用户对其执行有关把持时, 返回ture {FILE *fp;char user[50];UFD *ufd = getspace(UFD);//elseuser暗示除以后用户外的所有用户注册目录strcpy(user,elseuser->username);strcat(user,".exe");if((fp=fopen(user,"rb"))==NULL){//翻开一个其它的用户文件信息管理模块// fclose(fp);cout<<"\n把持呈现毛病, 对此我们暗示歉意!";return false;}else{while(1){fread(ufd,sizeof(UFD),1,fp);if(feof(fp)){fclose(fp);return false;}if(strcmp(ufd->filename,buffer)==0){if(BOOL)//该用户请求写该文件{if(ufd->safecode== 31 || ufd->safecode== 33)//1101、1111最后一位为1, 有写权return true;else{cout<<"\n你无权对文件"<<buffer<<" 执行此把持!";flag=true;return false;}//flag设置为true, 告诉上一层, 无须再查找//该文件已经找到, 但用户无权执行相关把持}else //该用户请求读权{if(ufd->safecode == 32 || ufd->safecode == 33)//1110、1111倒数第二位为1, 有读权return true;else{cout<<"\n你无权对文件"<<buffer<<" 执行此把持!";flag=true;return false;}}}}}}bool QueryMod(bool BOOL)//查询权限{//首先在用户目录下查找, 如果找不到用户以后要进行把持的文件名//则在其它注册用户目录下查找FILE *fp,*fp1;bool flag=false;char user[50];UFD *ufd = getspace(UFD);strcpy(user,curuser->username);strcat(user,".exe");if((fp=fopen(user,"rb"))==NULL){//翻开用户文件信息管理模块// fclose(fp);cout<<"\n把持呈现毛病, 对此我们暗示歉意!";return false;}else{//查找匹配的文件名, 用户目录下的文件允许用户进行读写把持while(1){fread(ufd,sizeof(UFD),1,fp);if(feof(fp)){//在以后用户文件管理模块中找不到匹配文件//则继续在其它用户注册目录下查找fclose(fp);fp1=fopen("LOGIN.exe","rb");elseuser = getspace(MFD);bool BOOL_1=false;while(1){fread(elseuser,sizeof(MFD),1,fp1);//读其它用户信息if(feof(fp1) && !BOOL_1)//全部用户都查找完//但仍然没找到匹配的文件return false;if(elseuser != curuser){if((BOOL_1=QueryModElse(BOOL,flag)))//查找return true;if(flag)return false;}}}if(strcmp(ufd->filename,buffer)==0){//在以后用户注册目录下//找到该文件, 返回真值fclose(fp);return true;}}}}bool WriteRight(int len,bool BOOL)//检查是否已经正确地写入到该文件信息中//是则返回真值{char user[50],outfile[50];FILE *fp,*fp1;strcpy(user,elseuser->username);strcat(user,".exe");if((fp=fopen(user,"rb"))==NULL){return false;}else{UFD *ufd = getspace(UFD);while(1){//在此用户目录下查找匹配文件fread(ufd,sizeof(UFD),1,fp);if(feof(fp)){fclose(fp);return false;}if((strcmp(ufd->filename,buffer))==0){//找到要写入新的长度的文件strcpy(outfile,"outfilelocate.exe");if((fp1=fopen(outfile,"wb+"))==NULL){cout<<"\n毛病:写入文件长度犯错_3.";// fclose(fp1);fclose(fp);return false;}else{fclose(fp);fp=fopen(user,"rb");//文件指针重新指向此用户文件信息管理模块开头while(1){fread(ufd,sizeof(UFD),1,fp);if(feof(fp))break;if(strcmp(ufd->filename,buffer)==0){//找到匹配的文件if(BOOL) ufd->length+=len; //在文件末追加内容的把持else ufd->length =len;//覆盖原文件内容}fwrite(ufd,sizeof(UFD),1,fp1);}fclose(fp);fclose(fp1);remove(user);rename(outfile,user);return true;}}}}}void WriteLengthToFile(int Len,bool BOOL)//将文件长度写入文件管理模块中{//因为以后用户可以对其它用户的文件进行把持(只要权限允许)//所以应该在整个文件系统目录下查找该文件的位置FILE *fp;if((fp=fopen("LOGIN.exe","rb"))==NULL){//不能翻开文件cout<<"\n写入文件长度毛病_1!";// fclose(fp);return;}else{elseuser = getspace(MFD);while(1){fread(elseuser,sizeof(MFD),1,fp);if(feof(fp))break;else{if(WriteRight(Len,BOOL)){//检查是否已经正确地写入到该文件信息中fclose(fp);return;}}}cout<<"\n写入文件长度毛病_2!";fclose(fp);return;}}void WriteFile()//向文件写入信息的把持{if(!QueryMod(true))//查询以后用户对该文件是否有写权return;//对该文件没有写权则返回char ch;int i=0;FILE *fp;if((fp=fopen(buffer,"r"))==NULL)//查询该文件是否存在{cout<<"\n该文件不存在, 请创立该文件后再写入.";// fclose(fp);return;}fclose(fp);cout<<"\n请选择写入方式:"<<endl;cout<<" 1、覆盖原文件 2、在原文件末尾写入 3、取消"<<endl;cin>>ch;cout<<"开始输入正文:"<<endl;switch(ch){case '1'://覆盖原文件if((fp=fopen(buffer,"w"))==NULL)cout<<"\n文件翻开失败.";else{ch=getchar();while(ch!='#')//将新的文件内容写入到文件的磁盘位置中{i++;fputc(ch,fp);ch=getchar();}}fclose(fp);WriteLengthToFile(i,false);//将文件长度写入文件管理模块break;case '2':if((fp=fopen(buffer,"a"))==NULL)cout<<"\n文件翻开失败.";else{ch=getchar();while(ch!='#')//将新的文件内容写入到文件的磁盘位置中{i++;fputc(ch,fp);ch=getchar();}}fclose(fp);WriteLengthToFile(i,true);//将文件长度写入文件管理模块break;default:break;}}void ReadFile()//读文件函数{if(!QueryMod(false))//查询以后用户是否有权读该文件return;//没有读权, 则返回FILE *fp;if((fp=fopen(buffer,"r"))==NULL)//翻开该文件{cout<<buffer;cout<<"\n该文件不存在.";return;}else{char ch;ch=fgetc(fp);while(ch!=EOF)//将该文件信息逐一输出到终端{putchar(ch);ch=fgetc(fp);}cout<<endl;}fclose(fp);}void ChangeMod()//修改某文件的执行权限{int mod=40;FILE *fp,*infile,*outfile;char in[50],out[50];UFD *ufd = getspace(UFD);strcpy(in,curuser->username);strcat(in,".exe");strcpy(out,"outfilelocate.exe");if((fp=fopen(in,"rb"))==NULL){// fclose(fp);cout<<"\n把持呈现毛病, 对此我们暗示歉意!";return;}else{while(1){//检查该文件是否在以后用户的注册目录下//任何用户无权修改不是自己目录下的文件的权限值fread(ufd,sizeof(UFD),1,fp);if(feof(fp)){//在以后目录下找不到该文件, 说明该用户无权修改该文件权限cout<<"\n你没有权限对文件"<<buffer<<" 执行该把持!";fclose(fp);return;}if(strcmp(ufd->filename,buffer)==0){//找到该文件, 继续把持fclose(fp);break;}}}bool flag1=true;while(flag1){cout<<"\n输入文件 "<<buffer<<" 的新的权限值:";cin>>mod;//输入权限值if(mod<30 || mod>33){//确保输入的权限值正确cout<<"\n毛病:权限值必需在30~33之间";continue;}else{char ch;switch(mod){//告诉用户对该文件权限修改的结果, 以便用户确认case 30:cout<<"\n以后权限设置:其他用户对"<<buffer<<"既没读权也没写权!";break;case 31:cout<<"\n以后权限设置:其他用户对"<<buffer<<"没读权但有写权!";break;case 32:cout<<"\n以后权限设置:其他用户对"<<buffer<<"有读权但没写权!";break;case 33:cout<<"\n以后权限设置:其他用户对"<<buffer<<"既有读权也有写权!";break;default: break;}cout<<"\n确认按'Y', 取消按'N':";cin>>ch;switch(ch){case 'Y':case 'y':flag1=false;break;default: flag1=true;}}}//更新文件信息管理模块, 相关把持类似上面, 不在赘述if((infile=fopen(in,"rb"))==NULL){cout<<"\n把持呈现毛病, 对此我们暗示歉意!";fclose(infile);return;}else{if((outfile=fopen(out,"wb+"))==NULL){cout<<"\n把持呈现毛病, 对此我们暗示歉意!";fclose(infile);//fclose(outfile);return;}else{while(1){fread(ufd,sizeof(UFD),1,infile);if(feof(infile))break;if((strcmp(ufd->filename,buffer))==0)ufd->safecode=mod;fwrite(ufd,sizeof(UFD),1,outfile);}fclose(infile);fclose(outfile);remove(in);rename(out,in);}}}void Execute(int i,int len,int cmdset)//执行命令函数{int j=0;for(;i<len;i++){if(cmd[i]=='>'||cmd[i]==' ')break;buffer[j]=cmd[i];j++;}buffer[j]='\0';strcat(buffer,".txt");switch(cmdset){case 1: //退出ByeFile(true);break;case 2: //改变文件把持权限if((strcmp(buffer,".txt"))==0){cout<<"\n输入命令犯错!";return;}ChangeMod();break;case 3: //删除用户DeleteUser();break;case 4: //创立文件if((strcmp(buffer,".txt"))==0){cout<<"\n输入命令犯错!";return;}CreatFile();break;case 5: //删除文件if((strcmp(buffer,".txt"))==0){cout<<"\n输入命令犯错!";return;}DeleteFile();break;case 6: //列出该用户所有文件清单ListAllFile();break;case 7: //翻开文件if((strcmp(buffer,".txt"))==0){cout<<"\n输入命令犯错!";return;}OpenFile();break;case 8: //读文件if((strcmp(buffer,".txt"))==0){cout<<"\n输入命令犯错!";return;}ReadFile();break;case 9: //写文件if((strcmp(buffer,".txt"))==0){cout<<"\n输入命令犯错!";return;}WriteFile();break;default:break;}}void Command()//读取用户输入的命令, 并将其转换成系统能识另外命令{int len = 0,i,j;int cmdset;while(1){cmdset = 0;cout<<"\nrun\\";cin>>cmd;len = strlen(cmd);i=0;j=0;while(cmd[i]=='>'||cmd[i]==' '){i++;}//过滤空格键和'>'for(;i<len;i++){if(cmd[i]=='>' || cmd[i]==' ' || i==len-1){if(cmd[i]=='>' || cmd[i]==' ')buffer[j] = '\0';elseif(i==len-1){buffer[j]=cmd[i];buffer[j+1]='\0';}i++;j=0;int low=1,mid,high=keynum-1;bool BOOL = false;while(low<=high){//找到该命令关键字的内部识别码mid=(low+high)/2;if (strcmp(buffer,KWORD[mid])<=0) high=mid-1;if (strcmp(buffer,KWORD[mid])>=0) low=mid+1;if(strcmp(buffer,KWORD[mid])==0){BOOL = true;break;}}if(!BOOL){cout<<"\n"<<buffer<<"不是系统界说的命令...";cmdset = 0; break;}else {cmdset = mid;break;}}else{buffer[j] = cmd[i];j++;}}if(cmdset == 0) continue;while(cmd[i]=='>'||cmd[i]==' '){i++;}//过滤空格键和'>'buffer[0]='\0';Execute(i,len,cmdset); //执行该命令}}void main(){while(1){int SELETE = LoginDisplay();if(SELETE==0)exit(0);bool BOOL = Login(SELETE);//用户登岸, 或者注册函数if(BOOL){KeyWord(); //初始化命令关键字DisplayUFD();//打印用户目录下的文件Command(); //命令行把持}}}五.调试结果:1)系统界面如下:2)创立新用户:如果你以前还没有注册,则可以先选择2,创立一个用户.3)创立用户后,可以用create>xiao命令建立一个名为xiao的text文件.并可以用list检查文件的信息(xiao.txt是文件名, 0暗示文件以后的长度为0, 30用二进制暗示为1100, 暗示以后用户有读写权, 而其它用户没有读权也没有写权).4)用write>xiao命令向这个文件写信息,选择1或是2,输入信息如下: (注意:所有信息输入完后要以‘#’号键作为结束标识表记标帜.)5)用read>xiao命令读文件中的内容.6)此时再write>xiao命令向这个文件写信息,选择1,输入信息,并用read>xiao检查,结果如下:7)还可以用open>xiao这个命令翻开文件,发现文件内容酿成:8)以上是文件的基本把持,要理解这个系统的更多功能,用户只需亲自使用这个界面友好,提示众多的软件几分钟,就可以很自由的把持这个软件了.所以这里就纷歧一介绍了.:此次实验做的比力全面,编译也是用C++builder.主要是因为把持系统的课程设计也是类似的文件系统管理,可重新做类似的事,兴趣没有这么高了,不外还是有新的收获的.。
实验四磁盘和文件系统管理心得
磁盘和文件系统管理是计算机系统中非常重要的一部分,它们负责存储和管理文件,保证计算机系统的正常运作。
在本次实验中,我们学习了如何在Linux系统下管理磁盘和文件系统。
首先,我们学会了如何使用fdisk命令来对磁盘进行分区。
通过对磁盘进行分区,我们可以将一个大的磁盘划分为多个小的区块,这使得我们可以更好地管理磁盘空间。
另外,我们还学会了如何对分区进行格式化,这样我们才能在磁盘上创建文件系统。
接着,我们学习了如何挂载和卸载文件系统。
挂载文件系统是将文件系统与指定的目录进行关联,这样我们就可以通过这个目录来访问文件系统中的文件。
同时,我们还学会了如何使用df命令来查询磁盘使用情况,这样可以让我们及时了解磁盘的空间使用情况。
最后,我们学会了如何创建软链接和硬链接。
软链接是一种特殊的文件,它可以链接到其他文件或目录。
而硬链接则是指多个文件指向同一个磁盘上的数据块,这样可以节省磁盘空间。
总之,本次实验让我们更深入地了解了磁盘和文件系统管理的相关知识,这对于我们进一步学习计算机系统和服务器管理等方面的知识都非常有帮助。
实验介绍本实验要求在假设的I/O 系统之上开发一个简单的文件系统,这样做既能让实验者对文件系统有整体了解,又避免了涉及过多细节。
用户通过create, open, read 等命令与文件系统交互。
文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0 至L-1。
I/O 系统利用内存中的数组模拟磁盘。
实际物理磁盘的结构是多维的:有柱面、磁道、扇区等概念。
I/O 系统的任务是隐藏磁盘的结构细节,把磁盘以逻辑块的面目呈现给文件系统。
逻辑块顺序编号,编号取值范围为0 至L -1,其中L 表示磁盘的存储块总数。
实验中,我们可以利用字符数组ldisk[L][B] 构建磁盘模型,其中B 表示每个存储块的长度。
I/O 系统从文件系统接收命令,根据命令指定的逻辑块号把磁盘块的内容读入命令指定的内存区域,或者把命令指定的内存区域内容写入磁盘块。
内存区域内容写入磁盘块。
整体组织注:我定义的文件系统中,磁盘分为两大部分:数据区和保留区。
其中保留区中又包含位图区和文件描述符区,数据区的首部是文件的目录项,也就是说,文件的目录项在文件创建时会创建相应的目录项在数据区的文件首部;而位图区用于表征数据的占用情况,例如数据区的第N块被分配了,那么位图区中也要做相应的改变。
文件描述符注:文件描述符位于保留区后半部,用于分为两类型,即表示目录的0号描述符和1号以后的描述符,用于表示文件的长度和分配块情况,具体看上图。
目录项注:目录项位于数据区的首部,目录项的0位用于保存文件描述符的序号,1号以后用于存放文件名总结:一个文件的所有存放于由位视图,文件描述符,目录项和数据区表征。
①对磁盘的操作:字符数组(L*B)模拟磁盘,考虑到文件系统和I/O系统(磁盘)不是同一层,故将所有对磁盘的操作只能规约为这二者之间的接口来操作:void read_block(int,char *); //文件系统与IO设备的接口函数,读取块void write_block(int,char *); //文件系统与IO设备的接口函数,写入块(代码详见源文件)也就是说,之后的文件的创建,删除,打开,关闭,指针定位等操作,里面牵扯到磁盘内容读写的步骤,全部需要用这两个接口完成,然后这两个接口对磁盘的操作是以块为单位的,所以例如某些操作,只要更改磁盘中的某一块中的某一位,则需要先读取某一块存于零时数组中,然后修改这个数组的某一位,然后再将这个数组写回磁盘。
实验4 文件系统一、目的与要求1. 目的文件系统是操作系统的一个重要组成部分,也是与用户关系极为密切的部分。
学生应独立的用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深对教材中有关内容的理解。
2. 要求(1)设计一个n个用户的文件系统,每个用户最多可保存m个文件。
(2)限制用户在一次运行中只能打开一个文件。
(3)系统应能检查输入命令的正确性,出错时要能显示出错原因。
(4)对文件必须设置保护措施,如只能执行,允许读,允许写等。
在每次打开文件时,根据本次打开的要求,再次设置保护级别,即可有二级保护。
(5)对文件的操作至少应有下面几条命令:create 建立文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件(6)本次实验的上机时间为2~4学时。
二、实验内容1. 题目(1)本次实验设计一个共有10个用户的文件系统,每个用户最多可保存10个文件,一次运行过程中用户可同时打开5个文件。
(2)程序采用二级文件目录,即设置了主文件目录(MFD)和用户文件目录(UFD)。
前者应包含文件主(即用户)及他们的目录区指针;后者应给出每个文件主占有的文件目录,即文件名、保护码、文件长度以及它们存放的位置等。
另外为打开文件设置了运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。
(3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只修改读写指针,并不进行实际文件的读写操作。
2. 算法与框图(1)因系统小,文件目录的检索使用了简单的线性搜索,而没有采用Hash等有效算法。
(2)文件保护简单使用了三位保护码,对应于允许读,允许写和允许执行,如下所示:1 1 1允许读允许写允许执行如对应位为0,则不允许。
(3)程序中使用的主要数据结构如下:①主文件目录(MFD)和用户文件目录(UFD)MFD UFD②(4)程序框图5-1所示:三、参考书目[1] 郭浩志主编,计算机软件实践教程,西北电讯工程学院出版社,1995年(第二版)[2] 庞丽萍,李胜利编,操作系统原理,华中科技大学出版社,2000年(第三版)[3] 汤子瀛,杨成武编著,计算机操作系统,西北电讯工业大学出版社(第二版)。
实验报告课程名称: Linux操作系统实验名称:实验4、Linux文件系统-目录和文件管理学生姓名:班级学号学院(系):指导教师:实验时间:年月日实验成绩:实验四、Linux文件系统-目录和文件管理一、实验要求(1)掌握目录和文件管理的操作命令;(2)掌握文件权限的修改方法。
(3)掌握文件链接的方法。
二、实验内容和实验步骤【操作要求1】查看Linux系统常见的目录。
【操作步骤】输入命令:ls,查看Linux系统常见的目录,截图如下:【操作要求2】显示当前目录下文件类型。
【操作步骤】输入命令:ls –l|more,截图如下:说明:●“-”:表示普通文件●“d”:表示目录文件●“c”:表示字符设备文件●“b”:表示块设备文件●“l”:表示符号链接文件【操作要求3】查看当前目录下所有文件类型【操作步骤】输入命令:file *,截图如下:【操作要求4】先创建两个新目录dir1和dir2,然后将dir2目录移到dir1目录中,最后删除dir2目录。
【操作步骤】(1)以普通用户user登陆字符界面,输入命令:pwd,当前目录为用户的主目录:/home/user。
(2)输入命令:ls –l,查看当前目录中的所有文件。
(3)创建两个目录,输入命令:mkdir dir{1,2}。
(4)输入命令:ls –l,确认两个目录创建成功。
以上4个步骤截图如下:(5)输入命令:mv dir2 dir1,将dir2目录移动到dir1目录。
(6)输入命令:cd dir1,切换dir1目录,再输入:ls命令,查看到dir2目录。
截图如下:(7)删除dir2目录,输入命令:rm –rf dir2。
【操作要求5】查找profile文件。
【操作步骤】(1)切换用户为超级用户,输入命令:su -,并输入密码。
(2)输入命令:find /etc -name profile, 截图如下:(3) 使用exit命令,退出超级用户身份。
【操作要求6】将/etc/profile文件中所有包含“HOSTNAME”的行存入f4文件,并修改f4文件的权限,让所有用户都可以读写。
操作系统实验报告实验题目:文件系统专业计算机科学与技术学生姓名班级学号指导教师肖莹指导单位计算机学院日期一、实验目的1. 学习Linux系统下对文件进行操作的各种命令和图形化界面的使用方法。
二、实验指导1.文件系统常用命令操作1)ls 命令用来查看用户有执行权限的任意目录中的文件列表,该命令有许多的选项。
例如:$ ls -liah *22684 -rw-r--r-- 1 bluher users 952 Dec 28 18:43 .profile19942 -rw-r--r-- 1 scalish users 30 Jan 3 20:00 test2.out925 -rwxr-xr-x 1 scalish users 378 Sep 2 2002 test.sh上面的列表显示8 列:第1 列指示文件的inode,因为我们使用了-i 选项。
剩下的列通过-l 选项来进行正常显示。
第2 列显示文件类型和文件访问权限。
第3 列显示链接数,包括目录。
第4 和第 5 列显示文件的所有者和组所有者。
这里,所有者'bluher' 属于组'users'。
第 6 列显示文件大小(单位为所显示的单位,而不是默认的字节数,因为我们使用了-h 选项。
第7 列显示日期(它看起来像是三列),包括月、日和年,以及当天的时间。
第8 列显示文件名。
在选项列表中使用-a 将使列表中包含隐藏文件(如.profile)的列表。
(隐藏文件以.开始命名)(要求:1、任意选择一个文件夹,显示其中的所有文件的详细信息;2、自己在该文件夹内创建一个隐藏文件,调用扩展的ls命令,不显示该隐藏文件,但需要显示其他非隐藏文件的详细信息。
随后,调用带参数的ls命令,显示该隐藏文件)2)带参数的rm命令$ rm -ir Testrm:descend into directory `Test'? y可以用mkdir 来创建目录,用rmdir 来删除目录。
实验四文件系统实验一 . 目的要求1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二 . 例题:1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。
另外,为打开文件设置了运行文件目录(AFD)。
3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4、算法与框图:①因系统小,文件目录的检索使用了简单的线性搜索。
②文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。
③程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD)打开文件目录( AFD)(即运行文件目录)文件系统算法的流程图如下:三 . 实验题:1、增加 2~3个文件操作命令,并加以实现。
(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。
#include <stdio.h>#include <stdlib.h>#include <string.h>#define getpch(type) (type*)malloc(sizeof(type))int userNum=0;struct mdf{char userName[20];struct UFD* p;} mdf[20];struct ufd{char fileName[20];char File[50];struct ufd * next;}*fp,*tp,*p,*begin;typedef struct ufd UFD ;void show(struct UFD *f){begin=f;if(begin->next==NULL) printf("该用户名下尚无文件!\n");else{printf("该用户名下所有文件:\n");begin=begin->next;while(begin!=NULL){printf("%s: %s\n",begin->fileName,begin->File);begin=begin->next;}}}void Operation(struct UFD *f){int i;char filename[20],file[50];begin=f;label:printf("请选择操作:\n 1:create; 2:delete; 3:read; 4:write; 5:open;\n 6:lose; 7:Chang File's Name; 8:Show All The File\n"); scanf("%d",&i);if(i==1){tp=getpch(UFD);printf("请输入文件名:");scanf("%s",filename);printf("\n请输入文件内容:");scanf("%s",file);strcpy(tp->fileName,filename);strcpy(tp->File,file);tp->next=NULL;p=begin;p->next=tp;printf("\n文件创建完毕!\n");goto label;}else if(i==2){printf("请输入文件名:");scanf("%s",filename);p=begin->next;while(strcmp(p->fileName,filename)!=0&&p!=NULL) p=p->next;if(p==NULL) printf("文件不存在!\n");else{tp=begin;while(tp->next!=p) tp=tp->next;tp->next=p->next;free(p);printf("文件已删除!\n");}goto label;}else if(i==3){printf("请输入文件名:");scanf("%s",filename);p=begin->next;while(strcmp(p->fileName,filename)!=0&&p!=NULL) p=p->next;if(p==NULL) printf("文件不存在!\n");else{printf("%s: %s\n",p->fileName,p->File);}goto label;}else if(i==4){printf("请输入文件名:");scanf("%s",filename);printf("\n请输入文件内容:");scanf("%s",file);p=begin->next;while(p!=NULL){if(!(strcmp(p->fileName,filename))){strcpy(p->File,file);printf("\n替换了以%s为名的文件!\n",filename); goto label;}p=p->next;}tp=getpch(UFD);strcpy(tp->fileName,filename);strcpy(tp->File,file);tp->next=NULL;p=begin;p->next=tp;printf("\n创建了以%s为名的文件!\n",filename);goto label;}else if(i==5){goto label;}else if(i==6){printf("功能被关闭,无法操作了\n");Select();}else if(i==7){printf("请输入要改名的文件名:");scanf("%s",filename);while(p!=NULL){if(!(strcmp(p->fileName,filename))){printf("\n请输入新的文件名:");scanf("%s",filename);strcpy(p->fileName,filename);printf("\n文件名已更改!\n");goto label;}p=p->next;}printf("文件不存在!\n");goto label;}else if(i==8){show(f);goto label;}else{goto label;}}void Select(){char username[20];int i;printf("请输入用户名:\n");scanf("%s",username);for(i=0; i<userNum; i++){if(!strcmp(mdf[i].userName,username)){fp= mdf[i].p;if(fp!=NULL){printf("该用户已创建文件:\n");while(fp!=NULL){fp=fp->next;printf("%s\n",fp->fileName);}}else{printf("该用户尚未创建任何文件!\n"); }fp= mdf[i].p;Operation(fp);}}if(i>=userNum){printf("该用户不存在,创建新用户?\n 1:是 2:否\n");scanf("%d",&i);if(i==1){strcpy(mdf[userNum++].userName,username);printf("已创建用户!\n");i=userNum-1;fp= mdf[i].p;Operation(fp);}else{printf("查询其它?\n 1:是 2:否\n");scanf("%d",&i);if(i==1){Select();}else{printf("谢谢使用!\n");return;}}}}int main(){int i;for(i=0; i<20; i++){tp=getpch(UFD);tp->next=NULL;mdf[i].p=tp;}Select();return 0;}2、编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。
#include <stdio.h>#include <stdlib.h>#include <string.h>#define getpch(type) (type*)malloc(sizeof(type))int userNum=0;struct mdf{char userName[20];struct UFD* p;} mdf[20];struct ufd{char fileName[20];char File[50];struct ufd * next;}*fp,*tp,*p,*begin;typedef struct ufd UFD;void show(struct UFD *f){begin=f;if(begin->next==NULL) printf("该用户名下尚无文件!\n");else{printf("该用户名下所有文件:\n");begin=begin->next;while(begin!=NULL){printf("%s: %s\n",begin->fileName,begin->File);begin=begin->next;}}}void Operation(struct UFD *f){int i;char filename[20],file[50];begin=f;label:printf("请选择操作:\n 1:create; 2:delete; 3:read; 4:write; 5:open;\n 6:lose; 7:Chang File's Name; 8:Show All The File\n"); scanf("%d",&i);if(i==1){tp=getpch(UFD);printf("请输入文件名:");scanf("%s",filename);printf("\n请输入文件内容:");scanf("%s",file);strcpy(tp->fileName,filename);strcpy(tp->File,file);tp->next=NULL;p=begin;p->next=tp;printf("\n文件创建完毕!\n");goto label;}else if(i==2){printf("请输入文件名:");scanf("%s",filename);p=begin->next;while(strcmp(p->fileName,filename)!=0&&p!=NULL) p=p->next;if(p==NULL) printf("文件不存在!\n");else{tp=begin;while(tp->next!=p) tp=tp->next;tp->next=p->next;free(p);printf("文件已删除!\n");}goto label;}else if(i==3){printf("请输入文件名:");scanf("%s",filename);p=begin->next;while(strcmp(p->fileName,filename)!=0&&p!=NULL) p=p->next;if(p==NULL) printf("文件不存在!\n");else{printf("%s: %s\n",p->fileName,p->File);}goto label;}else if(i==4){printf("请输入文件名:");scanf("%s",filename);printf("\n请输入文件内容:");scanf("%s",file);p=begin->next;while(p!=NULL){if(!(strcmp(p->fileName,filename))){strcpy(p->File,file);printf("\n替换了以%s为名的文件!\n",filename); goto label;}p=p->next;}tp=getpch(UFD);strcpy(tp->fileName,filename);strcpy(tp->File,file);tp->next=NULL;p=begin;p->next=tp;printf("\n创建了以%s为名的文件!\n",filename);goto label;}else if(i==5){goto label;}else if(i==6){printf("功能被关闭,无法操作了\n");Select();}else if(i==7){printf("请输入要改名的文件名:");scanf("%s",filename);while(p!=NULL){if(!(strcmp(p->fileName,filename))){printf("\n请输入新的文件名:");scanf("%s",filename);strcpy(p->fileName,filename);printf("\n文件名已更改!\n");goto label;}p=p->next;}printf("文件不存在!\n");goto label;}else if(i==8){show(f);goto label;}else{goto label;}}void Select(){char username[20];int i;printf("请输入用户名:\n");scanf("%s",username);for(i=0; i<userNum; i++){if(!strcmp(mdf[i].userName,username)){fp= mdf[i].p;if(fp!=NULL){printf("该用户已创建文件:\n");while(fp!=NULL){fp=fp->next;printf("%s\n",fp->fileName);}}else{printf("该用户尚未创建任何文件!\n"); }fp= mdf[i].p;Operation(fp);}}if(i>=userNum){printf("该用户不存在,创建新用户?\n 1:是 2:否\n");scanf("%d",&i);if(i==1){strcpy(mdf[userNum++].userName,username);printf("已创建用户!\n");i=userNum-1;fp= mdf[i].p;Operation(fp);}else{printf("查询其它?\n 1:是 2:否\n");scanf("%d",&i);if(i==1){Select();}else{printf("谢谢使用!\n");return;}}}}int main(){int i;for(i=0; i<20; i++){tp=getpch(UFD);tp->next=NULL;mdf[i].p=tp;}Select();return 0;}3、设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。