模拟磁盘文件管理系统.

合集下载

操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验

文件管理系统模拟1.实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 2.实验内容为Linux 系统设计一个简单的二级文件系统。

要求做到以下几点: (1)可以实现下列几条命令(至少4条) login 用户登录 dir列文件目录create 创建文件 delete 删除文件open 打开文件 close 关闭文件 read 读文件 write写文件(2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。

3.实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改.(2)用户创建的文件,可以编号存储于磁盘上。

入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。

4.源代码#include<stdio 。

h> #include 〈string.h 〉 #include 〈stdlib 。

h 〉 #define MEM_D_SIZE 1024*1024 //总磁盘空间为1M #define DISKSIZE 1024 //磁盘块的大小1K #define DISK_NUM 1024 //磁盘块数目1K #define FATSIZE DISK_NUM*sizeof (struct fatitem ) //FAT 表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号 #define ROOT_DISK_SIZE sizeof (struct direct ) //根目录大小 #define DIR_MAXSIZE 1024 //路径最大长度为1KB #define MSD 5 //最大子目录数5#define MOFN 5//最大文件深度为5#define MAX_WRITE 1024*128//最大写入文字长度128KBstruct fatitem /* size 8*/{int item; /*存放文件下一个磁盘的指针*/char em_disk; /*磁盘块是否空闲标志位 0 空闲*/};struct direct{/*--——-文件控制快信息-—---*/struct FCB{char name[9]; /*文件/目录名 8位*/char property; /*属性 1位目录 0位普通文件*/int size; /*文件/目录字节数、盘块数)*/int firstdisk; /*文件/目录起始盘块号*/int next; /*子目录起始盘块号*/int sign; /*1是根目录 0不是根目录*/}directitem[MSD+2];};struct opentable{struct openttableitem{char name[9]; /*文件名*/int firstdisk; /*起始盘块号*/int size; /*文件的大小*/ }openitem[MOFN];int cur_size; /*当前打文件的数目*/};struct fatitem *fat; /*FAT表*/struct direct *root; /*根目录*/struct direct *cur_dir; /*当前目录*/struct opentable u_opentable; /*文件打开表*/int fd=—1; /*文件打开表的序号*/char *bufferdir; /*记录当前路径的名称*/char *fdisk; /*虚拟磁盘起始地址*/void initfile();void format();void enter();void halt();int create(char *name);int open(char *name);int close(char *name);int write(int fd,char *buf,int len);int read(int fd,char *buf);int del(char *name);int mkdir(char *name);int rmdir(char *name);void dir();int cd(char *name);void print();void show();void initfile(){fdisk = (char *)malloc(MEM_D_SIZE*sizeof (char)); /*申请 1M空间*/format();}void format(){int i;FILE *fp;fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT 表地址,引导区向后偏移 1k)*/ /*————-初始化FAT表-———---——-—-*/fat[0]。

操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验操作系统文件管理系统模拟实验一、实验目的本实验旨在通过模拟操作系统的文件管理系统,加深对操作系统文件管理的理解,锻炼操作系统的应用能力。

二、实验环境1、操作系统:Windows/Linux/MacOS2、编程语言:C/C++/Java/Python等三、实验内容1、初始化文件管理系统1.1 创建根目录,并初始化空文件目录1.2 初始化用户目录和权限设置2、文件操作2.1 创建文件2.1.1 检查文件名合法性2.1.2 检查文件是否已存在2.1.3 为新文件分配磁盘空间2.1.4 添加文件元数据信息2.2 打开文件2.2.1 检查文件是否存在2.2.2 检查用户权限2.3 读取文件内容2.3.1 读取文件权限检查2.3.2 读取文件内容2.4 写入文件内容2.4.1 写入文件权限检查2.4.2 写入文件内容2.5 删除文件2.5.1 检查文件是否存在2.5.2 检查用户权限2.5.3 释放文件占用的磁盘空间2.5.4 删除文件元数据信息3、目录操作3.1 创建子目录3.1.1 检查目录名合法性3.1.2 检查目录是否已存在3.1.3 添加目录元数据信息3.2 打开目录3.2.1 检查目录是否存在3.2.2 检查用户权限3.3 列出目录内容3.3.1 列出目录权限检查3.3.2 列出目录内容3.4 删除目录3.4.1 检查目录是否存在3.4.2 检查用户权限3.4.3 递归删除目录下所有文件和子目录3.4.4 删除目录元数据信息四、实验步骤1、根据实验环境的要求配置操作系统和编程语言环境。

2、初始化文件管理系统,创建根目录,并初始化用户目录和权限设置。

3、进行文件操作和目录操作。

五、实验结果分析根据实验步骤进行文件操作和目录操作,观察系统的运行情况并记录相关实验结果。

六、实验结论通过本实验,深入了解了操作系统中文件管理系统的相关原理和实现方式,并且通过实验操作进一步巩固了相应的应用能力。

磁盘管理 实验报告

磁盘管理 实验报告

磁盘管理实验报告磁盘管理实验报告概述:磁盘管理是计算机操作系统中的重要组成部分,它负责管理计算机系统中的磁盘存储空间,确保数据的高效存取和安全性。

本实验旨在通过实际操作和测试,探究磁盘管理的原理和技术,并评估其对系统性能的影响。

实验目标:1. 理解磁盘管理的基本概念和原理。

2. 掌握磁盘分区和文件系统的创建与管理方法。

3. 了解磁盘调度算法的工作原理和性能特点。

4. 分析磁盘缓存和磁盘阵列技术对系统性能的影响。

实验环境:本次实验使用了一台配置较为普通的计算机,搭载了Windows 10操作系统和500GB机械硬盘。

实验步骤和结果:1. 磁盘分区和文件系统的创建与管理:在Windows 10操作系统中,我们使用了磁盘管理工具对硬盘进行了分区和格式化操作。

通过分区,我们将硬盘划分为多个逻辑驱动器,以便更好地管理和组织数据。

而文件系统的格式化则是为了在磁盘上创建文件系统,并对其进行初始化。

我们选择了NTFS文件系统,因为它支持更大的文件大小和更高的性能。

经过实验操作,我们成功地创建了多个分区,并将它们格式化为NTFS文件系统。

2. 磁盘调度算法的工作原理和性能特点:磁盘调度算法是为了优化磁盘访问的顺序和效率而设计的。

在本次实验中,我们选择了最常用的磁盘调度算法——SCAN算法,并通过实验测试其性能。

我们使用了一个模拟的磁盘访问序列,并记录了SCAN算法下的平均寻道时间和平均旋转延迟时间。

实验结果表明,SCAN算法在磁盘访问效率方面表现出色,能够较好地平衡磁盘访问的延迟和吞吐量。

3. 磁盘缓存和磁盘阵列技术对系统性能的影响:磁盘缓存和磁盘阵列技术是提高磁盘访问性能的两种常见方法。

磁盘缓存利用高速缓存存储器来暂存磁盘数据,以减少对磁盘的实际访问次数,从而提高系统的响应速度。

而磁盘阵列则是通过将多个磁盘组合成一个逻辑单元,实现数据的并行读写,从而提高磁盘的吞吐量。

通过实验测试,我们对比了启用和禁用磁盘缓存以及使用单个磁盘和磁盘阵列的情况下的磁盘访问性能。

linux磁盘管理常用命令

linux磁盘管理常用命令

linux磁盘管理常用命令Linux是一种开源操作系统,与其他操作系统不同的是,它是由许多小工具组成的。

其中一个重要的工具就是磁盘管理命令。

磁盘管理命令是用于管理硬盘的命令,包括创建、删除、格式化、挂载和卸载等操作。

在这篇文章中,我们将介绍一些常用的Linux磁盘管理命令。

1. fdisk命令fdisk命令是Linux中最常用的分区工具之一。

它可以用来创建、删除、查看和修改磁盘分区。

使用fdisk命令需要管理员权限。

创建分区:$ sudo fdisk /dev/sda删除分区:$ sudo fdisk /dev/sda查看分区:$ sudo fdisk /dev/sda2. mkfs命令mkfs命令用于格式化磁盘分区。

它可以在磁盘分区上创建文件系统。

使用mkfs命令需要管理员权限。

格式化分区:$ sudo mkfs.ext4 /dev/sda13. mount命令mount命令用于将文件系统挂载到目录中。

它可以将磁盘分区挂载到Linux系统中的任何目录上。

使用mount命令需要管理员权限。

挂载分区:$ sudo mount /dev/sda1 /mnt卸载分区:$ sudo umount /mnt4. df命令df命令用于查看文件系统的磁盘使用情况。

它可以显示文件系统的总大小、已使用的空间和可用的空间等信息。

查看分区使用情况:$ df -h5. du命令du命令用于查看目录或文件的磁盘使用情况。

它可以显示目录或文件的磁盘使用量。

查看目录或文件使用情况:$ du -h /home/user6. fdisk -l命令fdisk -l命令用于列出系统中所有的磁盘分区信息。

它可以显示磁盘分区的大小、类型和文件系统等信息。

列出系统中所有磁盘分区:$ sudo fdisk -l7. shred命令shred命令用于安全地删除文件和目录。

它可以将文件或目录覆盖多次,以确保其无法恢复。

安全删除文件或目录:$ shred -v /home/user/file总结在Linux系统中,磁盘管理命令是非常重要的。

第8章 磁盘和文件系统管理(二)

第8章 磁盘和文件系统管理(二)
[root@localhost ~]# quotaon -ugv /mailbox /dev/sdb1 [/mailbox]: group quotas turned on
/dev/sdb1 [/mailbox]: user quotas turned on
[root@localhost ~]# quotaoff -ugv /mailbox /dev/sdb1 [/mailbox]: group quotas turned off /dev/sdb1 [/mailbox]: user quotas turned off
作用范围:针对指定的文件系统(分区) 限制对象:用户帐号、组帐号 限制类型:
► ►
磁盘容量(默认单位为KB) 文件数量
限制方法:软限制、硬限制
15/35
启用磁盘配额支持
► 启用文件系统的配额支持
添加usrquota、grpquota挂载参数
[root@localhost ~]# vi /etc/fstab /dev/sdb1 /mailbox ext3 default,usrquota,grpquota 0 0 [root@localhost ~]# mount /mailbox [root@localhost ~]# mount | tail -1 /dev/sdb1 on /mailbox type ext3 (rw,usrquota,grpquota)
功能
Scan 扫描 Create 建立
物理卷管 卷组管理 理
pvscan pvcreate vgscan vgcreate
逻辑卷管 理
lvscan lvcreate
Display 显 示
Remove 删除 Reduce 减少

文件管理系统实现

文件管理系统实现

第4部分、文件管理系统实现:●基本要求:利用磁盘文件实现操作系统的文件管理功能,主要包括目录结构的管理、外存空间的分配与释放以及空闲空间管理三部分。

●参考学时:16学时●实验提示:1、通过初始化操作建立一个模拟外存空间的文件,在该文件中保存目录和文件内容。

创建该文件时应创建初始的根目录内容、索引节点以及空闲空间位示图。

根目录实为一特殊文件,其内容为“.”和“..”目录项。

2、索引节点应包括类型(目录 or文件)、创建日期、大小、磁盘地址(为了简单起见,可采用单级索引方式)3、显示命令提示符“$”,并根据输入命令完成相应的文件操作:⏹MD(创建子目录):创建目录文件,并在父目录文件中增加目录项,最后修改父目录文件大小⏹CD(切换工作目录):根据当前目录切换到指定目录;⏹RD(删除子目录):搜索所要删除的目录是否为空目录,若是则删除;⏹MK(创建空文件):创建指定大小的文件(如输入命令“mk test 2000”,表示创建大小为2000字节的test文件),并在父目录中添加文件名称;还应对空闲空间位示图进行适当修改;⏹DEL(删除文件):如果所要删除的文件存在,则删除,同时修改父目录内容;还应对空闲空间位示图进行适当修改;⏹DIR:列出当前目录的所有目录项。

//package osDemo;import java.io.Serializable;import java.util.Calendar;public class FCB implements Serializable{private String name;int type;int size;String cal;int firstblock;public FCB(String name) {if(name.getBytes().length>=6) {=name.substring(0, 6);}else {while(name.getBytes().length<6) {name+='\u0000';}=name;}// =name;}public String getName() {return name;}public void setName(String name) { = name;}public int getType() {return type;}public void setType(int type) {this.type = type;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}public String getCal() {return cal;}public void setCal(String cal) {this.cal = cal;}public int getFirstblock() {return firstblock;}public void setFirstblock(int firstblock) {this.firstblock = firstblock;}}//package osDemo;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.ObjectOutputStream;import java.io.RandomAccessFile;import java.util.Calendar;class OS {static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));static String current_directory="";final static int EMPTY_BLOCK=0xFFFE;final static int LAST_BLOCK =0xFFFF;final static int BLOCK_SIZE=1024;static int firstblock=0;static int blockcount;static String filename="";static RandomAccessFile raf1;static ObjectOutputStream oos;static FileOutputStream fos;static DataOutputStream dos;static File file;static int f=0;//fat表中的块号static int block=0;//写块号与md mk FCB写入块中static int blockno=0;//读块号static int times=0;public static void main(String[]args)throws Exception {while(true) {String cmd="";System.out.print(current_directory);System.out.print("$:");try {cmd=br.readLine();if((cmd.indexOf("exit"))!=-1) {break;}else if(cmd.indexOf("dir")!=-1) {dir(cmd);}else if(cmd.indexOf("md")!=-1) {md(cmd);}else if(cmd.indexOf("cd")!=-1) {cd(cmd);}else if(cmd.indexOf("rd")!=-1) {rd(cmd);}else if(cmd.indexOf("mk")!=-1) {mk(cmd);}else if(cmd.indexOf("del")!=-1) {del(cmd);}else if(cmd.indexOf("format")!=-1) {format(cmd);}else if(cmd.indexOf("fat")!=-1) {fat();}else if(cmd.indexOf("info")!=-1) {String str=cmd.substring(5);int i=Integer.parseInt(str);info(i);}else if(cmd.indexOf("help")!=-1) {help();}else if(cmd.indexOf("exit")!=-1) {exit();}else {System.out.println("error command!");}}catch(Exception e) {System.out.println(e);}}}public static void dir(String cmd) throws Exception { int i=current_directory.length();String str="";if(i>0) {str=current_directory.substring(0,i-1);StringBuffer sb=new StringBuffer(str);int j=stIndexOf("/");String s1=str.substring(j+1);}// System.out.println("blockno========"+blockno);raf1=new RandomAccessFile(file,"r");raf1.seek(blockno*1024+blockcount*2);// System.out.println("-------------"+(blockno*1024+16));byte[]b=new byte[6];byte[]b1=new byte[14];int ByteCount=0;while(true) {raf1.read(b);String s2=new String(b);if(ByteCount!=1024) {// System.out.println(judge(b));// System.out.println(s2);if(!judge(b)) {int type=raf1.readInt();int size=raf1.readInt();// System.out.println("size======"+size);raf1.read(b1);String s3=new String(b1);int firstblock=raf1.readInt();// System.out.println("tyep======"+type);// System.out.println("firstblock========"+firstblock);System.out.println(s3+" "+"<DIR>"+" "+size+" "+s2); // System.out.println("ByteCount======"+ByteCount);}else {raf1.skipBytes(26);}ByteCount+=32;}else {break;}}}public static boolean judge(byte[]b) {for(int i=0;i<b.length;i++) {if(b[i]!=0) {return false;}else {continue;}}return true;}public static void md(String cmd) {String str=cmd.substring(3);try {//System.out.println("strr==========="+str);byte[]by={(byte)0xFFFF};raf1=new RandomAccessFile(file,"rw");raf1.seek(blockno*1024+block);// System.out.println(!sameName(str,blockno*1024+block));//int n=blockno*1024+16;if(!sameName(str,blockno*1024+blockcount*2)) {// System.out.println("blcok====="+(blockno*1024+block));block+=32;FCB fcb=new FCB(str);Calendar cal=Calendar.getInstance();fcb.type=1;fcb.size=1024;Stringstr1=cal.get(Calendar.YEAR)+""+(cal.get(Calendar.MONTH)+1)+""+cal.get(Calendar.DAY_OF_MONTH)+""+cal.get(Calendar.HOUR_OF_DAY)+""+cal.get(Calendar.MINUTE)+"-"+cal.get(Calendar.SECOND );if(str1.length()>14) {str1=str1.substring(0,14);}while(str1.getBytes().length<14) {str1+='\u0000';}//System.out.println(str1.length());fcb.cal=str1;fcb.firstblock=firstblock;// System.out.println("first======"+firstblock);++firstblock;// System.out.println("sencond++=="+firstblock);// oos.writeObject(f);raf1.write(fcb.getName().getBytes());raf1.writeInt(fcb.getType());raf1.writeInt(fcb.getSize());//System.out.println("fcb.getCal().getBytes().length"+fcb.getCal().getBytes().length);raf1.write(fcb.getCal().getBytes());// System.out.println("fcb.getCal().getBytes()====="+fcb.getCal().getBytes().length);raf1.writeInt(fcb.getFirstblock());++times;raf1.seek(f);raf1.write(by);raf1.write(by);f+=2;// System.out.println(f);raf1.close();System.out.println("创建成功");}else {System.out.println("此文件已经存在,请换个名字创建");return;}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static boolean sameName(String str,int n) {try {RandomAccessFile raf2=new RandomAccessFile(file,"r");int ByteCount=0;byte[]b=new byte[6];raf2.seek(n);while(true) {raf2.read(b);String s=new String(b);// System.out.println("str========"+str);// System.out.println("s======="+s);// System.out.println(str+" ="+str.length());// System.out.println(s+"="+s.length());// System.out.println("BYcoutn========="+ByteCount);// System.out.println(compare(str,s));if(ByteCount!=1024) {if(compare(str,s)) {return true;}else {raf2.skipBytes(26);ByteCount+=32;}}else {return false;}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return false;}public static void cd(String cmd) throws Exception {String str=cmd.substring(3);raf1=new RandomAccessFile(file, "r");//raf1.skipBytes(blockcount*2-1);//String s1="";byte[]b=new byte[6];String s4="";if(str.equals("/")||str.equals("..")) {blockno=0;current_directory="";block=findBlock()*32+blockcount*2;// System.out.println(block);times=0;return;}int a=blockno*1024+blockcount*2;raf1.seek(a);while(true) {raf1.read(b);//System.out.println("blockcount====="+blockcount*2);String s1=new String(b);if(s1.indexOf(str)!=-1) {raf1.skipBytes(22);int c=raf1.readInt();blockno=c;// System.out.println("blockno======="+blockno);current_directory+=str;current_directory+="/";block-=times*32;times=0;// System.out.println("hello i am in here");break;}//raf1.seek(blockcount*2+32);raf1.skipBytes(26);}}}public static int findBlock()throws Exception {RandomAccessFile raf2=new RandomAccessFile(file,"rw");raf2.seek(blockcount*2);byte[]b=new byte[6];int block1=0;while(true) {raf2.read(b);String str=new String(b);// System.out.println("str="+str);// System.out.println("block1="+block1);// System.out.println(judge(b));if(!judge(b)) {raf2.skipBytes(26);++block1;}else {return block1;}}}public static void rd(String cmd) throws Exception {String str=cmd.substring(3);raf1 =new RandomAccessFile(file,"rw");raf1.seek(blockno*1024+blockcount*2);byte[]b=new byte[6];byte[]b1=new byte[14];byte[]b2={0};int ByteCount=0;// int time=0;// System.out.println(blockno*1024+16);while(true) {raf1.read(b);String s2=new String(b);// System.out.println(s2.indexOf(str)!=-1);if(ByteCount!=1024) {if(s2.indexOf(str)!=-1) {// if(compare(s2,str)) {int type=raf1.readInt();if(type==1) {int size=raf1.readInt();raf1.read(b1);String s3=new String(b1);int firstblock=raf1.readInt();if(isHave(firstblock)) {System.out.println(s2+"不是空目录,不能删除");return;}writeFat(firstblock*2,1);// System.out.println(blockno*1024+blockcount*2+ByteCount);//times+=2raf1.seek(blockno*1024+blockcount*2+ByteCount);for(int i=0;i<32;i++) {raf1.write(b2);}//deleteEmptyList(blockno,str);//System.out.println("type="+type+" "+"size"+size+" s3="+s3+" firstblock="+firstblock);System.out.println("删除文件夹成功");break;}else {System.out.println("删除文件,请用del");break;}}else {// ++time;ByteCount+=32;raf1.skipBytes(26);}}else {System.out.println("你要删除的文件夹未找到");break;}}}public static boolean compare(String str1,String str2) {for(int i=0;i<str1.length();i++) {if(str1.charAt(i)!=str2.charAt(i)) {//if(str1.charAt(i)!=str2.charAt(i)) {return false;}else {continue;}}return true;}public static boolean isHave(int firstblock) throws Exception {raf1=new RandomAccessFile(file,"rw");raf1.seek(firstblock*1024+blockcount*2);int ByteCount=0;byte[]b=new byte[6];boolean isExit=false;while(true) {raf1.read(b);if(ByteCount!=1024) {if(!judge(b)) {isExit=true;return isExit;}ByteCount+=32;}else {return isExit;}}}public static void deleteEmptyList(int blockNum,String str) throws Exception { RandomAccessFile raf2=new RandomAccessFile(file,"rw");byte[]b={0};byte[]b1=new byte[6];int i=0;raf2.seek(blockNum*1024+blockcount*2);int ByteCount=0;//System.out.println("blockNum*1024+16====="+(blockNum*1024+16));while(true) {raf2.read(b1);String s2=new String(b1);// System.out.println("s2="+s2);// System.out.println("str="+str);// System.out.println(s2.indexOf(str)!=-1);if(ByteCount!=1024) {if(s2.indexOf(str)!=-1) {raf2.seek(blockNum*1024+blockcount*2+ByteCount);for(i=0;i<32;i++) {raf2.write(b);}break;}else {ByteCount+=32;raf2.skipBytes(26);}}else {break;}}// raf2.seek(blockNum);// for(i=0;i<32;i++) {// raf2.write(b);// }}public static void mk(String cmd) {byte[]by={(byte)0xFFFF};String[]g=cmd.split(" ");String s1=g[1];int s2=Integer.parseInt(g[2]);int i=s2/1024;try {raf1=new RandomAccessFile(file,"rw");//System.out.println("block==="+block);raf1.seek(blockno*1024+block);if(!sameName(s1,blockno*1024+blockcount*2)) {block+=32;FCB fcb=new FCB(s1);Calendar cal=Calendar.getInstance();fcb.type=0;fcb.size=s2;Stringstr1=cal.get(Calendar.YEAR)+""+(cal.get(Calendar.MONTH)+1)+""+cal.get(Calendar.DAY_OF_MONTH)+""+cal.get(Calendar.HOUR_OF_DAY)+""+cal.get(Calendar.MINUTE)+"-"+cal.get(Calendar.SECOND );if(str1.length()>14) {str1=str1.substring(0,14);}while(str1.getBytes().length<14) {str1+='\u0000';}fcb.cal=str1;fcb.firstblock=firstblock;// System.out.println("first======"+firstblock);++firstblock;//System.out.println("sencond++=="+firstblock);// oos.writeObject(f);raf1.write(fcb.getName().getBytes());raf1.writeInt(fcb.getType());raf1.writeInt(fcb.getSize());raf1.write(fcb.getCal().getBytes());raf1.writeInt(fcb.getFirstblock());++times;raf1.seek(f);// System.out.println("f=========="+f);for(int j=0;j<i;j++) { //f=4 i=1;f=raf1.write(0);// System.out.println("firstblock========="+firstblock);raf1.write(firstblock);++firstblock;f+=2;}raf1.write(by);raf1.write(by);f+=2;System.out.println("创建成功");raf1.close();}else {System.out.println("此文件已经存在,请换个名字创建");return;}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void del(String cmd) throws Exception {String str=cmd.substring(4);raf1 =new RandomAccessFile(file,"rw");int position=blockno*1024+blockcount*2;raf1.seek(position);int time=0;byte[]b=new byte[6];byte[]b1=new byte[14];byte[]b2={0};int ByteCount=0;while(true) {raf1.read(b);String s2=new String(b);// // System.out.println("s2========"+s2);// System.out.println(s2.length());// System.out.println("========="+str);// System.out.println(str.length());// System.out.println("b=========="+judge(b));// System.out.println("str.w"+str.equals(s2));// System.out.println(compare(str,s2));if(ByteCount!=1024) {if(s2.indexOf(str)!=-1) {// System.out.println("------------");int type=raf1.readInt();if(type==0) {int size=raf1.readInt();int num=size/1024+1;raf1.read(b1);String s3=new String(b1);int firstblock=raf1.readInt();writeFat(firstblock*2,num);raf1.seek(position+time*32);// System.out.println("type="+type+" "+"size"+size+" num="+num+" s3="+s3+" firstblock="+firstblock);for(int i=0;i<32;i++) {raf1.write(b2);}System.out.println("删除文件成功");break;}else {System.out.println("你输入的是文件夹名,不能使用del删除,请使用rd");break;}}else {++time;ByteCount+=32;raf1.skipBytes(26);}}else {System.out.println("你要删除的文件未找到");break;}}}public static void writeFat(int bloNo,int num) throws Exception { RandomAccessFile raf2=new RandomAccessFile(file,"rw");raf2.seek(bloNo);byte[]b={0};for(int i=0;i<num*2;i++) {raf2.write(b);}}public static void format(String cmd) {int i,j;int k=0;// byte[]b=new byte[1024];byte[]b={0};byte[]by={(byte)0xFFFF};System.out.print("Virtual disk filename:");try {filename=br.readLine();System.out.print("Block count:");blockcount=Integer.parseInt(br.readLine());block=blockcount*2;file=new File("c:\\"+filename);fos=new FileOutputStream(file);raf1=new RandomAccessFile(file,"rw");for(i=0;i<blockcount*2;i++) {// raf1. write(by);fos.write(b);}for(i=0;i<blockcount;i++) {for(k=0;k<BLOCK_SIZE;k++) {// raf1.write(by);fos.write(b);}}// fos.write(by);fos.close();raf1.seek(0);raf1.write(by) ;raf1.write(by) ;f+=2;// System.out.println(f);++firstblock;raf1.close();}catch(Exception e) {System.out.println(e);}}public static void fat() throws Exception {int j,k;FileInputStream fis=new FileInputStream(file);String hex ="";for(j=0;j<blockcount/8;j++) {for(k=0;k<16;k++) {//hex = String.format("%02X", raf2.readByte());// 0 1 2 3 4 5 6 7hex=String.format("%02X", fis.read());//System.out.print(" "+hex);if(k%2==1) {System.out.print(hex);}else {System.out.print(" "+hex);}}System.out.println();}//raf2.close();fis.close();}public static void info(int size) throws IOException {int i,j;FileInputStream fis=new FileInputStream(file);String hex="";for(i=0;i<size/16;i++) {for(j=0;j<16;j++) {hex=String.format("%02X", fis.read());//System.out.print(" "+hex);if(j%2==1) {System.out.print(hex);}else {System.out.print(" "+hex);}}System.out.println();}}public static void exit() {System.exit(0);}public static void help() {System.out.println("dir :列出目录内容");System.out.println("format :格式化创建虚拟磁盘");System.out.println("cd :切换目录,返回根目录用cd / 或者cd ..");System.out.println("rd :删除空目录");System.out.println("mk :创建文件,如mk test 2000");System.out.println("md :创建文件夹,如md test");System.out.println("del :删除文件");System.out.println("help :显示帮助内容");System.out.println("info :显示磁盘内容,如info 1024");System.out.println("fat :仅显示FAT表");System.out.println("exit :退出程序");}}。

实验四 磁盘和文件系统管理心得

实验四 磁盘和文件系统管理心得

实验四磁盘和文件系统管理心得实验四磁盘和文件系统管理心得一、实验背景磁盘和文件系统管理是计算机操作系统中非常重要的一部分,它涉及到了计算机存储和数据管理的方方面面。

在本次实验中,我们主要学习了磁盘的分区、格式化以及文件系统的创建与管理等内容。

二、实验过程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三、实验心得通过本次实验,我对磁盘和文件系统管理有了更深入的了解。

在实际应用中,我们需要根据具体情况来对磁盘进行分区和格式化,并创建适合自己的文件系统。

同时,在管理文件系统时,我们也需要注意保护数据安全,并遵循相关规范和标准。

总之,在今后的学习和工作中,我将继续深入研究磁盘和文件系统管理相关知识,并不断提升自己的技能水平。

如何在Windows操作系统中使用虚拟磁盘管理工具

如何在Windows操作系统中使用虚拟磁盘管理工具

如何在Windows操作系统中使用虚拟磁盘管理工具Windows操作系统是全球使用人数最多、应用场景最广泛的操作系统之一。

不论是个人用户还是企业用户,都需要对其进行管理和维护,以保证其稳定性和使用效率。

其中,虚拟磁盘管理工具是一个非常重要的组成部分,可以帮助用户管理和优化磁盘空间,提高系统性能。

那么,在本文中,我们将详细介绍如何在Windows操作系统中使用虚拟磁盘管理工具。

一、了解虚拟磁盘虚拟磁盘是Windows操作系统中一个非常实用的工具,它可以将一个文件或一个文件夹模拟成一个磁盘。

这样可以方便地管理和使用大量的资料和文件。

虚拟磁盘的容量可以根据用户的需求来进行设置。

二、使用虚拟硬盘创建虚拟磁盘虚拟硬盘是Windows操作系统的一个内置工具,它可以帮助用户创建和管理虚拟磁盘。

具体步骤如下:1、打开计算机管理程序在计算机管理程序中,可以看到设备管理器、磁盘管理器等多个选项。

2、选择“磁盘管理”磁盘管理是一个可以管理所有磁盘驱动器和分区的工具,包括虚拟磁盘。

3、选择“创建虚拟硬盘”在“磁盘管理”中,可以看到“创建虚拟硬盘”选项,选择该选项后,会弹出“新建虚拟硬盘向导”界面。

4、设置虚拟磁盘参数在“新建虚拟硬盘向导”界面中,可以设置虚拟磁盘的位置、大小、格式等参数,根据实际需求进行设置。

5、完成创建设置完成后,单击“完成”按钮,即可完成虚拟磁盘的创建。

在磁盘管理中可以看到新建的虚拟磁盘。

三、使用DiskGenius创建虚拟磁盘DiskGenius是一款功能强大的磁盘管理工具,可以帮助用户创建和管理虚拟磁盘。

具体步骤如下:1、下载并安装DiskGeniusDiskGenius是一款免费的软件,在官网上可以免费下载和安装。

2、打开DiskGenius打开安装完成的DiskGenius程序,在主界面中可以看到所有的磁盘分区信息。

3、选择“创建新虚拟磁盘”在主界面中,可以看到“创建新虚拟磁盘”按钮,单击该按钮后,会弹出“创建虚拟磁盘向导”界面。

设计实现虚拟磁盘建立和分区管理java

设计实现虚拟磁盘建立和分区管理java

设计实现虚拟磁盘建立和分区管理java一、介绍在计算机系统中,磁盘是一种重要的存储设备。

为了提高磁盘的使用效率和灵活性,虚拟磁盘的概念被引入。

虚拟磁盘可以帮助我们更好地管理和使用磁盘空间。

在本文中,我们将讨论如何设计和实现一个Java程序来建立和管理虚拟磁盘的分区。

二、虚拟磁盘的概念和原理1. 虚拟磁盘的定义虚拟磁盘是指通过软件模拟出的一块逻辑存储空间,它可以将多个物理磁盘组合在一起,形成一个逻辑上的磁盘。

2. 虚拟磁盘的原理虚拟磁盘的实现原理主要包括以下几个方面: - 建立虚拟磁盘:通过将多个物理磁盘合并成一个逻辑磁盘来建立虚拟磁盘。

这样可以提高磁盘的容量和性能。

-分区管理:虚拟磁盘可以被划分为多个分区,每个分区可以被看作是一个独立的磁盘。

这样可以方便地对不同分区进行管理和使用。

- 文件系统:虚拟磁盘需要支持文件系统,以便可以对文件进行存储和管理。

三、设计和实现虚拟磁盘建立和分区管理的Java程序1. 建立虚拟磁盘在Java中,我们可以通过使用文件流和字节流来建立虚拟磁盘。

可以将多个物理磁盘的文件合并成一个逻辑磁盘的文件。

建立虚拟磁盘的步骤: 1. 创建一个新的文件,作为虚拟磁盘的文件; 2. 打开多个物理磁盘的文件,通过读取文件内容,将物理磁盘的数据写入虚拟磁盘的文件。

具体实现代码如下所示:import java.io.*;public class VirtualDiskBuilder {public void build(String virtualDiskFile, String[] physicalDiskFiles) thro ws IOException {File virtualDisk = new File(virtualDiskFile);FileOutputStream fos = new FileOutputStream(virtualDisk);for (String physicalDiskFile : physicalDiskFiles) {File physicalDisk = new File(physicalDiskFile);FileInputStream fis = new FileInputStream(physicalDisk);int bytesRead;byte[] buffer = new byte[4096];while ((bytesRead = fis.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead);}fis.close();}fos.close();}}2. 分区管理虚拟磁盘可以被划分为多个分区,每个分区可以被看作是一个独立的磁盘。

磁盘在空间中的管理方法

磁盘在空间中的管理方法

磁盘在空间中的管理方法
磁盘是计算机存储数据的重要组成部分。

在计算机的运行过程中,我们需要对磁盘进行管理以确保数据的安全和可靠性。

磁盘在空间中的管理方法可以分为以下几种:
1. 分区管理
分区是将一个物理磁盘分成多个逻辑磁盘的过程。

每个逻辑磁盘可以看作是一个独立的存储空间,可以独立地进行管理。

分区可以根据不同的需求进行划分,如系统分区、数据分区等。

在分区管理中,我们需要考虑分区的大小、文件系统的选择等因素。

2. 文件系统管理
文件系统是操作系统用来管理和存储文件的一种机制。

不同的操作系统有不同的文件系统,如FAT、NTFS等。

在文件系统管理中,我们需要考虑文件的存储方式、文件的读写速度等因素。

同时,我们还需要注意文件系统的安全性,防止数据丢失或损坏。

3. 磁盘碎片整理
磁盘碎片是指文件在存储时被分成多个不连续的部分,导致磁盘空间的浪费和读写速度的下降。

磁盘碎片整理是指将文件的碎片整理成连续的部分,以提高磁盘的利用率和读写速度。

在磁盘碎片整理中,我们需要选择合适的工具,并定期进行整理。

4. 磁盘备份
磁盘备份是指将磁盘上的数据复制到另一个存储介质中,以防止数据丢失或损坏。

磁盘备份可以根据不同的需求进行选择,如完全备份、增量备份等。

在磁盘备份中,我们需要选择合适的备份策略,并定期进行备份。

总之,磁盘在空间中的管理方法是多方面的,需要根据不同的需求进行选择和实施。

我们需要综合考虑分区管理、文件系统管理、磁盘碎片整理、磁盘备份等因素,以确保磁盘的安全和可靠性。

WindowsServer网络操作系统项目教程 第4章 文件系统与磁盘配置管理

WindowsServer网络操作系统项目教程 第4章 文件系统与磁盘配置管理

第4章 文件系统与磁盘配置管理
14
4.3.4 碎片整理和优化驱动器
碎片整理和优化驱动程序可以重新安排计算机磁盘上的文件、程序以 及未使用的空间,使得程序运行得更快、文件打开得更快,磁盘碎片整 理并不影响数据的完整性。
第4章 文件系统与磁盘配置管理
15
4.3.5 磁盘配额管理
磁盘配额是计算机中指定磁盘的储存限制,就是管理员 可以为用户所能使用的磁盘空间进行配额限制,每一用户 只能使用最大配额范围内的磁盘空间。磁盘配额可以限制 指定账户能够使用的磁盘空间,这样可以避免因某个用户 的过度使用磁盘空间造成其他用户无法正常工作甚至影响 系统运行,在服务器管理中此功能非常重要。
1.NTFS权限的类型 2.多重NTFS权限 3.继承与阻止NTFS权限 4.共享文件夹权限与NTFS文件系统权限的组合 5.复制和移动文件及文件夹
第4章 文件系统与磁盘配置管理
6
4.2 磁盘管理基础知识
4.2.1 MBR磁盘与GPT磁盘 4.2.2 认识基本磁盘 4.2.3 RAID磁盘管理技术
第4章 文件系统与磁盘配置管理
13
4.3.3 磁盘基本管理
在安装Windows Server 2019操作系统时,硬盘将自动 初始化为基本磁盘。基本磁盘上的管理任务包括磁盘分区 的建立、删除、查看以及分区的挂载和磁盘碎片整理等。
1.添加新硬盘 2.使用磁盘管理工具 3.新建基本卷 4.指定活动的磁盘分区 5.更改驱动器和路径
第4章 文件系统与磁盘配置管理
9
4.2.3 RAID磁盘管理技术
独立磁盘冗余阵列(Redundant Arrays of Independent Disks,RAID)通常简称为磁盘 阵列。简单地说,RAID是由多个独立的高性能磁盘驱动器组成的磁盘子系统,提供了比单 个磁盘更高的存储性能和数据冗余技术。

计算机技术中常见的磁盘和文件系统问题及处理方法

计算机技术中常见的磁盘和文件系统问题及处理方法

计算机技术中常见的磁盘和文件系统问题及处理方法计算机技术中,磁盘和文件系统问题是非常常见的,这些问题可能会导致数据丢失、系统崩溃以及计算机运行缓慢等严重后果。

因此,了解这些问题的原因和相应的处理方法是非常重要的。

本文将介绍几个计算机技术中常见的磁盘和文件系统问题,并提供相应的处理方法。

1. 磁盘读取错误磁盘读取错误是一种常见的问题,可能是由于物理损坏、逻辑错误或电缆连接问题引起的。

当计算机无法读取磁盘上的数据时,首先要做的是检查磁盘连接是否松动或损坏。

如果连接正常,可以尝试使用专业的磁盘修复工具来修复逻辑错误。

如果问题仍然存在,可能需要考虑将数据复制到其他磁盘上,并更换新的磁盘。

2. 文件系统损坏文件系统损坏是指文件系统结构出现问题,导致无法访问或使用文件和文件夹。

这可能是由于突然断电、不正常关机或病毒感染等原因引起的。

对于文件系统损坏的问题,可以尝试使用操作系统自带的磁盘检测和修复工具来修复问题。

在某些情况下,可能需要使用第三方工具来进行更复杂的修复。

3. 磁盘空间不足磁盘空间不足是指磁盘上的可用空间已经用尽或接近用尽的状态。

这可能导致系统运行缓慢,无法保存新文件或安装新程序。

要解决磁盘空间不足的问题,可以首先删除不需要的文件和程序,以释放一些空间。

此外,可以使用磁盘清理工具来清理临时文件和垃圾文件。

如果问题仍然存在,可以考虑将一些文件移动到外部存储设备或购买额外的硬盘来扩展存储空间。

4. 文件丢失或删除文件丢失或删除是指意外删除文件或文件丢失,可能是由于误操作、系统故障或病毒攻击等原因引起的。

在出现文件丢失或删除的情况下,首先要查看回收站是否存在被删除的文件,可以将其恢复到原始位置。

如果文件不在回收站中,可以尝试使用数据恢复工具来恢复丢失的文件。

此外,可以使用防病毒软件来检查是否存在病毒感染并及时处理。

5. 磁盘分区错误磁盘分区错误是指分区表出现错误,导致磁盘无法正常使用。

这可能是由于意外断电、系统崩溃或不当的分区操作引起的。

操作系统试验模拟文件管理系统

操作系统试验模拟文件管理系统

操作系统试验摹拟文件管理系统一、引言文件管理是操作系统中的重要组成部份,它负责对计算机中的文件进行组织、存储和访问。

摹拟文件管理系统是为了更好地理解文件管理的原理和实现方式而设计的一个实验项目。

本文将详细介绍摹拟文件管理系统的设计和实现。

二、设计目标1. 实现基本的文件管理功能,包括文件的创建、删除、打开和关闭。

2. 实现文件的读写操作,包括顺序读写和随机读写。

3. 实现文件的共享和保护机制,确保多个进程可以同时对同一个文件进行读写操作。

4. 实现文件的索引和目录结构,方便文件的查找和管理。

5. 实现文件的存储管理,包括空暇空间管理和磁盘分配算法。

三、系统设计1. 文件的创建和删除在摹拟文件管理系统中,可以通过命令行或者图形界面来创建和删除文件。

创建文件时,系统会为该文件分配一个惟一的文件标识符,并在文件目录中记录该文件的相关信息。

删除文件时,系统会释放该文件占用的存储空间,并从文件目录中删除该文件的记录。

2. 文件的打开和关闭在摹拟文件管理系统中,可以通过命令行或者图形界面来打开和关闭文件。

打开文件时,系统会根据文件标识符在文件目录中查找该文件的相关信息,并将该文件的描述符返回给用户进程。

关闭文件时,系统会释放该文件的描述符,并更新文件的相关信息。

3. 文件的读写操作在摹拟文件管理系统中,可以通过命令行或者图形界面来进行文件的读写操作。

顺序读写是指按照文件的存储顺序挨次读取或者写入文件的内容,而随机读写是指根据文件的索引或者偏移量来读取或者写入文件的内容。

系统会根据用户进程的读写请求,将相应的数据从磁盘中读取或者写入到内存中。

4. 文件的共享和保护机制在摹拟文件管理系统中,多个进程可以同时对同一个文件进行读写操作。

系统会通过锁机制来实现文件的共享和保护。

当一个进程正在对文件进行读写操作时,其他进程需要等待该进程释放文件的锁才干对文件进行读写操作。

同时,系统还可以设置文件的访问权限,确保惟独具有相应权限的进程才干对文件进行读写操作。

AIX 磁盘、文件系统管理命令

AIX 磁盘、文件系统管理命令

AIX 磁盘、文件系统管理命令2011-08-22 17:24:31| 分类:AIX | 标签:|字号大中小订阅.AIX的文件系统:jfs(日志文件系统) 不支持大于2G的单个文件jfs2 可以支持单个文件大小到64GNFSCDFSAIX 5.3 以前只支持动态的增加文件系统的大小不支持动态减小一个空的文件系统由于lost+found等文件系统信息的占用可能剩余空间没有100%以下所有的命令均可通过smit管理器操作rootvg,datavg为vg;testlv为lv,testfs为文件系统VG操作:查看当前有多少卷组信息#lsvg查看某一卷组所在物理硬盘#lsvg -p rootvg查看一个vg中包含的pv#lsvg -p datavg查看某一卷组的详细信息#lsvg rootvg查看目前系统中所有逻辑卷(LV)的信息#lsvg -o | lsvg -i -llsvg -o 察看已经激活的VGlsvg -p rootvg 察看rootvg中多包含的PVlsvg -l rootvg 显示rootvg中包含哪些逻辑分区varyoffvg vg名把已经激活的VG变为非激活状态rootvg 必须处于激活状态varyonvg 激活VGvaryoffvg datavgexportvg datavgimportvg 使用这三个命令就可以修改VG的名称不不改变盘上的数据smit importvg 导出卷组,卷组必须是不活动的;smit mkvg -> 制定VG名、制订PP、设定PV 增加一个VG在物理硬盘上创建卷组#mkvg -y datavg -s 512 hdisk2512为PP size大小把hdisk2加入rootvgsmit extendvg -> 选择VGsmit reducevg 把hdisk2从rootvg中删除(此时hdisk2上必须没有数据)从物理硬盘上删除卷组#reducevg -d rootvg hdisk1smit chvg 修改VG属性LV操作smit mklv 创建LV创建LV时有下列参数要注意:logic volume name 起一个有意义的LV名字number of logical partitions 这个参数其实是指定此LV的大小1个LP相当于一个PP 如果此处添数字 2 而一个PP是16M 那么这个LV的大小是32Mphysical volume name 指定此LV将会创建在哪个PV上如果不指定那么此LV将有可能创建在多个PV上logical volume type 指定LV的类型如果做文件系统则可以填:jfs 如果使用裸设备可以填入:rawstripe size 条带化大小提高了性能他在软件级别实现了raid0 实现条带化至少需要两块盘在某一卷组中创建逻辑卷#mklv -t jfs2 -y testlv datavg 2020为PP的个数smit chlv 修改LV属性smit mklvcopy 增加LV的镜象new total number of logical partition 镜象的多少AIX最多支持三个smit rmlvcopy 改变LV镜象个数smit mirrorvg 对VG做镜象对已存在的LV做镜像,以后新建的LV不自动做镜像smit unmirrorvg 改变VG镜向个数查看某一逻辑卷的详细信息#lslv testlv显示出的LV信息中copies 显示了此LV有多少镜象如果显示为一表示没有镜象删除某一逻辑卷#rmlv testlv查看一个lv中包含的pv#lsvg -l datavgPV操作列出所有物理硬盘#lspvlspv hdisk0 显示物理卷lspv -l hdisk0 逻辑卷映射lspv -p hdisk0 物理卷映射FS操作lsfs 相当于DF 但是DF只现实已经mount了的文件系统lsfs -q 显示更详细的信息smit chfs 增加一个文件系统的大小修改number of units 可以修改文件系统的大小输入+50 即增加50个blockfuser -cux /testfs 察看什么进程在访问此文件系统得到的结果是一个进程号即PID 和用户名smit rmfs 删除一个文件系统fsck 文件系统名称检查文件系统fsck /testfs 检查testfs文件系统fsck /home fsck -y 启用修复功能defragfs -q /testfs 报告文件系统的当前状态defragfs -r /testfs 得到碎片连续化操作后和前后对比情况defragfs /testfs 执行碎片连续化操作交换空间pagespace查看交换空间信息lsps -a当交换空间的使用率大于70%的时候需要动态的增加换页空间AIX支持动态增加smit pgsp 修改交换空间大小smit mkps 增加交换空间smit chps 修改交换空间刚刚创建的交换空间默认是没有激活的swapon /dev/paging00 激活新增加的交换文件如果要删除一个交换空间首先请使用:swapoff为了增强系统的可用性交换空间也可以做镜象使用的命令是smit mklvcopychps -a paging01 删除交换空间rmps paging01 删除不活动的交换空间。

模拟磁盘文件管理系统

模拟磁盘文件管理系统

模拟磁盘文件管理系统一、任务描述模拟实现一个文件管理系统开发语言:C++、C语言、java开发工具:自选要求1、可以实现一下命令(以下命令至少实现5条):●login 用户登录●dir 列文件目录●create 创建文件●delete 删除文件●open 打开文件●close 关闭文件●cd 改变目录●mkdir 创建目录●rddir 删除目录●halt 退出系统2、列目录要求列出文件名、物理地址、文件大小、读写标识二、任务完成情况⑴自定义磁盘文件管理的数据结构;⑵能够自由创建、修改、删除文件;⑶文件具有一定自定义的属性;⑷能够显示当前系统文件的状态;(5)能够完成任务后退出系统。

三、系统流程图与函数调用关系1、类和主要函数程序中定义了两个类:(1)class file //文件类主要功能是对文件属性的定义,文件在虚拟磁盘地址块的定位。

(2)class fdatabase //文件操作类主要功能是对创建、删除、修改等方法的具体实现。

程序中的主要函数及说明:char *getname( ) //获取文件名int gettag( ) //获取删除标记int getlength() //获取文件大小int getblocknum() // 磁盘块数int getblocksum1() //磁盘块号的始点int getblocksum2() //磁盘块号的终点void setname(char na[ ] )//设置文件名void delwenjian(){ tag=1; } //设置删除标记 1:已删 0:未删void creatfile(char *na,int L,int num,int s1,int s2) //创建文件void deltefile(char *na) {tag=1; strcpy(name,na);} //删除文件void disp( ) //输出文件信息int search(char *fname) //按文件名查找int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在int deltefile(char *na) //删除文件时先查找是否存在2、函数流程图(1)整体流程图(2)创建文件流程图3、删除文件流程图4、输出文件流程图四、系统使用说明与界面设计(1)、课程设计的模板说明1、初始化,建立文件系统输入磁盘大小(G),每个盘块大小(M),自动建立位示图,位示图字长定为32位输出位示图的行数,以及行号、列号与磁盘块号的转换公式(都从0开始编号)。

实验三 文件系统空闲空间管理模拟

实验三 文件系统空闲空间管理模拟

实验三文件系统空闲空间管理模拟一、实验内容及要求要求打印或显示程序运行前和运行后的位示图,以及分配和回收磁盘的物理地址过程;二、基本原理用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,0表示空闲,1表示分配;当请求分配一个磁盘块时,寻找到数组中为0的位,计算相对磁盘块号,并计算其在磁盘中的物理地址(柱面号、磁道号、物理块号),并将其状态由0变到1。

当释放某一物理块时,已知其在磁盘中的物理地址,计算其相对磁盘块号,再找到位示图数组中的相应位,将其状态由1变为0。

三、实验步骤1. 输入已知参数:磁盘柱面数m, 每柱面磁道数p, 每磁道物理块数q, 计算位示图大小;假设采用整数数组,则数组大小为:Size= (柱面数*每柱面磁道数*每磁道物理块数)/ sizeof(int) +12. 申请大小为size的整数数组map,并对其进行随机初始化。

例如:假设m=2, p=4, q=8, 共有64个磁盘块,若sizeof(int)=16, 则位示图大小为4,map[4]如下:位示图中每一位对应的相对磁盘块号如下图,磁盘块号由小到大对应于数组的低地址到高地址位上。

即map[0]的第0位到第15位分别对应0号磁盘块到15号磁盘块的状态,map[1]的第0位到第15位对应16号磁盘块到31号磁盘块的状态,以此类推。

如上表所示,29号磁盘的状态存在map[1]中,对应于第13位, 第一行表示位号。

3. 根据位示图中为1的位信息,生成一张已分配磁盘块表。

如:map[0]的第1位为1,则i=0,j=1, 其对应的相对块号block为1, 柱面号为0,磁道号为,物理块号为1计算公式如下:(1)已知位示图中的下标i , j, 计算相对块号Block= i*sizeof( int )+j(2)已知相对块号计算柱面、磁道、物理块号如下:柱面号C= 相对块号/(每柱面磁道数*每磁道物理块数)磁道号H= 相对块号%(每柱面磁道数*每磁道物理块数)/ 每磁道物理块数物理块号R= 相对块号%每磁道物理块数4. 提出申请磁盘块或释放磁盘块的要求,根据要求完成操作。

项目3-Linux的磁盘管理与文件系统

项目3-Linux的磁盘管理与文件系统

项目3-Linux的磁盘管理与文件系统项目情景如果一件衣服放在广州市,该从何找起?这比喻好比硬盘与文件之间的关系,如果广州市没有分区、没有路标,要做这样的寻找犹如大海捞针,完全没有效果。

因此使用硬盘的第一步,就是通过分区;接着要给予坐标,能够快速找到文件所在的位置。

在linux上有多种文件系统,而不同的文件系统会有不同的格式化程序,如ext2与ext3中的mke2fs、reiserfs中的mkreiserfs、xfs中的mkfs.xfs。

随着不同的文件系统,会有不同的文件寻找方式。

项目说明因为图形化界面下管理文件与目录与Widows下差别不大,还有一些操作用图形化界面无法操作,所以本项目内的各个任务还是以介绍命令行为主。

能力目标1、了解Linux的文件系统和目录。

2、学会管理Linux的文件与目录3、学会设置文件目录的权限。

任务1 磁盘分区管理【任务目标】掌握Linux下查看分区、重新分区以及格式化分区的操作。

【任务分析】在Linux下最好还是学会使用命令行的方法来管理分区,我们要学会df、fdisk以及mke2fs等命令的使用。

【相关知识】在磁盘中有这样的概念——扇区、磁道、柱面等,这里不在赘述。

那为什么要分区呢?因为要告诉操作系统“你可以访问哪个柱面”,这样磁头才会去相应的柱面访问数据。

分区就是记录每一个分区的起始与结束柱面。

创建分区时,会设置好硬盘的各项物理参数,指定了硬盘主引导记录(即Master Boot Record,一般简称为MBR)和引导记录备份的存放位置。

分区分为主分区、扩展分区和逻辑分区,MBR最多只能记录4个分区,所以每一块硬盘的主分区和扩展分区加起来不能超过4个,在Windows下一般只有一个主分区和一个扩展分区,然后在扩展分区下建立多个逻辑分区。

【实现步骤】步骤1.Linux下的分区结构Windows的分区使用C、D、E等来对分区进行命名。

而Linux使用“设备名称+分区号码”表明硬盘的各个分区,对于主分区或者扩展分区的编码为1~4,逻辑分区则从5开始。

如何使用Windows CMD进行磁盘和文件系统管理

如何使用Windows CMD进行磁盘和文件系统管理

如何使用Windows CMD进行磁盘和文件系统管理在Windows操作系统中,CMD(命令提示符)是一个强大的工具,它可以帮助我们进行磁盘和文件系统的管理。

虽然现在有许多图形化界面的工具可以完成这些任务,但是CMD依然是一个非常有用的工具,尤其是在一些特殊情况下,如系统崩溃或无法正常启动时。

1. 磁盘管理磁盘管理是CMD的一个重要功能,它可以帮助我们管理磁盘驱动器、分区和卷。

下面是一些常用的磁盘管理命令:- diskpart:打开磁盘管理工具,可以使用该命令来管理磁盘、分区和卷。

- list disk:显示当前计算机上的所有磁盘。

- select disk [磁盘号]:选择指定的磁盘。

- clean:清除所选磁盘上的所有分区和卷。

- create partition primary:创建一个主分区。

- format fs=ntfs quick:快速格式化分区为NTFS文件系统。

- assign:分配一个可用的驱动器号给所选卷。

通过这些命令,我们可以轻松地管理磁盘驱动器、分区和卷,进行格式化、分配驱动器号等操作。

2. 文件系统管理文件系统管理是CMD的另一个重要功能,它可以帮助我们管理文件和文件夹,进行复制、移动、删除等操作。

下面是一些常用的文件系统管理命令:- dir:显示当前目录中的文件和文件夹。

- cd [目录路径]:进入指定的目录。

- md [目录名]:创建一个新的文件夹。

- copy [源文件路径] [目标文件路径]:复制文件。

- move [源文件路径] [目标文件路径]:移动文件。

- del [文件路径]:删除文件。

- rd [目录路径]:删除文件夹。

通过这些命令,我们可以方便地管理文件和文件夹,进行复制、移动、删除等操作。

此外,CMD还支持通配符,如*和?,可以帮助我们更精确地选择文件和文件夹。

3. 批处理脚本CMD还支持批处理脚本,它可以帮助我们自动化执行一系列的命令。

通过编写批处理脚本,我们可以简化重复性的操作,提高工作效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

模拟磁盘文件管理系统一、任务描述模拟实现一个文件管理系统开发语言:C++、C语言、java开发工具:自选要求1、可以实现一下命令(以下命令至少实现5条):●login 用户登录●dir 列文件目录●create 创建文件●delete 删除文件●open 打开文件●close 关闭文件●cd 改变目录●mkdir 创建目录●rddir 删除目录●halt 退出系统2、列目录要求列出文件名、物理地址、文件大小、读写标识二、任务完成情况⑴自定义磁盘文件管理的数据结构;⑵能够自由创建、修改、删除文件;⑶文件具有一定自定义的属性;⑷能够显示当前系统文件的状态;(5)能够完成任务后退出系统。

三、系统流程图与函数调用关系1、类和主要函数程序中定义了两个类:(1)class file //文件类主要功能是对文件属性的定义,文件在虚拟磁盘地址块的定位。

(2)class fdatabase //文件操作类主要功能是对创建、删除、修改等方法的具体实现。

程序中的主要函数及说明:char *getname( ) //获取文件名int gettag( ) //获取删除标记int getlength() //获取文件大小int getblocknum() // 磁盘块数int getblocksum1() //磁盘块号的始点int getblocksum2() //磁盘块号的终点void setname(char na[ ] )//设置文件名void delwenjian(){ tag=1; } //设置删除标记 1:已删 0:未删void creatfile(char *na,int L,int num,int s1,int s2) //创建文件void deltefile(char *na) {tag=1; strcpy(name,na);} //删除文件void disp( ) //输出文件信息int search(char *fname) //按文件名查找int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在int deltefile(char *na) //删除文件时先查找是否存在2、函数流程图(1)整体流程图(2)创建文件流程图3、删除文件流程图4、输出文件流程图四、系统使用说明与界面设计(1)、课程设计的模板说明1、初始化,建立文件系统输入磁盘大小(G),每个盘块大小(M),自动建立位示图,位示图字长定为32位输出位示图的行数,以及行号、列号与磁盘块号的转换公式(都从0开始编号)。

2、循环选择执行以下功能1、存储文件输入建立的文件名和文件大小,如果该文件名已经存在,则输出不能建立的信息否则计算所需的磁盘块数为其分配足够多的磁盘块,并记录下来输出所占用的磁盘块号2、删除文件输入要删除的文件名,如果该文件名不存在,则输出删除错误信息,否则收回该文件所占用的磁盘块删除该文件名3、显示位示图情况显示位示图的情况显示剩余磁盘块的数目4、显示文件列表显示文件名,文件大小,占用的磁盘块数目和磁盘块号这样,初始化,建立文件系统完成。

运行结果:(3)程序再输出位示图的剩余盘块数,行数,以及行号、列号与磁盘块号的转换公式(行列皆从0开始编号);2、选择执行:存储文件,删除文件,显示位示图情况,显示文件列表显示文件系统管理列表,并提示输入信息1——4。

用户输入文件操作命令1(存储文件),2 (删除文件)、3(显示位示图情况)、4(显示文件列表);格式如下:键入1,创建文件名为fname,大小为L(MB)的文件;键入2,删除文件名为fname的文件;键入3,显示位示图情况;键入4,显示所有文件信息。

运行结果:(2)、存储文件建立文件名为jike大小为200(MB)的文件:再建立文件名为wo大小为20(MB)的文件后显示文件列表:显示位示图情况:(3)、删除文件输入要删除的文件名,如果该文件名不存在,则输出删除错误信息,否则收回该文件所占用的磁盘块,删除该文件名文件名不存在时:成功删除jike文件:显示删除后剩余磁盘块的数目:(4)、退出系统五、结论与体会在本次课程设计刚刚开始时,不知道怎么设计。

后来认真阅读课本有关的知识,知道怎样设计才方便文件操作。

知道怎样设计后,写程序时也遇到很多的障碍,特别是出错处理。

此时深感自己编程能力的不足,经过多次修改,终于设计好了该设计。

自己通过查找资料、复习课本、编程调试,写实验报告等环节,进一步掌握了以前学到的知识,并且还对操作系统应用有了更深入的认识与掌握。

通过该课程设计,使我们更了解了课本知识,巩固了课本知识,同时也使我们的编程能力有了一定的提高,我认实到学好计算机要重视实践操作,不仅仅是学习c++语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。

六、附录出现源代码#include<iostream.h>#include <math.h>#include<iomanip.h>#include<string.h>#include<fstream.h>#include <stdio.h>#include <stdlib.h>int i=0,j=0,sum=0,tt=0,r,ii,k,g,m;int a[100][32];class file//文件类{private:int no; //文件编号char name[10]; //文件名public:int tag; //删除标记 1:已删 0:未删file( ){ }char *getname( ){return name;} //获取姓名int gettag( ){return tag;} //获取删除标记int getno() {return no;} //获取文件编号int getlength() {return length;} //获取文件大小int getblocknum() {return blocknum;} // 磁盘块数int getblocksum1()//磁盘块号的始点{ return blocksum1; }int getblocksum2()//磁盘块号的终点{ return blocksum2;}int length; //文件大小int blocknum;//盘块数int blocksum1;//所占盘块号的始点int blocksum2;//所占盘块号的终点void setname(char na[ ] ) //设置文件名{strcpy(name,na);}void delwenjian(){ tag=1; }//设置删除标记 1:已删 0:未删void creatfile(char *na,int L,int num,int s1,int s2) //创建文件 { tag=0;length=L;blocknum=num;blocksum1=s1;blocksum2=s2;strcpy(name,na);blocknum=length/m; //盘块数=文件大小/盘块大小if(length%m!=0) //盘块数取上整blocknum=blocknum+1;cout<<" 所需磁盘块数:"<<blocknum<<endl<<endl;if((sum+blocknum)<=32) //所有盘块数只占用一行,直接赋值{ for(;j<(sum+blocknum);j++)a[i][j]=1;sum=sum+blocknum; //再进行下面文件的盘块数累加}else{ //占用多行,先赋值整行for(;j<32;j++)a[i][j]=1;i=i+1;for(j=0;j<(sum+blocknum)-32;j++) //再进行剩余项赋值{a[i][j]=1;}sum=sum+blocknum-32;}tt=tt+blocknum; //输出文件所占用的盘块号cout<<" 所占磁盘块号:"<<tt-blocknum<<" to "<<tt-1<<endl;blocksum1=tt-blocknum;blocksum2=tt-1;}void deltefile(char *na) //删除文件{ tag=1;strcpy(name,na);}void disp( )//输出文件信息{cout<<setw(8)<<name<<setw(10)<<length<<setw(18)<<blocknum<<setw(12)<<blocksum1<<" to "<<blocksum2<<endl;}};class fdatabase //文件库类{ private:int top; //文件记录指针file f[50];public:fdatabase() //构造函数{top=-1;}int search(char *fname)//按文件名查找{for ( ii=0;ii<=top;ii++){ if (strcmp(f[ii].getname(),fname)==0 && f[ii].tag==0)return 0;}return 1;}int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在{ int p;p=search(na);if (p==1){ top++;f[top].creatfile(na,L,num,s1,s2);return 1;}else{cout<<" 该文件已存在,不能创建\n\n";return 0; }}int deltefile(char *na)//删除文件时先查找是否存在{int b,p,x=0,n1,n2,q1,q2,t;p=search(na);if (p==0) //若文件存在{ //进行删除文件赋值f[ii].tag=1;b=f[ii].length/m; //盘块数=当前文件大小/盘块大小if(ii==0) // 对第一个删除文件进行赋值for(k=0;k<b;k++)a[x][k]=0;else{n1=(f[ii-1].blocksum2+1)/32; //被查找的文件之前文件所占用的盘块数/32, //大于0表示跨行n2=(f[ii].blocksum2+1)/32; //所有文件所占用的盘块数/32,大于0表示跨行q1=(f[ii-1].blocksum2+1)-n1*32; // 当前文件的开始盘块号q2=(f[ii].blocksum2+1)-n2*32; // 用于跨行后计算盘块号t=n2-n1;if(t==0) //若n2与n1相等,表明当前所有被占用盘块在同一行for(k=q1;k<1+b;k++)a[n2][k]=0;else{ if((f[ii-1].blocksum2+1)%32==0) //前面所占用的盘块数是32倍数{ x=x+n1; //当前文件赋值for(;t-1>=0;t--,x++) //循环进行整行赋值for(k=0;k<32;k++)a[x][k]=0;x=n2; //对剩余项赋值for(k=0;k<b-(t-1)*32;k++)a[x][k]=0;}else //对当前文件前几项赋值{ x=n1;for(k=q1;k<32;k++)a[x][k]=0;x=x+1;int t1=t;for(;t-1>0;t--,x++) //中间整行赋值for(k=0;k<32;k++)a[x][k]=0;x=n2; //最后剩余项赋值for(k=0;k<(f[ii].blocksum2+1)-t1*32;k++)a[x][k]=0;}}return 1; }}else{cout<<"该文件不存在";return 0;}}void disp() //输出所有文件信息{for (int i=0;i<=top;i++)if(f[i].tag==0)f[i].disp();}};void bit_map(int I){int s=0;cout<<"---------------------------------------------------------------"<<endl;for(int p=0;p<I;p++){for(int q=0;q<32;q++)cout<<a[p][q]<<" ";cout<<endl;}cout<<"----------------------------------------------------------------"<<endl;for(int p1=0;p1<I;p1++)for(int q1=0;q1<32;q1++)if(a[p1][q1]==1)s=s+1;s=(g*1024)/m-s;cout<<" 剩余盘块数:"<<s<<endl;}void main(){ int I,l,b,i,j,ss1,ss2,sum=0;char fname[20];fdatabase p;file w;cout <<"\t\t************************************************\n";cout <<"\t\t* *\n";cout <<"\t\t* 初始化,建立文件系统 *\n";cout <<"\t\t**\n";cout<<"\t\t************************************************\n";cout <<" 请输入磁盘大小GB: ";cin >>g;cout<<endl;cout <<" 请输入盘块大小MB: ";cin >>m;cout<<endl;I=(g*1024)/(32*m);for( i=0;i<I;i++)for( j=0;j<32;j++)a[i][j]=0;cout<<" 建立的位示图为:"<<endl;bit_map(I);cout<<" 行数:"<<I<<endl;cout <<"\t\t************************************************\n";cout <<"\t\t* *\n";cout <<"\t\t* 行号、列号与磁盘块号的转换公式为: *\n"; cout <<"\t\t* 磁盘块号=行号*32+列号 *\n";cout <<"\t\t* 行号=磁盘块号/32 *\n";cout <<"\t\t* 列号=磁盘块号%32 *\n";cout <<"\t\t* *\n";cout <<"\t\t************************************************\n";char choice;while(choice!='0'){cout<<"\t\t************************************************\n";cout <<"\t\t* *\n";cout <<"\t\t* 文件管理系统 *\n";cout <<"\t\t**\n";cout<<"\t\t************************************************\n";cout <<"\t\t\t1 存储文件\n\n\t\t\t2 删除文件\n\n\t\t\t3 显示位示图情况 \n\n\t\t\t4 显示文件列表 \n\n\t\t\t5退出系统"<<endl;cout <<" 请输入选择项: ";cin >> choice;cout<<endl;switch (choice){case '1':cout <<" 请输入文件名: ";cin>>fname;cout<<endl; //创建文件前,先查找是否有同名文件存在int q;q=p.search(fname);if (q==0){ cout<<" 该文件已存在,不能创建\n\n";break;}cout <<" 请输入文件大小MB: ";cin>>l;cout<<endl;if(l>g*1024){cout<<" 文件大小超过磁盘最大容量,无法进行分配"<<endl;break;}p.creatfile(fname,l,b,ss1,ss2);break;case '2':cout <<" 请输入文件名: ";cin>>fname;cout<<endl;q=p.search(fname);if (!q==0){cout<<" 该文件不存在,无法删除\n\n ";break;}p.deltefile(fname);break;case '3':cout <<"\t\t**************显示位示图如下*********************\n"; bit_map(I);cout<<endl;break;case '4':cout <<"\t\t*************文件列表如下************************\n";cout<<"---------------------------------------------------------------"<<endl;cout<<setw(10)<<"文件名"<<setw(15)<<"文件大小(MB)"<<setw(15)<<"所占盘块数"<<setw(15)<<"所占盘块号"<<endl;p.disp();cout<<endl;break;case '5':cout<<"\t\t成功退出系统";exit(0);break;default:cout<<"输入错误,请从新输入: \n\n";break;}}}。

相关文档
最新文档