模拟实现单级目录、单级索引的索引文件系统
- 格式:doc
- 大小:442.00 KB
- 文档页数:27
计算机操作系统文件系统基础知识了解文件系统的基本概念和组织方式计算机操作系统中的文件系统是管理计算机存储设备上数据的一种组织方式。
它负责文件的存储、访问和管理,是操作系统中非常重要的一部分。
本文将介绍文件系统的基本概念和组织方式。
一、文件系统的基本概念文件系统是操作系统中的一个模块,它提供了一种机制来访问和组织计算机存储器中的文件。
文件系统通过使用文件名和文件目录来组织和管理文件。
1. 文件文件是计算机存储设备中存储的最基本的信息单元。
文件可以包含文本、图像、音频、视频等各种类型的数据。
在文件系统中,文件通过唯一的文件名进行标识,用户可以通过文件名来访问文件。
2. 文件名文件名是文件系统中用来标识文件的字符串。
文件名一般由文件的逻辑名和扩展名组成,如“document.txt”。
文件名的组成方式和长度限制根据不同的文件系统而有所不同。
3. 文件目录文件目录是文件系统中用来组织和管理文件的一种方式。
文件目录是一个层次结构,它由多个目录和文件组成。
通过文件目录,用户可以方便地查找和管理文件。
4. 文件路径文件路径是指文件在文件系统中的位置。
文件路径由目录名和文件名组成,以斜杠或反斜杠分隔各个部分。
例如,“/home/user/document.txt”是一个文件的路径。
二、文件系统的组织方式文件系统的组织方式决定了文件在存储设备上的物理位置以及文件间的关系。
常见的文件系统组织方式有顺序文件系统、索引文件系统和树形文件系统等。
1. 顺序文件系统顺序文件系统是指文件在存储设备上按照顺序存放的一种组织方式。
文件按照创建的顺序存放在磁盘上,需要顺序扫描才能找到对应的文件。
顺序文件系统的优点是存取速度较快,但是删除和插入操作比较困难。
2. 索引文件系统索引文件系统是指为每个文件建立一个索引表,通过索引表来管理和访问文件的一种组织方式。
索引表中记录了文件的物理位置信息,用户可以通过索引表进行文件的定位和访问。
索引文件系统的优点是查找速度较快,但是需要额外的空间来存储索引表。
文件系统管理阶段的特征1.引言1.1 概述文件系统是计算机操作系统中的一个重要组成部分,负责管理和组织计算机的文件和目录。
文件系统管理阶段可以理解为对文件系统的不同方面进行管理和操作的阶段。
文件系统管理涉及到物理存储管理、文件目录管理以及文件访问与权限管理等各个方面。
在物理存储管理阶段,主要考虑如何进行存储资源的分配和管理。
文件目录管理阶段则关注如何组织和管理文件和目录的结构。
文件访问与权限管理阶段旨在保护文件的安全性,确保只有授权用户可以进行访问和操作。
在物理存储管理方面,我们需要考虑存储的分配和空间的管理。
存储的分配方式可以分为连续分配、链接分配和索引分配。
连续分配方式将文件连续地存储在存储介质上,链接分配方式则通过链接的方式将文件的不同部分组合在一起,索引分配方式则使用索引表进行存储位置的管理。
另外,还需要考虑如何管理和分配存储空间,一种常见的方式是使用位图法和空闲链表法进行空间的管理。
文件目录管理方面主要关注文件和目录的组织和管理。
单级目录结构将所有的文件和目录都放置在一个层次上,多级目录结构则通过层次结构的方式进行组织,树状目录结构则使用树的方式进行管理,而图状目录结构则使用图的方式进行管理。
每种目录结构都有其优点和缺点,根据实际需求选择合适的目录结构。
文件访问与权限管理是保护文件和信息安全的关键环节。
用户身份验证可以确保只有合法的用户可以进行访问和操作,文件权限控制则可以控制各个用户对文件的访问权限。
这些机制可以帮助保护个人和敏感信息的安全性。
综上所述,文件系统管理阶段涉及到物理存储管理、文件目录管理以及文件访问与权限管理等多个方面。
不同的管理策略和技术可以满足不同的需求和场景,同时也面临着各种挑战和发展趋势。
在未来的研究中,我们可以进一步探索新的管理思路和技术,以提高文件系统的效率和安全性。
文章结构部分的内容如下:1.2 文章结构本文主要探讨文件系统管理阶段的特征。
文章分为以下几个部分:引言:介绍文件系统管理阶段的重要性和研究背景。
模拟UNIX文件系统的设计及实现操作系统大作业UNIX文件系统是一种常见的操作系统文件系统,它提供了一种以层次结构组织文件和目录的方式来管理存储设备上的数据。
为了完成这个大作业,我们需要设计并实现一个简化版的UNIX文件系统,包括文件和目录的管理、文件的读写操作、文件权限的管理等。
首先,我们需要设计文件系统的存储结构。
文件系统可以在硬盘上以一个分区的形式存在,我们可以使用一个整数数组来表示硬盘,每个数组元素表示硬盘上的一个块。
我们还可以使用一个超级块来记录文件系统的信息,例如文件系统的状态、块的总数、块的使用情况等。
此外,我们还需要设计并实现一个索引节点表,用于保存文件或目录的元数据信息,例如文件的大小、权限、创建时间等。
接下来,我们需要实现文件和目录的管理功能。
文件和目录可以通过其在索引节点表中的索引来标识。
我们可以使用一个数组来表示目录,数组的每个元素都是一个目录项,记录了文件或子目录的名字和索引节点的索引。
我们还可以使用一个栈来保存当前目录的路径,方便用户在不同目录之间切换。
为了支持目录的嵌套,我们可以在目录项中添加一个指向父目录的索引。
在文件和目录的管理基础上,我们还需要实现文件的读写操作。
文件可以通过其索引节点的索引来标识。
当用户要读取文件时,我们需要根据文件的索引节点找到文件的块地址列表,然后将列表中的块读取到内存中。
当用户要写入文件时,我们需要找到文件的块地址列表中最后一个块,如果该块已满,则需要申请一个新的块,并将新块的地址添加到块地址列表中。
同时,我们还需要更新文件的大小和修改时间等元数据信息。
最后,我们还需要实现文件权限的管理功能。
文件的权限信息可以通过文件的索引节点来保存。
我们可以使用一个整数来表示文件的权限,例如八进制数,每一位代表一个权限,例如读取权限、写入权限和执行权限等。
当用户要访问文件时,我们需要根据用户的权限和文件的权限来判断用户是否具有相应的权限。
总结起来,要完成这个大作业,我们需要设计并实现一个模拟UNIX文件系统,包括文件和目录的管理、文件的读写操作、文件权限的管理等。
第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. 位图索引结构(Bitmap Indexing):位图索引结构以位图的形式表示文件和目录在存储设备上的位置。
位图中的每一位对应一个存储块,用来表示该块是否已被使用。
位图索引结构简单有效,适用于小型文件系统;但是随着文件数量的增加,位图的大小也会增加,导致索引结构的性能下降。
2. 列表索引结构(Linked Indexing):列表索引结构将文件和目录的数据块按照顺序链接起来,每个块中记录了下一个块的地址。
这样可以通过遍历链表来访问文件的所有数据块。
列表索引结构适用于顺序访问较多的文件,但是随机读取的性能较低。
3. 哈希索引结构(Hash Indexing):哈希索引结构使用哈希函数将文件和目录的逻辑信息映射到存储设备上的位置。
哈希索引结构可以快速定位和访问文件数据,适用于大规模文件系统。
但是哈希索引结构会带来哈希冲突的问题,可能导致性能下降。
4. B+树索引结构(B+ Tree Indexing):B+树索引结构是一种多叉树结构,用于有序存储和访问文件和目录的数据块。
B+树索引结构具有较好的平衡性和扩展性,能够提高文件系统的读写性能。
大部分现代文件系统都采用B+树索引结构作为其核心索引结构。
5. 多级索引结构(Multi-level Indexing):多级索引结构将索引分为多个层次,每个层次的索引记录了下一层次的索引位置。
2023年自考专业(计算机网络)《网络操作系统》考试全真模拟易错、难点精编⑴(答案参考)(图片大小可自由调整)一.全考点综合测验(共50题)1.【单选题】下面对选择进程调度算法的准则论述错误的是()。
A.适当增长进程在就绪队列中的等待时间B.尽量提高处理器的利用率C.尽可能提高系统的吞吐量D.尽快响应交互式用户的请求正确答案:A2.【单选题】从静态的角度看,进程的组成包括()。
A.程序和进程控制块B.程序和数据C.数据和模块D.程序、数据和进程控制块正确答案:C3.【单选题】系统中有用户user1和user2,同属于users组。
在user1用户目录下有一文件file1,它拥有644的权限,如果user2用户想修改user1用户目录下的file1文件,应拥有()。
A.744B.664C.646D.746正确答案:B4.【单选题】在Linux平台下建立DNS服务器的主要软件是()。
A.bindB..SambaC.ApacheD.postfix正确答案:A5.【单选题】假定kernel支持vfat分区,下面哪一个操作是将/dev/hda1,一个Windows分区加载到/win目录()。
A.mount -t windows /win /dev/hda1B.mount -fs=msdos /dev/hda1 /winC.mount -s win /dev/hda1 /winD.mount –t vfat /dev/hda1 /win正确答案:D6.【单选题】支持TCP/IP协议的网络通信的基本操作单元是()。
A.套接字B.端口C.端口号D.功能调用正确答案:A7.【单选题】关于多道批处理操作系统的叙述正确的是()。
A.用户可以直接干预作业的运行,具有交互性B.大地提高了系统在单位时间内处理作业的能力C.资源不能同时被几个用户共享D.系统每次只将一个作业调入内存运行正确答案:B8.【单选题】在文件系统中,索引文件结构的索引表是用来()。
操作系统_苏州大学中国大学mooc课后章节答案期末考试题库2023年1.以下有关内核线程的论述,正确的是()。
参考答案:内核线程由内核进行创建和撤销_内核线程由内核完成线程调度_内核线程由内核管理2.引入线程后,处理机只在线程间切换。
参考答案:错误3.Java中的线程有四种状态,分别是:可运行(Runable)、就绪(Ready)、阻塞(Blocked)、死亡(Dead)。
参考答案:错误4.程序开发者必须创建一个线程去管理内存的分配。
参考答案:错误5.Unix的exec创建的进程可以和创建它的父进程共享各类资源,从而使得它的创建、切换成本较低。
参考答案:错误6.为了照顾紧迫型进程,应采用()调度策略。
参考答案:PR7.可能存在饥饿问题的调度算法有()。
参考答案:PR_SJF8.在页式存储管理中,引入快表可以减少每一次的内存访问时间。
参考答案:错误9.用户程序中使用的从零地址开始的地址编号是逻辑地址。
参考答案:正确10.内存管理的目的是()。
参考答案:进行存储保护_提高内存数据访问的速度_提高内存利用率11.离散内存分配技术包括()。
参考答案:段页式_分段_分页12.存在外碎片的存储管理方式有()。
参考答案:可变分区分配_段式存储管理13.把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上的备份区,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需的程序或数据,调入内存。
这种技术是()。
参考答案:交换14.一个32位地址的计算机使用两级页表。
虚拟地址被分成9位的顶级页表域、11位的二级页表域和一个偏移量,页面大小是()。
参考答案:4KB15.分页存储管理中的页表由()建立参考答案:操作系统16.TLB在计算机系统中是用于()。
参考答案:地址变换17.在页式存储管理中,为了实现主存的空间分配,应设置()。
参考答案:页表18.在RR算法中,时间片越小越好。
参考答案:错误19.SJF算法可以获得最小的响应时间。
虚拟文件系统的实现-FAT方案摘要: 本文简单介绍了磁盘文件格式FA T及其他相关背景和算法,并采用FA T方案实现单卷、单级目录的虚拟文件系统。
描述了整个程序的基本思路模块划分、流程图及代码的实现。
主题词: 文件文件系统FA T 虚拟磁盘真实磁盘一.相关背景1.1 相关概念,相关算法文件是操作系统提供的、在用户观点中其内容具有连续顺序关系的最大外存逻辑数据空间。
文件系统是操作系统提供的实现对外存文件的管理。
文件系统内部实现的主要区别有:单级目录或多级目录、单卷或多卷、连续分配或不连续分配。
在不连续分配的背景下主要有链接定位方式下的文件内地址映射机制和索引定位。
FAT(file allocation table)采用“文件分配表”方式,是链接定位技术的一个重要变种。
1.2 设计环境、设计工具整个程序采用C语言在Windows XP下使用Microsoft V isual 2003进行设计。
二.设计思路和总体流程图2.1基本思路整个磁盘采用单卷、单级目录FA T方案,在真实磁盘建立一个文件作,并根据用户要求的大小申请空间,实现基本的磁盘文件操作。
例如对文件进行建立、复制、浏览、重命名等操作。
并能够对虚拟磁盘进行格式化,能够与真实磁盘进行文件交换。
整个虚拟文件系统是一个可以使用的文件系统,里面存放的文件信息都是真实有效的,管理程序可以管理多个虚拟文件系统。
2.2 本系统支持的主要命令del 删除文件 format 格式化虚拟磁盘dir 显示文件信息 help 显示帮助cat 显示文件内容 icopy 真实磁盘向虚拟磁盘拷贝copy 虚拟磁盘内拷贝 ocopy 虚拟磁盘向真实磁盘拷贝exit 退出 rename 文件重命名fatinfo 显示FAT表内容 showdisk 显示虚拟磁盘信息2.3 数据结构定义FCB //文件控制块//char name[13]; //文件名//int startblock; //起始块//long size; //文件大小//int status; //FCB状态//DISKunsigned long disksize; //磁盘大小//unsigned int blocksize; //块长4096//unsigned int blocks; //总块数//unsigned int FATblocks; //FAT块数1-32//unsigned int dirblocks; //目录区块数33-34 //unsigned int datablocks; //文件数据区块数//unsigned int idleblocks; //空闲块数//unsigned int files; //文件数//unsigned long freesize; //可用空间//unsigned int realfiles; //有效文件数//unsigned int fcbsnum; //最大目录数//FATint fats;DISKINFODISK disk;FCB *fcbs;FAT *fat;2.4 虚拟磁盘总貌图1.1所示为虚拟磁盘总貌,盘卷总信息存放DISK结构体,FAT表区存放FAT结构体,目录区存放FCB结构体。
XXX学校视频监控云存储解决方案创新科存储技术有限公司1项目背景“百年大计,教育为本”,学生的成长和教育问题一直是政府、学校、家长及全社会广泛关注的问题。
近年来,校园的各类安全问题得到了政府和社会的高度重视,校园安保已经不再是简单的校园自身安全管理问题,而是保障现代教育环境和谐有序不可忽视的社会治安问题。
随着高清视频监控和智能安防技术的日益成熟和广泛应用,现代校园安保也越来越多地借助到信息化手段来提高其能力和效率。
然而高清智能的视频数据采集、传输、存储以及管理应用对其配套软硬件环境具有严格的要求,系统的安全可靠性及智能高效性成为校园安保关注的焦点。
当前,传统的校园信息化架构往往无法满足高清视频监控的灵活部署和大规模应用,更加安全、高效、可靠、便捷的校园安保系统将成为未来平安校园建设的必然趋势。
然而现代平安校园在建设过程中,面临着多方面挑战和压力:数据量大且复杂:现代校园大而分散,人车流混杂,人员身份复杂且分布不均,流动性较强,使得校园内空旷之地和人员密集区域均存在安全隐患,时刻产生大量复杂的前端动态视频数据。
效率低下:在突发事件面前,传统安防系统只能做到被动响应和事后取证,既无法第一时间智能预警,也不能在有效时间内找出精准的关键事件依据,严重影响校园事件处理效率。
系统老旧复杂:传统校园安防系统资源分散,互通性差,且设备复杂繁重,扩容改造困难,应用和维护管理复杂,往往与新设备无法实现联动追踪。
XXX学校视频监控系统具体需求如下:●存储模式:集中存储;●存储规模:600路高清摄像头;●存储码流:2Mbps;●存储时间:每天24小时,共存储90天;●可靠性要求:存储设备整机故障,录像不中断;2推荐产品型号为充分满足项目要求,并结合系统可靠性、设备稳定性及先进性原则,我们选择创新科存储技术有限公司的NS9000云存储系统作为本方案的选型存储产品。
➢产品型号:NS9000云存储系统NS9000云存储系统基于集群存储架构设计,每套存储节点为16、24、36不同盘位设计,支持横向扩展,最大可管理超过1000套存储节点,最大容量超过数千PB,支持将所有存储节点虚拟化整合,形成一个大的虚拟池,组成全局统一命名空间。
昆明理工大学信息工程与自动化学院学生实验报告(2012 —2013 学年第二学期)课程名称:操作系统开课实验室:年月日一、实验目的用C或C++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
二、实验原理及基本技术路线图(方框原理图)用C模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。
文件通常存放在外存(如磁盘、磁带)上,可以作为一个独立单位存放和实施相应的操作(如打开、关闭、读、写等)。
为了加快对文件的检索,往往将文件控制块集中在一起进行管理。
这种文件控制块的有序集合称为文件目录。
文件控制块就是其中的目录项。
下图示例一种目录的组织形式。
模拟一个文件系统,包括目录文件,普通文件,并实现对它们的一些基本操作。
假定每个目录文件最多只能占用一个块;一个目录项包括文件名(下一级目录名),文件类型,文件长度,指向文件内容(下一级目录)的指针内容。
普通文件可以只用目录项(FCB)代表。
三、所用仪器、材料(设备名称、型号、规格等)。
计算机一台四、实验方法、步骤//利用交互式命令实现树型目录结构和文件管理,同时利用位示图表示外存的分配情况,新建文件时分配必要的空间,模拟文件分配表记录文件在外存上的存储方式。
了解系统对文件的操作。
//在文件中保存目录内容,创建文件或子目录可以用命令行命令:MD、CD、RD、MK(创建文件)、DEL(删除文件)和DIR#include<iostream>#include<stdlib.h>#include<time.h>#include <locale.h>using namespace std;#define beginsize 5#define LENGTH 3typedef struct{i nt data[LENGTH];}Indireone;typedef struct{I ndireone * first[LENGTH];}Indiretwo;typedef struct{I ndiretwo * second[LENGTH]; }Indirethree;typedef struct Node{i nt begin[beginsize];I ndireone * one;I ndiretwo * two;I ndirethree * three;}Mixtab;typedef struct NODE{c har name[50];i nt type;//是文件还是目录i nt size;//如果是文件给出大小s truct NODE *next;//兄弟结点s truct NODE * sub;//子节点s truct NODE * father;//父亲节点M ixtab * table;}FCB;//文件控制块FCB * root;FCB * present;FCB * finding;char stringname[300];int Bitmap[16][16];//位示图int leftbit=0;void Initall(){i nt i,j;s rand( time(NULL) );f or(i=0;i<16;i++){//初始化位示图for(j=0;j<16;j++){Bitmap[i][j]=rand()%2;}}r oot=(FCB *)malloc(sizeof(FCB)); s trcpy(root->name,"\\");r oot->type=0;r oot->size=0;r oot->next=NULL;r oot->father=root;r oot->sub=NULL;f or(i=0;i<16;i++){for(j=0;j<16;j++){if(Bitmap[i][j]==0){leftbit++;}}}}//判断分配外存时候是不是足够int Judgeenough(int n){i f(leftbit>=n)return 1;e lse return 0;}//添加时候用void Addpoint(FCB * f){F CB * temp;i f(present->sub==NULL){present->sub=f;}e lse{temp=present->sub;while(temp->next!=NULL){temp=temp->next;}temp->next=f;f->next=NULL;}}//删除时候用void Delpoint(FCB *f){F CB * temp=present->sub;i f(temp==f){present->sub=temp->next;delete(f);}e lse{while(temp->next!=f){temp=temp->next;}temp->next=f->next;delete(f);}}//查找是不是已经存在int Isexist(char ary[],int x){F CB * temp;i f(present->sub==NULL){return 0;}e lse{temp=present->sub;while(temp!=NULL){if((!strcmp(temp->name,ary))&&(temp->type==x)){finding=temp;return 1;}temp=temp->next;}return 0;}}void Mdlist(){c har listname[50];c in>>listname;F CB * temp;i f(Isexist(listname,0)){cout<<"子目录或文件"<<listname<<"已存在。
文件系统索引结构什么是文件系统索引结构?为什么需要文件系统索引结构?常见的文件系统索引结构有哪些?它们之间有何区别和优缺点?本文将以这些问题为主题,详细介绍文件系统索引结构。
一、什么是文件系统索引结构?文件系统索引结构是指在计算机文件系统中用于管理和组织文件的一种数据结构。
它通过建立索引以实现快速查找文件和访问文件内容的目的。
通常,文件系统索引结构用于存储文件的元数据(如文件名、文件大小、创建时间等),并记录文件在磁盘上的物理位置,以便操作系统能够准确找到存储文件的位置。
二、为什么需要文件系统索引结构?文件系统索引结构的出现是为了提高文件系统的访问和检索效率。
在没有索引结构的情况下,操作系统需要逐个扫描磁盘上的数据块,直到找到目标文件。
这样的方式效率低下,尤其是在大量文件存在的情况下。
通过引入索引结构,可以将文件的元数据和物理位置信息组织起来,从而提高文件的访问速度和系统的整体性能。
三、常见的文件系统索引结构有哪些?1. 单级目录结构单级目录结构是最简单的索引结构形式,它将所有的文件都放置在同一个目录下。
操作系统通过文件名来查找文件,并直接访问该文件的物理位置。
这种结构的优点是简单易于实现,但在大规模文件系统中会面临扩展性和性能问题,因为所有的文件都在同一个目录下,查找效率较低。
2. 多级目录结构多级目录结构采用了层次结构的方式来组织文件。
一个目录下可以包含多个子目录,每个子目录下又可以包含其他子目录或文件。
操作系统根据文件的完整路径来查找文件,并通过路径中的目录层次关系来定位文件的具体位置。
多级目录结构提高了文件的查找效率和组织性,但当目录层次过多时,可能会导致路径过长和目录遍历效率下降的问题。
3. 索引节点(inode)结构索引节点结构是一种常见的文件系统索引结构。
每个文件在磁盘上都有一个对应的索引节点,索引节点中存储了文件的元数据和物理位置信息。
文件系统通过索引节点来查找和访问文件,而不需要通过目录层次关系来定位文件。
课程设计报告课程名称操作系统课程设计课题名称模拟实现单级目录、单级索引的索引文件系统专业计算机科学与技术班级学号姓名指导教师周铁山2012年1 月6日湖南工程学院课程设计任务书课程名称操作系统课程设计课题模拟实现单级目录、单级索引的索引文件系统专业班级学生姓名学号指导教师周铁山审批任务书下达日期2013 年 1 月 2 日任务完成日期2013年 1 月 6 日计算机10级《操作系统课程设计》任务书一、课程设计的性质和目的操作系统课程设计是计算机专业的专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握操作系统的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事计算机工作打下一定的专业基础。
二、设计课题课题一:模拟实现单级目录的FAT文件系统基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。
基本设计要求:1、实现如下文件系统功能(过程或函数):a、挂载文件系统FILE *OPENSYS(char *filename);b、卸载文件系统int CLOSESYS(FILE *stream);c、显示目录void LISTDIR(void);d、建立文件int FCREA TE(char *filename);e、删除文件int FDELETE(char *filename);f、打开文件int FOPEN(char *filename);g、关闭文件int FCLOSE(int fileid);h、文件块读int FREAD(void *ptr, int n, int fileid);i、文件块写int FWRITE(void *ptr, int n, int fileid);j、判断文件结束int FEOF(int fileid);k、获取文件指针long FGETPOS(int fileid);l、设置文件指针int FSETPOS(int fileid, long offset);m、取得文件长度long FGETLEN(char *filename);2、提供文件系统创建程序3、有功能检测模块4、为简化程序设计,假定目录区域大小固定。
文件系统空间划分:可以使用的C语言文件操纵函数:FILE *fopen(const char *filename, const char *mode);int fclose(FILE *stream);int fseek(FILE *stream, long offset, int whence);long ftell(FILE *stream);size_t fread(void *ptr, size_t size, size_t n, FILE *stream);size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);课题二:模拟实现单级目录、单级索引的索引文件系统使用链接域将同一文件的各索引块按顺序连接起来;其余各项同课题一。
三、课程设计报告要求1、设计报告要求A4纸打印成册;2、使用学院统一的封面;3、课程设计报告每人一份,必须包含如下几个方面的内容:1)基本设计思想;2)主要数据结构;3)主要实施流程;4)所有源代码;5)课程设计总结与体会。
四、分组及选题办法1、按学号顺序一人一组,学号为奇数者为课题一,偶数者为课题二。
2、成绩考核按个人课题完成情况、设计报告质量及对课程设计的态度等综合评定。
五、设计进度安排1、讲课及上机调试时间安排:上课时间:2013.01.02~2013.01.04上机时间:2013.01.02~2013.01.042、其余时间:查阅资料,确定方案,设计课题相关程序。
3、个人答辩,交课程设计报告。
主要数据结构提示:1、单级目录FAT文件系统:1)常量#define BlockSize 512#define DirSize 322)保留扇区结构struct ReserveBlock{int sysblocknum; /*文件系统总扇区数*/int resblocknum; /*保留扇区扇区数*/int fatblocknum; /*FAT表扇区数*/int rootblocknum; /*根目录区扇区数*/char fillchar[BlockSize-4*sizeof(int)];/*填充字节*/};3)目录结构struct DirBlock{char filename[11]; /*文件名限长11个字符*/char fillchar[DirSize-4*sizeof(int)-sizeof(long int)-11]; /*填充字节*/long filelen; /*文件长度*/int year,month,day; /*日期*/int firstblockaddr; /*文件首块扇区号*/};4)FCB(文件控制块)结构struct FCBBlock{int fileid; /*文件标识*/struct DirBlock fileinfo; /*目录信息*/long filepos; /*文件读写指针*/int fdtblockaddr; /*目录项所在块号*/int fdtblockindex; /*目录项所在块内序号*/struct FCBBlock *next;/*指向下一个文件控制块的指针*/};2、单级目录单级索引文件系统:1)常量#define BlockSize 512#define DirSize 322)保留扇区结构struct ReserveBlock{int sysblocknum; /*文件系统总扇区数*/int resblocknum; /*保留扇区扇区数*/int mapblocknum; /*字节映像图扇区数*/int rootblocknum; /*根目录区扇区数*/char fillchar[BlockSize-4*sizeof(int)]; /*填充字节*/};3)目录结构struct DirBlock{char filename[11]; /*文件名限长11个字符*/char fillchar[DirSize-4*sizeof(int)-sizeof(long int)-11]; /*填充字节*/long filelen; /*文件长度*/int year,month,day; /*日期*/int firstindexaddr; /*文件首索引块扇区号*/};4)索引块结构struct IndexBlock{int dataaddr[BlockSize/sizeof(int)-1]; /*数据块块号数组*/int nextindexaddr; /*本文件下一索引块块号*/};5)索引节点结构struct IndexNode{struct IndexBlock block; /*索引块数据*/int blockaddr; /*本节点索引块块号*/struct IndexNode *nextnode; /*指向下一索引节点的指针*/ };6)FCB(文件控制块)结构struct FCBBlock{int fileid; /*文件标识*/struct DirBlock fileinfo; /*目录信息*/long filepos; /*文件读写指针*/int fdtblockaddr; /*目录项所在块号*/int fdtblockindex; /*目录项所在块内序号*/struct FCBBlock *next; *指向下一个文件控制块的指针*/struct IndexNode *firstindexnode; /*指向第一个索引节点的指针*/};目录一、程序的功能 (1)二、程序的基本设计思路 (1)三、主要的数据结构 (2)四、主要实施流程 (3)五、程序调试及其运行结果 (4)六、设计总结与心得体会 (6)七、附录(源程序清单) (6)一、程序的功能该程序主要模拟实现单级目录的FAT文件系统,该系统要求能实现对文件的创建、删除、读、写、打开、关闭以及能显示目录等操作,在创建文件时,系统首先为新文件分配所需的外存空间,并且在文件系统的相应目录中,建立一个目录项,该目录项记录了新文件的文件名及其在外存中的地址等属性。
而当已经不再需要某个文件时,便可以把它从文件系统中删除。
这时执行的是与创建新文件相反的操作。
系统先从目录中找到要删除的文件项,使之成为空项,紧接着回收该文件的存储空间,用于下次分配。
通过读指针,将位于外部存储介质上的数据读入到内存缓冲区这样就实现了文件的读取,通过写指针,将内存缓冲区中的数据写入到位于外部存储介质上的文件中。
在开始使用文件时,首先必须打开文件。
这可以将文件属性信息装入内存,以便以后快速查用。
在完成文件使用后,应该关闭文件。
这不但是为了释放内存空间,而且也因为许多系统常常限制可以同时打开的文件数。
当创建文件时,先在目录表中查找是否存在此文件表,若存在则表示文件同名不能创建,否则在目录表中为此文件先建立一个目录项,保存文件的一些基本属性,如创建日期、大小、文件名等,并保存文件的首索引块扇区号,对文件读写也是先在目录项里查找文件是否存在,再根据文件的首索引块扇区号,查找对应块号中的内容对其进行读写操作,删除一个文件后回收为其分配的空间,并更新目录表、修改文件控制块。
显示目录项可以显示文件名、长度以及创建日期。
二、程序的基本设计思路模拟实现单级目录、单级索引的索引文件系统基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。
在一个文件系统中对文件进行操作,实现文件的创建、读写等等操作。
在创建文件时先在目录项中进行查找,若创建的文件已存在,文件的创建首先检验目录是否为空,为空则把文件夹或文件连接到该目录下,不为空则把检查目录下是否有同名文件夹或文件,有则提示创建不成功,而文件夹打开是则把文件夹名称及其地址压入打开文件夹栈,文件关闭则把文件夹名称及其地址从打开文件夹栈中抛出。
文件夹和文件的删除,文件夹下没有打开的文件或文件没有打开才能删除,否则删除失败,每次操作成功都要更改目录和FCB信息。
该过程都保存在文件中,是对文件的操作。
本系统建于Windows平台,开发环境为WIN-TC。
三、主要的数据结构1.常量#define BlockSize 512#define DirSize 322.保留扇区结构struct ReserveBlock{int sysblocknum; /*文件系统总扇区数*/int resblocknum; /*保留扇区扇区数*/int mapblocknum; /*字节映像图扇区数*/int rootblocknum; /*根目录区扇区数*/char fillchar[BlockSize-4*sizeof(int)]; /*填充字节*/};3.目录结构struct DirBlock{char filename[11]; /*文件名限长11个字符*/char fillchar[DirSize-4*sizeof(int)-sizeof(long int)-11]; /*填充字节*/long filelen; /*文件长度*/int year,month,day; /*定义年月日*/int firstindexaddr; /*文件首索引块扇区号*/};4.索引块结构struct IndexBlock{int dataaddr[BlockSize/sizeof(int)-1]; /*数据块块号数组*/int nextindexaddr; /*本文件下一索引块块号*/};5.索引节点结构struct IndexNode{struct IndexBlock block; /*索引块数据*/int blockaddr; /*本节点索引块块号*/struct IndexNode *nextnode; /*指向下一索引节点的指针*/};6.FCB(文件控制块)结构struct FCBBlock{int fileid; /*文件标识*/struct DirBlock fileinfo; /*目录信息*/long filepos; /*文件读写指针*/int fdtblockaddr; /*目录项所在块号*/int fdtblockindex; /*目录项所在块内序号*/struct FCBBlock *next; /*指向下一个文件控制块的指针*/struct IndexNode *firstindexnode; /*指向第一个索引节点的指针*/}四、主要实施流程用到的某些函数流程图图一、FCLOSE函数图二、FCREATE 函数图三、FDELETE函数图四、OPENSYS 函数五、程序调试及其运行结果下面是程序调试时的一些截图。