(完整版)模拟文件系统实验报告
文件系统管理实训报告
一、实训背景随着信息技术的飞速发展,文件系统作为存储和管理数据的核心,其性能、稳定性和安全性越来越受到重视。
为了提高我们对文件系统管理的理解和实践能力,我们进行了文件系统管理实训。
本次实训以Linux系统下的文件系统管理为主要内容,通过实际操作,加深对文件系统结构、命令、权限管理等方面的认识。
二、实训目标1. 掌握Linux文件系统的基本结构;2. 熟悉常用的文件系统管理命令;3. 理解文件权限和属性的概念;4. 学会文件系统备份与恢复;5. 提高文件系统的安全性和性能。
三、实训内容(一)文件系统结构Linux文件系统采用树状结构,以根目录“/”为起点,所有文件和目录都从根目录开始分层排列。
常见的文件系统结构包括:1. 根目录(/):包含系统中的所有目录和文件;2. 换行目录(/bin、/sbin、/usr):存放常用的系统命令和系统服务;3. 用户目录(/home):存放用户个人文件和目录;4. 临时目录(/tmp):存放临时文件和程序;5. 系统目录(/etc、/var、/opt):存放系统配置文件、日志文件和可选软件包。
(二)文件系统管理命令1. ls:列出目录内容;2. pwd:显示当前目录的绝对路径;3. cd:切换目录;4. mkdir:创建目录;5. rmdir:删除空目录;6. touch:创建空文件;7. rm:删除文件或目录;8. cp:复制文件或目录;9. mv:移动或重命名文件或目录;10. chmod:修改文件权限;11. chown:更改文件所有者;12. chgrp:更改文件所属组。
(三)文件权限和属性Linux文件权限分为三组:所有者、所属组和其他用户。
每组权限包括读(r)、写(w)和执行(x)三种。
通过chmod命令可以修改文件权限,例如:- chmod 755 filename:设置所有者有读、写、执行权限,所属组和其他用户有读、执行权限;- chmod u+x filename:给所有者添加执行权限;- chmod g-w filename:取消所属组的写权限。
操作系统文件管理系统模拟实验
操作系统文件管理系统模拟实验在计算机科学中,操作系统是一种系统软件,负责管理计算机硬件和软件资源,并为用户和应用程序提供接口。
文件管理系统是操作系统的一个重要组成部分,它负责管理计算机系统中的文件和目录,以及提供对它们的访问和操作。
本次实验旨在模拟操作系统中文件管理系统的基本功能和操作。
我们将使用一个虚拟的文件系统,通过命令行界面来模拟用户与文件系统的交互。
以下是实验的具体内容和步骤:1. 创建虚拟文件系统首先,我们需要创建一个虚拟的文件系统。
文件系统由文件和目录组成,可以通过树状结构来表示。
我们可以使用一个数据结构来模拟文件系统的存储和管理。
2. 初始化文件系统在开始操作文件系统之前,我们需要初始化文件系统。
这包括创建根目录和设置当前目录为根目录。
3. 文件和目录的创建与删除文件和目录是文件系统的基本单位。
我们可以通过命令来创建和删除文件和目录。
例如,使用"mkdir"命令创建一个目录,使用"touch"命令创建一个空文件,使用"rm"命令删除文件或目录。
4. 文件和目录的访问权限文件和目录可以设置不同的访问权限,以保护文件系统的安全性。
我们可以使用"chmod"命令来修改文件或目录的权限。
权限通常包括读、写和执行权限。
5. 文件和目录的重命名和移动我们可以使用"mv"命令来重命名文件或目录,使用"cp"命令来复制文件或目录,使用"mv"命令来移动文件或目录。
6. 文件和目录的查找和显示我们可以使用"ls"命令来显示当前目录下的文件和目录,使用"cd"命令来切换当前目录,使用"pwd"命令来显示当前目录的路径。
此外,我们还可以使用"find"命令来查找文件或目录。
7. 文件和目录的读写操作文件可以被读取和写入。
操作系统试验模拟文件管理系统
一、实验目的和要求(必填)实验目的:通过在VC平台下编程,设计和调试一个简单的文件系统,通过模拟文件操作命令的执行,来模拟文件系统对文件及目录的管理。
实验要求:两名学生成组结对完成实验,仿真出文件系统中对文件和目录的操作。
二、实验内容(必填)文件管理:实现一个简单的文件系统三、实验原理或实验方法(必填)原理:通过结构体来描述文件和目录,利用链表知识实现目录树结构,通过对链表的操作实现整个文件系统中目录和文件的相关操作。
方法:学生两人结对进行实验,分别实现对文件和目录的操作。
对文件的操作包括:创建文件create、读文件read、写文件write、删除文件delete。
对目录的操作包括:创建目录mkdir、切换目录cd、展示目录内容dir、删除目录rm。
四、主要仪器设备或实验条件Windows操作系统,VC开发环境五、实验步骤(含实验数据记录处理)或操作设计过程记录#include "stdio.h"#include "iostream.h"#include "string.h"#define FILENAME_LENGTH 10 //文件名称长度#define COMMAND_LENGTH 10 //命令行长度#define PATH_LENGTH 30 //参数长度struct filenode{char filename[FILENAME_LENGTH];int isdir;char content[255];filenode *parent;filenode *child;filenode *prev;filenode *next;};filenode *initnode(char filename[],int isdir);void createroot();int run();int findpath(char *topath);void help();int mkdir();int create();int read();int write();int del();int rm();int cd();int dir();filenode *root,*recent,*temp,*ttemp,*temp_child;charpath[PATH_LENGTH],command[COMMAND_LENGTH],temppath[PATH_LENGTH],recen tpath[PATH_LENGTH];//创建文件或目录的存储节点filenode* initnode(char filename[],int isdir){filenode *node=new filenode;strcpy(node->filename,filename);node->isdir=isdir;node->parent=NULL;node->child=NULL;node->prev=NULL;node->next=NULL;return node;}//初始化文件系统根结点void createroot (){recent=root=initnode("/",1);root->parent=NULL;root->child=NULL;root->prev=root->next=NULL;strcpy(path,"/");}void help(){cout<<endl;cout<<"create: 建立文件。
文件系统实验报告
文件系统实验报告文件系统实验报告篇一:内核,文件系统实验报告一嵌入式系统实验报告(一) 091180083刘浩通信工程一、实验目的了解嵌入式系统的开发环境,内核的下载和启动过程;了解Linux内核源代码的目录结构及相关内容;了解Linux内核各配置选项的内容和作用;掌握Linux内核的编译过程;理解嵌入式操作系统文件系统的类型和作用;了解jffs2文件系统的优点及其在嵌入式系统中的作用;掌握busybx软件制作嵌入式文件系统的方法;掌握Linux嵌入式文件系统的挂载过程。
二、嵌入式系统开发实验1、mini和tftp(1)串口通信的硬件基础:嵌入式系统一般通过异步串行接口(UART)进行初级引导。
本实验中用到的是RS-232C标准的接口。
(2)软件结构:mini 运行mini,Ctrl+A-进入mini的cnfiguratin界面。
对串行通信接口进行配置,如串行通信口的设置,波特率、数据位等串口参数的设置。
保存好设置后以后可以不用再设置。
(3)btlader引导:给开发板加电,任意按下一个键进入btlader界面。
可以通过命令行方式进行设置,按0进入命令行模式,出现 51bard,可以设置开发板和pc机的ip地址:set myipaddr 192.168.207.113(设置开发板的ip地址),set destipaddr 192.168.207.13(设置pc机的ip地址)。
注意ip地址的设置:使其处于同一网段,并且避免和其他系统的ip发生冲突。
(4)通过btlader的主菜单可以完成很多功能,3——下载内核,4——将内核烧进flash,5——下载文件系统,6——将文件系统烧进flash,7——启动嵌入式操作系统等。
由于btlader需要从服务器上下载内核和文件系统,一般采用tftp服务。
进入/etc/xinetd.d/tftp修改配置,注意一定要关闭防火墙,否则可能导致下载时出问题。
再设置完后要重新启动tftp服务。
文件系统 实验报告
文件系统实验报告引言文件系统是操作系统中的一部分,用于管理计算机中的文件和目录。
它提供了数据的存储、访问、组织和管理功能,是操作系统的基础之一。
本实验通过实现一个简单的文件系统来深入理解文件系统的原理和实现方式。
实验目的1. 了解文件系统的基本概念和原理;2. 学习文件系统的设计和实现方法;3. 掌握文件系统的基本操作。
实验环境本次实验使用的是Ubuntu 20.04操作系统。
实验步骤1. 文件系统的设计在开始实现文件系统之前,我们首先需要设计文件系统的结构和功能。
1.1 文件系统的结构文件系统通常由三个主要部分组成:文件控制块、目录和数据块。
文件控制块用于存储文件的属性和元数据,目录用于组织文件和子目录,数据块用于存储文件的实际内容。
1.2 文件系统的功能文件系统需要提供以下功能:- 文件的创建、读取、修改和删除;- 目录的创建、读取、修改和删除;- 文件和目录的查找;- 文件的权限管理。
2. 文件系统的实现2.1 文件系统的初始化在实现文件系统之前,我们首先需要初始化文件系统。
包括创建超级块、位图和根目录,并将它们写入磁盘。
2.2 文件和目录的操作在文件系统中,我们需要实现文件和目录的基本操作,包括创建文件、创建目录、读取文件内容、修改文件内容和删除文件。
2.3 文件系统的其他操作除了基本的文件和目录操作之外,文件系统还需要实现其他一些功能,如文件查找、权限管理等。
3. 文件系统的测试在完成文件系统的实现后,我们需要对其进行测试,以验证其功能是否正常。
3.1 创建文件和目录我们首先创建一些文件和目录,检查它们是否被正确地写入磁盘,并且能够被正确地读取。
3.2 读取和修改文件我们随机选择一些文件,读取它们的内容,并对其内容进行修改。
修改后,我们再次读取文件,确保修改成功。
3.3 删除文件和目录我们尝试删除一些文件和目录,并检查它们是否被成功地删除。
4. 结果与讨论经过测试,我们发现我们实现的文件系统功能正常,能够按照我们的预期进行文件和目录的创建、读取、修改和删除等操作。
(完整word版)操作系统文件管理系统模拟实验(word文档良心出品)
文件管理系统模拟1. 实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现2. 实验内容为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:(1)可以实现下列几条命令(至少4条)logi n 用户登录dir 列文件目录creat e 创建文件delete删除文件ope n 打开文件close 关闭文件read 读文件write 写文件(2) 列目录时要列出文件名、物理地址、保护码和文件长度;(3) 源文件可以进行读写保护。
3. 实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
(2)用户创建的文件,可以编号存储于磁盘上。
入file0,file1,file2 …并以编号作为物理地址,在目录中进行登记。
4. 源代码#i nclude<stdio.h>#i nclude<stri ng.h>#i nclude<stdlib.h>#defi ne MEM_D_SIZE 1024*1024 //总磁盘空间为1M#defi ne DISKSIZE 1024//磁盘块的大小1K#defi ne DISK_NUM 1024//磁盘块数目1K#defi ne FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小#defi ne ROOT_DISK_NO FATSIZE/DISKSIZE+1//根目录起始盘块号#defi ne ROOT_DISK_SIZE sizeof(struct direct) // 根目录大小#defi ne DIR_MAXSIZE 1024//路径最大长度为1KB#defi ne MSD 5//最大子目录数5 }ope nitem[MOFN];#defi ne MOFN 5 int cur_size; /* 当前打文件的//最大文件深度为5 数目*/#defi ne MAX_WRITE 1024*128 };//最大写入文字长度128KBstruct fatitem *fat; /*FAT 表*/ struct fatitem /* size 8*/ struct direct *root; /* 根目录*/ { struct direct *cur_dir; /* 当前int item; /* 存放文件下一个磁目录*/盘的指针*/ struct ope ntable u_ope ntable; /* char em_disk; /*磁盘块是否空闲文件打开表*/标志位0空闲*/ int fd=-1; /* 文件打开表的序}; 号*/char *bufferdir; /* 记录当前路struct direct 径的名称*/{ char *fdisk; /* 虚拟磁盘起始地/*―一文件控制快信息―一*/址*/struct FCB{ void ini tfile();char n ame[9]; /* 文件/目录void format();名8位*/ void en ter();char property; /* 属性1位void halt();目录0位普通文件*/ int create(char *n ame);int size; /* 文件/目录字int ope n( char *n ame);节数、盘块数)*/ int close(char *n ame);int firstdisk; /* 文件/目int write(i nt fd,char *buf,i nt 录起始盘块号*/ len);int next; /* 子目录起始盘int read(i nt fd,char *buf);块号*/ int del(char *n ame);int sig n; /*1 是根目录0 int mkdir(char *n ame);不是根目录*/ int rmdir(char *n ame);void dir();}directitem[MSD+2]; int cd(char *n ame);void prin t();}; void show();struct opentable void ini tfile(){struct ope {fdisk =(char{ *)malloc(MEM_D_SIZE*sizeof(char)char n ame[9]; /* 文件名*/ );/* 申请1M空间*/int firstdisk; /* 起始盘块format(); 号*/int size; /* 文件的大小*/ }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_N UM;i++){fat[i].item = -1; fat[i].em_disk ='O';} _/* -------------------------------------------- */root = (struct direct*)(fdisk+DISKSIZE+FATSIZE); /* 根目录的地址*//*初始化目录*//* ------- 指向当前目录的目录项----- */root->directitem[0].sig n = 1;root->directitem[0].firstdisk=ROOT_DISK_NO;strcpy(root->directitem[0]. na me,".");root->directitem[0]. next = root->directitem[0].firstdisk;root->directitem[0].property ='1';root->directitem[0].size = ROOT_DISK_SIZE;/* ------ 指向上一级目录的目录项----- */root->directitem[1].sig n = 1;root->directitem[1].firstdisk=ROOT_DISK_NO;strcpy(root->directitem[1]. na me,"..");root->directitem[1]. next = root->directitem[0].firstdisk;root->directitem[1].property='1';root->directitem[1].size = ROOT_DISK_SIZE;if((fp = fope n("disk.dat","wb"))==NULL){prin tf("Error:\n Cannot ope n file \n");return;}for(i=2;i<MSD+2;i++) /*-子目录初始化为空-*/{root->directitem[i].sig n =0;root->directitem[i].firstdisk=-1;strcpy(root->directitem[i]. na me,"");root->directitem[i]. next =-1;root->directitem[i].property='0';root->directitem[i].size =0;}}}if((fp=fope n( "disk.dat","wb"))==NULL){prin tf("Error:\nCannotope n file \n");return;} if(fwrite(fdisk,MEM_D_SIZE,1, fp)!=1) /* 把虚拟磁盘空间保存到磁 盘文件中*/{prin tf("Error:\nFilewrite error! \n");}fclose(fp); }void en ter() {FILE *fp; int i;fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char) );/* 申请1M 空间*/if((fp=fopen( "disk.dat","rb") )==NULL){prin tf("Error:\nCa nnotope n file\n");return; }if(!fread(fdisk,MEM_D_SIZE,1, fp)) /* 把磁盘文件 disk.dat 读入 虚拟磁盘空间(内存)*/{prin tf("Error:\nCa nnotread file\n");exit(0);fat = (struct fatitem *)(fdisk+DISKSIZE); /* 找至U FAT表 地址*/root = (struct direct*)(fdisk+DISKSIZE+FATSIZE);/* 找 到根目录地址*/fclose(fp); /* ------------- 初始化用户打 开表 ----------- */ for(i=0;i<MOFN;i++) {strcpy(u_ope ntable.ope nitem[i ].name,"");u_ope ntable.ope nitem[i].first disk = -1;u_ope ntable.ope nitem[i].size =0;}u_ope ntable.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){prin tf("Error:\nCa nnotope n file\n");return;if(!fwrite(fdisk,MEM_D_SIZE,1,fp)) /* 把虚拟磁盘空间(内存)内容读入磁盘文件disk.dat */{prin tf("Error:\nFile writeerror!\n");}fclose(fp);free(fdisk);free(bufferdir); return;}int create(char *n ame){int i,j;if(strle n(n ame)>8) /* 文件名大于8位*/return(-1);for(j=2;j<MSD+2;j++) /* 检查创建文件是否与已存在的文件重名*/{if(!strcmp(cur_dir->directite m[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_ope ntable.cur_size>=MOFN) /* 打开文件太多*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_NUM; j++) /*找到空闲盘块j后退出*/{if(fat[j].em_disk=='O') 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 = ope n(n ame);return 0;}int ope n( char *n ame){int i, j;for(i=2;i<MSD+2;i++) /* 文件是否存在*/{if(!strcmp(cur_dir->directite m[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_ope ntable.ope nit em[j]. name, name)) break;}if(j<MOFN) /* 文件已经打开*/return(-2);if(u_ope ntable.cur_size>=MOFN) /* 文件打开太多*/return(-3);/* ------ 查找一个空闲用户打开表项--------------- */for(j=0;j<MOFN;j++){if(u_ope ntable.ope nitem[j].fi rstdisk==-1)break;/* ------------- 填写表项的相关信息--------------- */ u_ope ntable.ope nitem[j].firstdisk = cur_dir->directitem[i].firstdiskJ strcpy(u_ope ntable.ope nitem[j].name ,n ame);u_ope ntable.ope ni tem[j].size=cur_dir->directitem[i].size;u_ope ntable.cur_size++;/* ---------- 返回用户打开表表项的序号 ------------------------ */return(j);}int close(char *n ame){int i;for(i=0;i<MOFN;i++){if(!strcmp(u_ope ntable.ope nitem[i]. name, name))break;}if(i>=MOFN)return(-1);/* ---------- 清空该文件的用户打开表项的内容*/strcpy(u_ope ntable.ope ni tem[i].n ame,"");u_ope ntable.ope nitem[i].firstdisk = -1;u_ope ntable.ope nitem[i].size=0;u_ope ntable.cur_size--;}return 0;} int write(i nt fd, char *buf, i nt len) {char *first;int item, i, j, k;int ilen1, ilen2, modlen, temp;/* --------- 用$字符作为空格# 字符作为换行符*/char Space = 32;char En dter= '\n';for(i=0;i<le n;i++){if(buf[i] == '$')buf[i] = Space;else if(buf[i] == '#')buf[i] = En dter; }/* --------- 读取用户打开表对应表项第一个盘块号---------------------- */下标-*//* ---- 找到的item是该文件的最后一块磁盘块*/while(fat[item].item!=-1){item =fat[item].item; /*-查找该文件的下一盘块--*/}/*----- 计算出该文件的最末地址----- */first = fdisk+item*DISKSIZE+u_ope ntable. ope nitem[fd].size%DISKSIZE;/* ----- 如果最后磁盘块剩余的大小大于要写入的文件的大小*/if(DISKSIZE-u_ope ntable.ope ni tem[fd].size%DISKSIZE>le n){ strcpy(first,buf);u_ope ntable.ope ni tem[fd].sizeu_ope ntable.ope nitem[fd].size+le n;item = u_ope ntable.ope nitem[fd].firstdi sk;/* ------------ 找到当前目录所对应表项的序号------------------------- */for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].firstdisk==item)break;}temp = i; /*- 存放当前目录项的cur_dir->directitem[temp].siz ecur_dir->directitem[temp].size+l en;}else{for(i=0;i<(DISKSIZE-u_ope ntab le.ope nitem[fd].size%DISKSIZE);i ++){/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/first[i] = buf [i];/*----- 计算分配完最后一块磁盘的剩余空间(字节)还剩下多少字节未存储------------- */ile n1 = len-(DISKSIZE-u_ope ntable.ope nitem[fd].size%DISKSIZE);ile n2 = ile n1/DISKSIZE; modlen = ilen 1%DISKSIZE; if(modlen>0)ilen2 = ilen 2+1; /*--还需要多少块磁盘块-*/for(j=0;j<ile n2;j++){for(i=ROOT_DISK_NO+1;i<DISK_N UM;i++)/*寻找空闲磁盘块*/{if(fat[i].em_disk=='O')break;} if(i>=DISK_NUM) /*--如果磁盘块已经分配完了-*/return(-1);first = fdisk+i*DISKSIZE; /*-- 找到的那块空闲磁盘块的起始地址-*/if(j==ile n2-1) /*--如果是最后要分配的一块-*/{for(k=0;k<le n-(DISKSIZE-u_ope ntable.ope nitem[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_ope ntable.ope ni tem[fd].size u_ope ntable.ope nitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;}return 0;}int read(i nt fd, char *buf){int len = u_ope ntable.ope nitem[fd].size;char *first;int i, j, item;int ile n1, modle n;item = u_ope ntable.ope nitem[fd].firstdi sk;ile n1 = len/DISKSIZE; modle n =len %DISKSIZE;if(modle n!=0)ilen1 = ilen 1+1; /*-- 计算文件所占磁盘的块数-*/ 项的序号,供释放目录中-*/first = fdisk+item*DISKSIZE;/*--计算文件的起始位置-*/for(i=0;i<ile n1;i++){if(i==ile n1-1) /*-- 最后一个磁盘块-*/{if(cur_dir->directitem[cur_it em].property!='0') /*-- 如果删除的(不)是目录-*/return(-3);for(j=0;j<le n-i*DISKSIZE;j++)buf[i*DISKSIZE+j]= first[j];}else /*-- 不在最后一块磁盘块-*/{for(j=0;j<le n-i*DISKSIZE;j++)buf[i*DISKSIZE+j]= first[j];item = fat[item].item;/*-查找下一盘块-*/first fdisk+item*DISKSIZE;}}return 0;} int del(char *n ame){int i,cur_item,item,temp;for(i=2;i<MSD+2;i++) /*-- 查找要删除文件是否在当前目录中-*/{if(!strcmp(cur_dir->directitem[i]. name, name)) break;}cur_item = i; /*-- 用来保存目录for(i=0;i<MOFN;i++) /*--如果文件打开,则不能删除,退出-*/{if(!strcmp(u_ope ntable.ope nit em[i]. name, name))return(-2);}item = cur_dir->directitem[cur_item].firstdisk;/*-- 该文件的起始盘块号-*/while(item!=-1) /*-- 释放空间,将FAT表对应项进行修改-*/{temp = fat[item].item;fat[item].item = -1;fat[item].em_disk = '0'; item =temp;}/* ---------------- 释放目录项--------------------- */cur_dir->directitem[cur_item].sig n = 0;cur_dir->directitem[cur_item] .firstdi sk = -1;strcpy(u_ope ntable.ope nitem[cur_item]. name,"");cur_dir->directitem[cur_item]. ne xt = -1; cur_dir->directitem[cur_item].prif(i>=MSD+2) /*--目录中-*/ return(-1);如果不在当前如果在operty = 'O';cur_dir->directitem[cur_item].size = 0;return 0;}int mkdir(char *n ame){int i,j;struct direct *cur_mkdir;if(!strcmp( name,"."))return(-4);if(!strcmp( name,".."))return(-4);if(strle n(n ame)>8) /*- 如果目录名长度大于8位-*/return(-1);for(i=2;i<MSD+2;i++) /*-如果有空闲目录项退出-*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2) /*- 目录/ 文件已满-*/ return(-2);for(j=2;j<MSD+2;j++) /*-判断是否有重名-*/{if(!strcmp(cur_dir->directitem[j]. name, name))break;}if(j<MSD+2) /*- 如果有重名-*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_ N UM;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].n ame ,n ame);cur_dir->directitem[i].firstd isk=j;cur_dir->directitem[i].size=ROOT_DISK_SIZE;cur_dir->directitem[i]. next=jJcur_dir->directitem[i].proper ty='1';/*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/cur_mkdir=(struct direct *)(fdisk+cur_dir->directitem[i].firstdisk*DISKSIZE);/*-初始化目录-*//*-指向当前目录的目录项-*/cur_mkdir->directitem[0].sig n =0;cur_mkdir->directitem[0].firstdisk=cur_dir->directitem[i].fir stdisk;strcpy(cur_mkdir->directitem[ 0]. name,".");cur_mkdir->directitem[0]. next=cur_mkdir->directitem[0].firstd isk;cur_mkdir->directitem[0].property='1';cur_mkdir->directitem[0].size=ROOT_DISK_SIZE;/*-指向上一级目录的目录项-*/cur_mkdir->directitem[1].sig n=cur_dir->directitem[O].sig n;cur_mkdir->directitem[1].firstdisk=cur_dir->directitem[O].fir stdisk;strcpy(cur_mkdir->directitem[ 1]. name,"..");cur_mkdir->directitem[1]. next =cur_mkdir->directitem[1].firstd isk;cur_mkdir->directitem[1].prop erty='1';cur_mkdir->directitem[1].size=ROOT_DISK_SIZE;for(i=2;i<MSD+2;i++) /*-子目录都初始化为空-*/{cur_mkdir->directitem[i].sig n=0;cur_mkdir->directitem[i].firs tdisk=-1;strcpy(cur_mkdir->directitem[ i]. name,"");cur_mkdir->directitem[i]. next=-1;cur_mkdir->directitem[i].prop erty='0';cur_mkdir->directitem[i].size=0;}return 0;}int rmdir(char *n ame){int i,j,item;struct direct *temp_dir;/*-检查当前目录项中有无该目录-*/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(-3);/*-判断要删除的目录有无子目录-*/temp_dir=(struct direct *)(fdisk+cur_dir->directitem[i]. next*DISKSIZE);for(j=2;j<MSD+2;j++){if(temp_dir->directitem[j]. ne xt!=-1)break;}if(j<MSD+2) /*- 有子目录或文件-*/ return(-2);/* ----------- 找到起始盘块号并将其释放 ---------- */item=cur_dir->directitem[i].f irstdisk;fat[item].em_disk='0';/*-修改目录项-*/cur_dir->directitem[i].sig n=0Jcur_dir->directitem[i].firstd isk=-1;strcpy(cur_dir->directitem[i].n ame,"");cur_dir->directitem[i]. next=-1;cur_dir->directitem[i].proper ty='0';cur_dir->directitem[i].size=OJreturn 0;}void dir(){int i;for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].fir stdisk!=-1) /*- 如果存在子目录-*/{prin tf("%s\t",cur_dir->direct item[i]. name);if(cur_dir->directitem[i].property=='0') /*- 文件-*/prin tf("%d\t\t\n",cur_dir->di rectitem[i].size);elseprintf("\t< 目录>\t\n");}}}int cd(char *n ame){int i,j,item;char *str;char *temp,*po in t,*po in t1; structdirect *temp_dir; temp_dir=cur_dir;str= name;if(!strcmp("\\", name)){cur_dir = root;strcpy(bufferdir,"Root:"); return 0;}temp = (char *)malloc(DIR_MAXSIZE*sizeof(char ));/* -最长路径名字分配空间-*/for(i=0;i<(i nt)strle n( str);i+ +)temp[i]=str[i];temp[i]='\0';for(j=0;j<MSD+2;j++) /*-查找该子目录是否在当前目录中-*/{if(!strcmp(temp_dir->directit em[j]. name,temp))break;}free(temp);/* 释放申请的临时空间*///if(temp_dir->directitem[j]. property!='1') /*- 打开的不是目录-*///return(-2);if(j>=MSD+2) /*- 不在当前目录-*/return(-1);item=temp_dir->directitem[j]. firstdisk;/*-当前目录在磁盘中位置-*/temp_dir=(struct direct *)(fdisk+item*DISKSIZE);{if(!strcmp(".." ,n ame))void prin t() {if(cur_dir->directitem[j-1].sig n!=1) /*- 如果上级目录不是根目录 -*/{poi nt=strchr(bufferdir,'\\'); //查找字符串bufferdir 中首次出现 字符\的位置while(poi nt!=NULL) {point 仁point+1; /*- 减去'\'所占的空间,记录下次查找的 起始地址-*/poi nt=strchr(poi nt1,'\\'); }*(poi nt1-1)='\O';/*-将上一级目录删除-*/} }else {〃if(n ame[0] !='\\') bufferdir=strcat(bufferdir,"\\"); /*- 修改当前目录-*/bufferdir=strcat(bufferdir, name);}cur_dir=temp_dir; /*-将当前 目录确定下来-*/return 0; }void show() {prin tf("%s>",bufferdir);**********************************\n");*文 件 统计***********************、n");prin tf("*\t 命令格式说 明*\n");prin tf("*\tcd目录名 更 改当前目录 *\n");prin tf("*\tmkdir 目录名创建子目录*\n");prin tf("*\trmdir目录名删除子目录*\n");prin tf("*\tdir显 示当前目录的子目录 *\n");prin tf("*\tcreate 文件名创建文件 *\n");prin tf("*\tdel文件名删除文件 *\n");prin tf("*\tope n 文件名打开文件*\n");prin tf("*\tclose文件名关闭文件 *\n");prin tf("*\tread读 文件*\n");prin tf("*\twrite写 文件*\n");prin tf("*\texit 退 出系统 *\n");************************************\n")・}void mai n()FILE *fp; char ch;printf('\ *********************char a[100];char code[11][10];char n ame[10];int i,flag,r_size;char *con tect;con tect = (char *)malloc(MAX_WRITE*sizeof(char))Jif((fp=fopen( "disk.dat","rb") )==NULL){prin tf("You have not format,Do you want format?(y/n)"); scanf("%c",&ch);if(ch=='y'){in itfile();prin tf("Successfully format! \n");}else{return;}}en ter();prin t();show();strcpy(code[0],"exit");strcpy(code[1],"create");strcpy(code[2],"ope n");strcpy(code[3],"close");strcpy(code[4],"write");strcpy(code[5],"read"); strcpy(code[ 6],"del");strcpy(code[7],"mkdir");strcpy(code[8],"rmdir");strcpy(code[9],"dir");strcpy(code[10],"cd");while(1){sca nf("%s",a);for(i=0;i<11;i++){if(!strcmp(code[i],a)) break;}switch(i){case 0: //退出文件系统free(contect); halt(); return;case 1: // 创建文件sca nf("%s", name); flag =create( name);if(flag==-1) { prin tf("Error:\n The length is too long !\n");} else if(flag==-2){prin tf("Error: \n The direct item is already full !\n");} else if(flag==-3){prin tf("Error: \n The number of openfile is too much !\n");} else if(flag==-4){prin tf("Error: \n The name is already in the direct !\n");}else if(flag==-5){prin tf("Error: \n show();The disk space is full!' n");Ibreak;} else case 3://关闭文件{ sca nf("%s", name);flag = close( name);prin tf("Successfully create a if(flag == -1)file! \n"); {} prin tf("Error:\nThe file is not ope ned ! \n ”);show(); }break; elsefcase 2://打开文件{sca nf("%s", name); prin tf("Successfullyclose fd = ope n(n ame); \n");if(fd == -1) }{ show();prin tf("Error: \n break;The ope n file not exit! \n ”);} case 4://写文件else if(fd == -2) if(fd ==-1){ {prin tf("Error: \n prin tf("Error:\nThe file have already opened! \n”);The file is not ope ned ! \n ”);} }else if(fd == -3) else{ {prin tf("Error: \n prin tf("PleaseThe number of open file is too much! in put the file con tect:");\n");} scan f("%s",co ntect);else if(fd == -4){ flag=write(fd ,con tect,strle n( prin tf("Error: \n con tect));It is a direct,can not open for read if(flag == 0)or write! \n"); {} else prin tf("Successfullywrite { \n");}prin tf("Successfully ope ned! else\n"); {}prin tf("Error:\n The disk size is not eno ugh! \n ”);}} show(); break;case 5://读文件if(fd ==-1){prin tf("Error:\nThe file is not ope ned ! \n ”);} else{flagread(fd,c on tect);if(flag == 0) {for(i=0;i<u_ope ntable.ope nitem[fd].size;i++){prin tf("%c",co ntect[i]);} prin tf("\t\n");}}show(); break;case 6://删除文件sca nf("%s",name); flag = del( name);if(flag == -1){prin tf("Error:\nThe file not exit! \n");} else if(flag == -2){prin tf("Error:\nThe file is opened,please first close it ! \n");} else if(flag == -3){prin tf("Error:\nThe delete is not file ! \n");} else{prin tf("Successfully delete! \n");} show(); break;case 7:// 创建子目录scanf("%s", name); flag =mkdir( name);if(flag == -1) { printf("Error:\nThe length of nameis to long! \n");} else if(flag == -2){prin tf("Error:\nThe direct item is already full !\n");} else if(flag == -3){prin tf("Error:\nThe nameis already in the direct ! \n");} else if(flag == -4){ prin tf("Error: \n '..' or '.' can not as the n ame of the direct!\n");} else if(flag == -5){prin tf("Error: \n The disk space is full!' n");} else if(flag == 0){prin tf("Successfullymak edircet! \n");} show(); break;case 8://删除子目录sca nf("%s",name); flag = rmdir( name);if(flag == -1) { printf("Error:\n The direct is not exist! \n");} else if(flag == -2){prin tf("Error:\nThe direct has son direct ,please first remove the sondircct!\n");} else if(flag == -3){prin tf("Error:\nThe remove is not direct ! \n ”);} else if(flag == 0){prin tf("Successfully remove dircet! \n");}show(); break;case 9:// 显示当前子目录dir();show(); break;case 10://更改当前目录scanf("%s", name); flag = cd(name); if(flag == -1) {prin tf("Error:\nThe path no correct!\n");} else if(flag == -2){prin tf("Error:\nThe ope ned is not direct!\n");}show(); break;default:prin tf("\n Error!\ncomma nd is wrong! \n");show();}}}The5.程序运行截图:oot: >mkdii* m uccessfull^f nake direct! loot: >cd n :oot: xui>ci'ea ,te 1 uccessFullsf create a file! :oot: \m>writelease input the file connect:hello* uccessfullsf write! :oat: \n>t i ead elloT:oot : Xn>close 1uccessf 11II5P closed*00t :\n>exitress an9 key to cont inue6.实验总结通过这一次计算机操作系统的上机实验,使我对不同环境下的操作系统有了 进一步的了解,使我学到了很多关于 Linux 的操作和相关知识。
操作系统文件系统模拟课程设计实验报告
院系:计算机科学学院
专业:软件工程
年级: 2018级
课程名称:操作系统
指导教师:帖军
学号: 2018 姓名:惺惺惜惺惺
2020年 4 月 25 日
实验
分项1
文件系统模拟
实验目的能设计一个简单的多用户文件系统。
①在系统中用一个文件来模拟一个磁盘;②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。
③实现这个文件系统。
④能实际演示这个文件系统。
实验要求具体题目:文件系统模拟系统平台:Windows
实验原理步骤(算法流程)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录,如图所示。
文件系统结构如图所示。
文件系统模拟
文件管理系统模拟一、实验目的用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
二、实验内容和要求要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令(至少4条)。
三算法及数据结构1、程序流程图main函数(即主目录下的操作)2.数据结构struct mfd{ //主文件目录char uname[12]; //用户名struct ufd *flink; //文件目录指针struct mfd *unext;}*mready=null,*mp,*ff;typedef struct mfd MFD;struct ufd{ //用户文件目录char fname[12]; //文件名int pcode ; //保护码int length; //文件长度struct ufd* fnext;}*uready=null,*np;typedef struct ufd UFD;struct afd{ //运行文件目录char openfname[12];//打开文件名int openpcode; //打开保护码int rpoint; //读指针int wpoint; //写指针}*arunning=null,*ap;typedef struct afd AFD;(1)创建文件void createfile(MFD *f) /*********************创建文件************************/{UFD *fp;fp=f->flink;if(fp==null){np=getpch(UFD);printf("创建文件");printf("\n\t\t\t\t文件名:");scanf("%s",np->fname);printf("\t\t\t\t保护码:");scanf("%d",&np->pcode);printf("\t\t\t\t文件长:");scanf("%d",&np->length);f->flink=np;np->fnext=null;}else{while(fp->fnext!=null){ fp=fp->fnext;}np=getpch(UFD);printf("创建文件");printf("\n\t\t\t\t文件名:");scanf("%s",np->fname);printf("\t\t\t\t保护码:");scanf("%d",&np->pcode);printf("\t\t\t\t文件长:");scanf("%d",&np->length);if(checkfile(np)) printf("\t\t\t\t相同文件已经存在,无法创建!\n"); else{fp->fnext=np;np->fnext=null;}}//fprint(f);}(2)删除文件/************************删除文件***************************/void fdelete(MFD *f){UFD *fp,*fq;char dename[12];printf("删除文件");fp=f->flink;if(fp==null){printf("\t\t\t\t没有文件可供删除!\n");}else{printf("\n\t\t\t\t文件名:");scanf("%s",dename);if(arunning!=null&&strcmp(dename,arunning->openfname)==0) { printf("\t\t\t\t文件正在使用中,不能删除!\n");goto end;}if(strcmp(dename,fp->fname)==0) {printf("\t\t\t\t删除文件<%s>成功!\n",dename);f->flink=fp->fnext;}else{fq=fp;fp=fp->fnext;if(fp==NULL)printf("\t\t\t\t文件名不存在\n");while(fp!=null){ if(strcmp(dename,fp->fname)==0){fq->fnext=fp->fnext;printf("\n\t\t\t\t删除文件<%s>成功!\n",dename);break;}fq=fq->fnext;fp=fp->fnext;if(fp==NULL)printf("\n\t\t\t\t文件名不存在\n");}}}end:;//fprint(f);}(3)打开文件/***********************打开文件***************************/void open(MFD *f){UFD *fp;char oname[12];int pc;fp=f->flink;if(fp==null){printf("\n\t\t\t\t没有文件可供打开!\n");}else{printf("\n\t\t\t\t文件名:");scanf("%s",oname);printf("\t\t\t\t保护码:");scanf("%d",&pc);while(fp!=null) {if((strcmp(oname,fp->fname)==0)&&(fp->pcode==pc)){ap=getpch(AFD);strcpy(ap->openfname,fp->fname);ap->openpcode=fp->pcode;ap->rpoint=0;ap->wpoint=fp->length;if(arunning==null) {arunning=ap;nowopenf(arunning);}else printf("\t\t\t\t正在打开文件,不允许同时运行两个文件!\n");break;}fp=fp->fnext;}if(arunning==null) printf("\t\t\t\t文件不存在!\n");}(4)写文件/********************写入文件**********************/void write(MFD *f){int len,i;UFD *fp;fp=f->flink;printf("写入文件");open(f);if((arunning->openpcode==1)||(arunning->openpcode==3)) {printf("\t\t\t\t文件不可写!\n");close();}else{ printf("\t\t\t\t写入内容长度:");scanf("%d",&len);printf("\t\t\t\t写入文件中....\n\t\t\t\t\t\t");for(i=arunning->wpoint;i<(arunning->wpoint+len);i++){printf("> ");Sleep(200);}arunning->wpoint=arunning->wpoint+len;while(fp!=null){ if(strcmp(arunning->openfname,fp->fname)==0){fp->length=arunning->wpoint;break;}fp=fp->fnext;}printf("\n\t\t\t\t写入完毕!\n");close();}}(5)读文件/*******************读取文件***********************/void read(MFD *f){printf("读取文件");open(f);if(arunning==null) goto end;if(arunning->openpcode==3) printf("\t\t\t\t文件不可读!\n");else{printf("\t\t\t\t读取文件中....\n");for((arunning->rpoint)=0;(arunning->rpoint)<(arunning->wpoint);(arunning-> rpoint)++){printf("\t\t\t\t\t\t>>>>>>>");Sleep(200);}printf("\n\t\t\t\t读取完毕!\n");}close();end:;}(6)插入用户到用户队列/*****************插入用户到用户队列*******************/void uinsert(){MFD *first,*second;if(mready==null){mp->unext=mready;mready=mp;}else{ first=mready;second=first->unext;while(second!=null){ first=first->unext;second=second->unext;}first->unext=mp;}usernum=usernum+1;//增加一个用户 }五、实验结果及分析1、运行结果(要求截图)(能动态说明执行结果)用户一级操作界面创建用户用户登录后二级操作界面创建文件a、b、c、d查看文件信息删除文件d 读取不存在文件r打开文件a 删除正在使用中的文件a读取文件b 写入不可写文件c写入可写文件b 查看文件信息关闭文件打开文件后关闭文件退回上一级界面2、实验结果的分析及说明根据界面提示操作,特别说明,对于命令操作create、delete、open、close、read、write用了选择数字按键操作。
操作系统虚拟文件系统实验报告
操作系统虚拟文件系统实验报告一、实验目的本实验旨在帮助学生理解操作系统中虚拟文件系统的概念和工作原理,通过实际操作来深入学习和掌握相关知识。
二、实验环境本次实验使用的操作系统为Linux,实验工具为虚拟机软件VMware Workstation。
三、实验步骤1. 创建虚拟机:首先启动VMware Workstation,创建一个新的虚拟机并安装Linux操作系统。
2. 挂载文件系统:在Linux系统中,使用命令行工具挂载一个文件系统到指定的目录,例如将/dev/sdb1挂载到/mnt目录下。
3. 创建文件:在挂载后的文件系统中,通过命令行工具创建若干个文件和目录,可以使用touch和mkdir命令。
4. 编辑文件内容:使用vim或者其他文本编辑工具,在创建的文件中添加一些内容。
5. 查看文件系统信息:使用df命令查看当前系统的文件系统使用情况,通过ls命令查看文件和目录的信息。
6. 卸载文件系统:使用umount命令卸载之前挂载的文件系统。
7. 实验总结:对本次实验的操作过程和结果进行总结,思考在实际应用中虚拟文件系统的意义和作用。
四、实验结果分析通过本次实验,我深入理解了操作系统中虚拟文件系统的概念和原理。
在实际操作过程中,我掌握了如何挂载和卸载文件系统,创建和编辑文件内容,以及查看文件系统信息的方法。
这些基本操作对于日常的系统管理和开发工作具有重要意义,能够有效地提高工作效率和便捷性。
五、实验感想本次实验虽然只是简单的操作演示,但对我理解操作系统的文件系统和虚拟化技术有着重要的意义。
通过亲身操作,我对虚拟文件系统的工作原理有了更加直观的认识,对操作系统中文件管理的流程和方式也有了更深入的理解。
这对我今后的学习和工作都具有积极的促进作用,我会继续学习和提升相关知识和技能,努力成为一名优秀的操作系统工程师。
六、实验总结通过本次操作系统虚拟文件系统的实验,我进一步巩固了相关知识,增强了对操作系统的理解和掌握。
文件系统存储空间管理模拟实验报告
课程名称计算机操作系统实验名称文件系统存储空间管理模拟姓名____________________ 学号_______________________________ 专业班级_________________ 实验日期____________________________ 成绩______________________ 指导老师_________________________一、实验目的根据提出的文件分配和释放请求,动态显示磁盘空闲空间的态以及文件目录的变化,以位示图和索引分配为例:每次执行请求后要求显示或打印位示图的修改位置、分配和回收磁盘的物理块地址、更新的位示图、目录。
二、实验原理用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,0表示、空闲,1表示分配;当请求分配一个磁盘块时,寻找到数组中为0的位,计算相对磁盘块号,并计算其在磁盘中的物理地址(柱面号、磁道号、物理块号),并将其状态由0变到1。
当释放某一物理块时,已知其在磁盘中的物理地址,计算其相对磁盘块号,再找到位示图数组中的相应位,将其状态由1变为0。
三、主要仪器设备PC机(含有VC)四、实验内容与步骤实验内容:1.模拟文件空间分配、释放过程,可选择连续分配、链式分配、索引分配方法;2.文件空闲空间管理,可采用空白块链、空白目录、位示图方法;步骤如下:1.输入磁盘基本信息参数,计算位示图大小,并随机初始化位示图;(1)磁盘基本信息:磁盘柱面数m,每柱面磁道数p,每磁道物理块数q;(2)假设采用整数数组存放位示图,则数组大小为:Size= ceil ((柱面数*每柱面磁道数*每磁道物理块数)/ (sizeof(int)*8 ))(3)申请大小为size的整数数组map,并对其进行随机初始化。
例如:假设m=2, p=4, q=8, 共有64个磁盘块,若sizeof(int)=2, 则位示图大小为4,map[4]如下:位示图中每一位对应的相对磁盘块号如下图,磁盘块号由小到大对应于数组的低地址到高地址位上。
文件系统实验报告
一、实验目的1. 理解文件系统的基本概念和组成。
2. 掌握文件系统的创建、删除、修改和查询等基本操作。
3. 了解文件系统的性能分析和优化方法。
4. 提高对文件系统原理的理解和实际操作能力。
二、实验环境1. 操作系统:Windows 102. 文件系统:NTFS3. 实验软件:Windows资源管理器、Notepad++等三、实验内容1. 文件系统的基本概念和组成(1)文件:存储在文件系统中的数据单元,可以是程序、文档、图片等。
(2)目录:用于组织文件的结构,类似于文件夹。
(3)文件系统:管理存储设备上文件和目录的数据结构。
2. 文件系统的创建、删除、修改和查询等基本操作(1)创建文件:使用Notepad++创建一个名为“test.txt”的文本文件。
(2)创建目录:在Windows资源管理器中,创建一个名为“test”的目录。
(3)删除文件:选中“test.txt”文件,按Delete键删除。
(4)删除目录:选中“test”目录,按Delete键删除。
(5)修改文件:使用Notepad++打开“test.txt”文件,修改内容后保存。
(6)查询文件:在Windows资源管理器中,通过路径或搜索功能查找“test.txt”文件。
3. 文件系统的性能分析和优化方法(1)查看磁盘空间使用情况:在Windows资源管理器中,选中磁盘分区,查看磁盘空间使用情况。
(2)清理磁盘:使用Windows自带的磁盘清理工具清理磁盘垃圾文件。
(3)优化文件系统:使用Windows自带的磁盘碎片整理工具优化文件系统。
四、实验结果与分析1. 创建文件和目录实验结果显示,使用Notepad++创建了一个名为“test.txt”的文本文件,使用Windows资源管理器创建了一个名为“test”的目录。
2. 删除文件和目录实验结果显示,成功删除了“test.txt”文件和“test”目录。
3. 修改文件实验结果显示,使用Notepad++修改了“test.txt”文件的内容,并成功保存。
文件系统实验报告
文件系统实验报告文件系统实验报告一、引言文件系统是计算机操作系统中的重要组成部分,负责管理计算机中的文件和目录,提供对数据的存储、访问和管理功能。
本实验旨在通过实际操作和实验验证,深入了解文件系统的原理和工作机制。
二、实验目的1. 了解文件系统的基本概念和组成结构;2. 掌握文件系统的创建、格式化和挂载过程;3. 实践文件和目录的创建、读写和删除操作;4. 理解文件系统的性能和安全性。
三、实验环境1. 操作系统:Linux;2. 实验工具:命令行终端、文件编辑器。
四、实验步骤1. 文件系统创建与格式化在实验环境中,使用命令行终端创建一个新的文件系统。
首先,使用fdisk命令创建一个新的分区,然后使用mkfs命令对分区进行格式化。
格式化过程中可以选择文件系统的类型,如ext4、NTFS等。
2. 文件系统挂载将新创建的文件系统挂载到操作系统中的某个目录下。
使用mount命令指定文件系统的设备和挂载点,实现文件系统的访问。
3. 文件和目录的创建与读写在挂载的文件系统中,使用文件编辑器创建一个新的文本文件,并写入一些内容。
然后,使用cat命令查看文件的内容,确认写入操作是否成功。
接着,使用mkdir命令创建一个新的目录,并将文件移动到该目录下,验证目录的创建和文件的移动操作。
4. 文件和目录的删除使用rm命令删除之前创建的文件和目录,观察文件系统的变化。
可以通过ls命令查看文件系统中的文件和目录列表,确认删除操作是否生效。
五、实验结果与分析通过实验步骤中的操作,成功创建了一个新的文件系统,并进行了格式化和挂载。
在文件系统中创建了一个文本文件,并写入了内容。
通过查看文件的内容,确认写入操作成功。
接着,创建了一个新的目录,并将文件移动到该目录下,验证了目录的创建和文件的移动操作。
最后,成功删除了之前创建的文件和目录。
六、实验总结本实验通过实际操作和实验验证,深入了解了文件系统的原理和工作机制。
通过创建、格式化和挂载文件系统,掌握了文件系统的基本操作。
操作系统文件管理系统模拟实验
操作系统文件管理系统模拟实验1. 实验目的本实验旨在通过模拟操作系统的文件管理系统,深入理解操作系统中文件的组织结构、文件的创建、读写和删除操作,以及文件系统的管理策略。
2. 实验背景操作系统是计算机系统中的核心软件,负责管理计算机的资源并提供用户与计算机硬件之间的接口。
文件管理系统是操作系统的重要组成部分,用于管理计算机中的文件和目录结构,提供文件的读写、创建和删除等操作。
3. 实验环境本实验可以在任何支持操作系统模拟的计算机上进行,如使用虚拟机软件搭建的操作系统环境或在线操作系统模拟器。
4. 实验步骤4.1 文件系统初始化在模拟实验开始之前,需要对文件系统进行初始化。
可以选择创建一个空的文件系统或使用预先定义好的文件系统。
4.2 文件的创建在文件系统中创建一个新文件。
可以指定文件的名称、大小、属性等信息。
文件创建成功后,可以在文件系统中查看该文件的相关信息。
4.3 文件的读取选择一个已经存在的文件,并从文件系统中读取该文件的内容。
可以通过指定文件的路径或名称来进行读取操作。
读取文件时,可以选择按字节、按行或按块进行读取。
4.4 文件的写入选择一个已经存在的文件,并向该文件中写入内容。
可以选择覆盖原有内容或在文件末尾追加新内容。
写入文件时,可以选择按字节、按行或按块进行写入。
4.5 文件的删除选择一个已经存在的文件,并从文件系统中删除该文件。
删除文件后,文件系统中将不再存在该文件的相关信息。
5. 实验结果分析在完成实验步骤后,可以对实验结果进行分析和总结。
可以比较不同文件的读写操作所消耗的时间和资源,评估不同文件系统管理策略的性能优劣。
6. 实验注意事项6.1 在进行文件操作时,务必注意文件的权限和保护机制,避免误操作导致数据丢失或系统崩溃。
6.2 在进行文件读写操作时,要注意文件的大小和系统资源的限制,避免因为文件过大或系统资源不足而导致操作失败。
6.3 在进行文件删除操作时,要谨慎操作,避免误删重要文件或系统关键文件,导致系统无法正常运行。
操作系统虚拟文件系统实验报告
操作系统虚拟文件系统实验报告1. 引言本报告旨在总结并分析我们小组在操作系统虚拟文件系统实验中的经验和发现。
操作系统是计算机系统中非常重要的一个组成部分,负责管理计算机硬件和软件资源。
而虚拟文件系统(Virtual File System,VFS)则是操作系统中一个关键的抽象层,为用户和应用程序提供了统一的文件操作接口。
通过对虚拟文件系统的实验,我们深入了解了操作系统的内部实现原理,加深了对文件系统的理解。
2. 实验目的本次实验的主要目的是对操作系统的虚拟文件系统进行实践探索,通过实际操作和观察,加深对虚拟文件系统的理解,并熟悉常见的文件系统操作。
3. 实验环境我们使用了一台以Linux操作系统为基础的计算机作为实验平台,并采用虚拟机技术搭建了多个虚拟机实例,以便进行并行的多任务操作。
4. 实验过程与结果4.1 文件系统的创建与挂载首先,我们使用命令行工具创建了一个新的文件系统,并将其挂载到操作系统的指定目录上。
通过这一步骤,我们成功地在操作系统上创建了一个虚拟的文件系统,并使其能够被操作系统识别并访问。
4.2 文件的创建、读取和写入在实验过程中,我们创建了多个文件,并测试了文件的读取和写入功能。
我们发现,在虚拟文件系统下,文件的读取和写入操作是非常高效和稳定的。
通过在文件中写入不同类型的数据并进行读取,我们验证了文件系统的正确性和可靠性。
4.3 目录的创建和遍历除了文件操作外,我们还对虚拟文件系统中的目录进行了创建和遍历实验。
通过创建多层次的目录结构并遍历其中的所有文件和子目录,我们验证了虚拟文件系统对目录的管理和访问功能。
4.4 文件系统的扩展与压缩为了进一步探索虚拟文件系统的性能和可扩展性,我们对文件系统进行了动态扩展和压缩实验。
通过添加和删除大量文件,我们观察到文件系统的性能表现良好,并且在文件数量不断增加的情况下能够有效地管理和访问这些文件。
5. 实验总结与思考通过本次虚拟文件系统的实验,我们对操作系统的底层实现原理有了更深入的了解。
文件管理实验报告
文件管理实验报告文件管理实验报告一、引言文件管理是计算机科学中一个重要的领域,它涉及到对文件的创建、存储、检索和删除等操作。
在这个实验中,我们将通过模拟文件管理系统来了解文件管理的基本原理和技术。
二、实验目的本实验的主要目的是通过设计和实现一个简单的文件管理系统,加深对文件管理的理解,并掌握文件的创建、读写、删除等基本操作。
三、实验过程1. 文件的创建在文件管理系统中,文件的创建是一个重要的操作。
我们首先需要确定文件的名称和文件的类型。
在实验中,我们选择了一个文本文件作为示例。
通过调用系统提供的文件创建函数,我们可以在指定的目录下创建一个新的文本文件。
2. 文件的读写文件的读写是文件管理的核心操作之一。
在实验中,我们使用了C语言的文件读写函数来实现对文件的读写操作。
首先,我们需要打开文件,然后可以使用读取函数来读取文件中的内容,或者使用写入函数来向文件中写入内容。
最后,我们需要关闭文件,以确保文件的完整性和安全性。
3. 文件的删除文件的删除是一个常见的操作。
在实验中,我们通过调用系统提供的文件删除函数来删除指定的文件。
在删除文件之前,我们需要确保文件已经关闭,并且没有其他进程正在使用该文件。
通过删除文件,我们可以释放磁盘空间,并且保持文件系统的整洁。
四、实验结果通过实验,我们成功地创建了一个简单的文件管理系统,并实现了文件的创建、读写和删除等基本操作。
我们可以通过系统提供的命令来查看文件的属性和内容,以及进行其他操作。
五、实验总结通过这次实验,我们深入了解了文件管理的原理和技术。
文件管理是计算机科学中一个重要的领域,它涉及到对文件的创建、存储、检索和删除等操作。
掌握文件管理的基本原理和技术对于我们理解计算机系统的运行机制和提高工作效率都具有重要意义。
在实验中,我们通过设计和实现一个简单的文件管理系统,加深了对文件管理的理解,并掌握了文件的创建、读写、删除等基本操作。
通过实验结果的验证,我们证明了文件管理系统的可行性和有效性。
文件系统实验报告
char name[12];
curuser = getspace(MFD);
while(1)
{
cout<<"\n ;<endl;
cout<<"用户名:";
cin>>name; //输入用户注册名
}
}
void DisplayUFD()//打印用户信息,包括用户的各个文件
//名称、长度和操作权限的设置信息
{
if(curuser->filepoint == false)//当前用户目录下没有任何文件存在
cout<<"\n用户 "<<curuser->username<<" 文件夹是空的"<<endl;
二、实验题目:
采用二级目录结构实现磁盘文件操作。
要求:
1.普通文件的目录项包括文件名,文件类型,文件长度,指向文件内容的指针内容。
2.目录文件的目录项包括目录名,指向下一级目录块的指针内容。假定每个目录文件最多只能占用一个块;
3.程序功能方面的要求: 需要实现一个命令行操作界面,包含如下命令:
4.程序实现方面的要求:
{
cout<<"\n保存错误。";//fclose(infile);
return;
}
else
{
if((outfile=fopen(out,"wb+"))==NULL)//申请一个缓冲区管理模块
【推荐下载】文件系统实验报告-范文word版 (19页)
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==文件系统实验报告篇一:实验四文件系统实验报告实验四文件系统实验一 .目的要求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 <malloc.h>#include <string.h>#include <conio.h>#define MAXSIZE 100#define ADDSIZE 50#define PT elem+l-> length#define N 4typedef struct term{/*班级和学期的结构体*/char class1[10];char term1[10];}term;typedef struct student{/*学生成绩信息的结构体*/term st;/*班级和学期结构体放于此结构体中*/char num[10];char name[12];float course[4];float total;float average;int bit;}lnode,*stu;typedef struct{lnode *elem;/*指向上个结构体的指针*/int size;/*最大能放lnode结构体成员的个数*/int length;/*当前长度*/}sqack,*sq;sqack *l;void init(void)/*动态分配存储空间*/{l-> elem=(stu)malloc(MAXSIZE*sizeof(lnode));l-> length =0;l-> size=MAXSIZE;}void input(void)/*输入学生的信息*/{lnode *newbase,*p;char cla[10],ter[10],ch;int n,i;if(l-> length> =l-> size){newbase=(stu)realloc(l-> elem,(l-> size +ADDSIZE)*sizeof(lnode));/*追加存储空间*/l-> elem =newbase;l-> size +=ADDSIZE;}p=l-> elem;do{printf( "输入班级和学期(学期用这种格式,如201X年上学期 201X 1,201X 年下学期 201X 2;先输入班级,回车后再输入学期)\n ");gets(cla);gets(ter);printf( "要输入多少个名单? ");scanf( "%d ",&n);printf( "输入学生的成绩\n学号\t姓名\t科目1\t科目2\t科目3\t科目4\n ");for(i=0;i <n;i++){scanf( "%s%s%d%d%d%d ",p-> num ,p-> name,p-> course[0],p->course[1],p-> course[2],p-> course[3]);strcpy(p-> st.class1,cla);strcpy(p-> st.term1,ter);++l-> length ;}printf( "要继续吗?(y/n) ");ch=getchar();}while(ch== 'Y '||ch== 'y ');}void change()/*修改学生的信息*/{lnode *p;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统大型试验实验报告姓名:XX班级:软件工程110x学号:*********xxx一、名称操作系统大型试验。
二、目的用C++编写出一个简单的模拟文件系统,实现目录的添加、删除、重命名,文件的添加、删除、重命名、文件和目录、文件的拷贝。
三、要求开发工具:word,vc win32api1.设计和实现一个简单的文件系统,要求包括目录、普通文件和文件的存储2.文件系统的目录结构采用类似Linux的树状结构;3.要求模拟的操作包括:a)目录的添加、删除、重命名;b)目录的显示(列表)c)文件的添加、删除、重命名d)文件和目录的拷贝4.用户进入时显示可用命令列表;用户输入help时显示所有命令的帮助文档;输入某个命令+?时显示该条命令的使用说明5.用户输入exit时退出该系统6.实验实现基于windows平台;7.实验开发语言可以选用C/c++等四、设计1.主要思路说明本模拟系统通过一个大小固定的数组要代表物理盘块,假设共有1024块,新增目录占一块,新增文件占一块,文件中可输入内容,内容假设定义为5个字符占一块,超出则应新申请空间。
模拟物理盘块的数组中,数组内容为-99代表改物理盘块内容为空,可使用,其他数字均代表该物理盘块被占用,其中-3代表是占用文件的末结点,其他整数代表是文件内容的下一个寻址下标,另有一个string类型的数组来存储内容,模拟文件写入了对应下标的物理盘块中。
设置了一个全局指针指向根结点,一个全局指针指向当前操作目录。
搜索空白物理盘块时采用顺序搜索物理盘块数组。
存储形式主要采用类似二叉树结构,如目录为根,目录下的第一个文件或目录存在根的子节点,目录下的其他文件或目录存在第一个文件或目录的兄弟节点,以此类推。
本程序仅seperate()函数使用现成代码,此函数功能为将输入命令串分离,仅仅起到美观作用,其余所有代码均为原创!2.申优功能:1)能实现动态增长,即当输入文件的内容大小大于分配的模拟物理盘块时系统能够自动寻找空物理盘块并分配,将超出的内容保存在新的物理盘块中,若超出模拟磁盘大小,则超出部分不保存且返回提示。
2)能实现级联删除,即当删除目录(文件夹)时,目录下的所有内容也应当删除并正确释放物理盘块空间。
3)能实现目录的复制,即复制目录时(文件夹)时,该目录下的所有文件和目录也应准确复制至目标目录中,并正确分配物理盘块空间。
3.主要函数和类的定义1)主要函数定义#define show_bnum 20 //显示物理盘块的块数#define block_size 1024 //物理盘块块数int block[block_size]; //假设有block_size块物理盘块string content[block_size]; //存放文件内容int Msize=5; //此处为模拟磁盘大小为输入5个字符fnode *root=new fnode("WP:",0,0); //设置根目录fnode *current_path=new fnode(); //当前路径fnode *seek_flag=new fnode(); //作为查找标志fnode *cp_flag=new fnode(); //作为复制的位置标志void initialize(); //初始化int seekTarget(string name); //搜索文件或目录int seek_log(string name); //搜索目录void delete_node(string name); //删除节点int freeblock(fnode *); //释放物理盘块int seekfreeblock(); //搜索可用物理盘块void show_current_path(); //显示当前路径void add_file(string name,int t); //增加目录、文件void show_curpath_all(); //显示当前目录下的所有文件void rename_file(string Oname,string Nname); //重命名void seperate(); //分离命令void cd(); //进入目录void add_File(); //增加文件功能入口void add_Log(); //增加目录功能入口void delete_file(); //删除文件或目录功能入口void show_memory(); //显示物理盘块占用情况void re_name(); //重命名功能入口void help(); //查看帮助void show_content(); //查看文件内容void write_file(); //写文件void Clear_(); //清屏void Exit(); //退出void cp(); //复制功能入口void cp_log(fnode *target,fnode *source); //复制目录void cp_file(fnode *target,fnode *source); //复制文件void cp_node(fnode *target,fnode *source); //复制节点int find_target_log(); //找到复制的目标目录int calculate_logsizeMain(fnode *); //计算目录大小int calculate_logsize(fnode *);2)文件节点类的定义:class fnode{public:string filename; //文件名int type; //文件类型,1为普通文件,0为目录文件fnode *parent; //父节点fnode *child; //子节点fnode *brother; //兄弟节点int block_num; //表示占用的物理盘块块号int isBro; //表示是否是在同级目录下,0表示不是,1表示是int isCld; //是否为目录下第一个节点,1表示是,0表示不是fnode() //初始化{type=-1;parent=NULL;child=NULL;brother=NULL;block_num=-1;isBro=0;isCld=0;}fnode(string n,int t,int b) //根节点初始化{type=t;filename=n;parent=NULL;child=NULL;brother=NULL;block_num=b;block[block_num]=-3;isBro=0;isCld=0;}fnode(fnode *p,string name,int t,int b) //文件节点初始化{parent=p;filename=name;type=t;child=NULL;brother=NULL;block_num=b;block[block_num]=-3;isBro=0;isCld=0;}void copy(fnode *cp) //拷贝函数{filename=cp->filename;type=cp->type;parent=cp->parent;child=cp->child;brother=cp->brother;block_num=cp->block_num;}};4.命令:命令解释echo echo命令可以在当前目录下创建一个文件,具体格式:echo+name md md命令可以在当前目录下创建一个目录文件,具体格式:md+name del del命令可以在当前目录下删除一个已存在的文件或目录(支持级联删除),具体格式:del+namecd cd命令可以进入下一级目录或返回上级目录、根目录,具体格式:cd+name或cd+.或cd+..cp cp命令可以复制当前目录下一个指定的文件或目录至指定的目录,具体格式:cp+name+roaddir dir命令可以显示当前目录下的所有文件和目录,具体格式:delren ren命令可以重命名一个存在于当前目录下的文件或目录,具体格式:ren+name +new nametyp typ命令可以查看当前目录下一个文件的内容,具体格式:typ+name wrt wrt命令可以在当前目录下写内容至一个已存在的文件,具体格式:wrt+name +contentmem mem命令可以查看模拟物理盘块的使用情况,具体格式:memcls cls命令为清屏命令,具体格式:clsexit exit命令为退出命令,具体格式:exit五、关键技术流程图及说明提示:若图中文字无法看清,可用Micorsoft Visio打开压缩包下“部分程序流程图”文件夹的绘图文件查看。
1.增加文件或目录(此功能比较简单,流程图写的较详细就不做说明):2.删除目录(实现级联删除):说明:删除目录时删除文件和删除目录本身放在同一个函数中,删除目录下的所有文件放在freeblock函数里,这样比较好处理。
下面给只给出递归函数的流程图。
3.将内容写入文件(实现动态增长):说明:图中Msize为模拟规定的文件块字符串大小,比如Msize=5,那么一个物理盘块只能存5个字符,超出则要申请新的空间。
主要采用双重循环方法写入,外层循环为需要的块数,内层循环为Msize,用string累加字符串内容,内层循环退出后新申请一个空间并将对应下标赋给上一个物理盘块数组,再将对应内容存入content(为string类型的数组,模拟存储内容)数组中,直至退出外层循环。
4.复制目录:说明:这里和删除目录一样,写了两个复制函数,这样写同样因为递归调用是比较方便,第一个函数传入参数为目标目录指针和被复制的目录的指针,第一个函数里新建了一个阶段复制被复制的目录的内容,然后将新建节点的子节点和被复制目录的子结点传入下一个递归调用函数(因为目录的内容存于目录的子节点,与兄弟节点无关),第二个函数就是递归调用函数cp_node,下面就只给出cp_node的流程图(复制之前同样进行了路径的判误操作,内存大小的判断操作,是否重名的判断操作,被复制目录是否存在判断操作,这些操作在递归函数之前完成,所以下面的递归函数不体现这些操作)。
六、运行结果1.主界面展示:图:主界面展示2.help命令展示:图:help命令展示3.echo命令展示:图:echo命令展示4.del命令展示:图:del命令展示-普通删除说明:创建了目录log1,在log1中创建一系列文件和目录,磁盘使用情况显示已分配,实用del删除命令后查看磁盘分配证明级联删除是可靠的。
图:del命令展示-级联删除5.md命令展示:图:md命令展示6.cd命令展示:说明:图中展示了cd+name、cd+.、cd+..三种cd命令的使用和判别情况。