操作系统 课程设计 -- 模拟简易的文件管理

简介: 操作系统 课程设计 -- 模拟简易的文件管理

主要研究内容

       模拟采用显示链接文件结构和基于位示图磁盘分配算法的单用户磁盘文件管理系统,包括:文件的创建、文件的删除、文件的读取、磁盘分配回收。

效果如下

       下面这个是初始状态下的磁盘,假设磁盘共有500个磁盘块,1代表该磁盘块已经被之前的文件占用了,0代表未被占用

创建文件

        先创建了连个文件,一个是1.txt,大小为50个磁盘块;另外一个文件是2.txt,大小为35个磁盘块。

创建完后查看磁盘,其中,2是文件1.txt的id,使用id=2代表文件1.txt的内容将其填入了空闲的磁盘块,同理3是文件2.txt的id,将其填入空闲的磁盘块

       下面是创建完1.txt和2.txt后的位示图

    下面是文件起始块号表和FAT表的内容,因为表格过大,分为左右两边,上面一张是左边,下面一张是右边,FAT表本质上是一个一维整型数组,不过为了方便,通过表格的方式展示,文件起始块号表和FAT表不对之前已经存在的文件做记录

 还有 删除和读取文件,不再做演示

 

       本程序使用JAVA完成,程序源码如下:

package Practice;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
public class FileManage {
    static int[] diskBlock=new int[500]; //磁盘
    static Map<String,Integer> index=new HashMap<>(); //记录文件的起始块号
    static int[] FAT=new int[500]; //FAT文件分配表
    static int[][] bitmap=new int[10][50]; //位示图
    static int diskSize=500; //记录磁盘大小
    //初始化出一些已经被使用的磁盘块,并建立初始状态下的位示图
    static{
        Random random=new Random();
        for(int i=0;i<300;i++){
            diskBlock[random.nextInt(500)]=1;
        }
        for (int i=0;i<500;i++) {
            if (diskBlock[i] == 1) {
                diskSize--;
                bitmap[i/50][i%50]=1;
            }
        }
        System.out.println("初始状态下:");
        checkDisk();
    }
    public static void main(String[] args) {
        System.out.println( );
        System.out.println("------------------------------------");
        System.out.println("    1、创建文件        2、删除文件      ");
        System.out.println("    3、读取文件        4、查看已创建文件 ");
        System.out.println("    5、查看所有状态     6、结束进程      ");
        System.out.println("------------------------------------");
        while(true){
            System.out.print("请输入菜单号:");
            Scanner scanner=new Scanner(System.in);
            int n=scanner.nextInt();
            if(n==1){
                createFile();
            }else if(n==2){
                deleteFile();
            }else if(n==3){
                checkFile();
            }else if(n==4){
                System.out.println();
                System.out.println("已创建文件:"+index.keySet());
            }else if(n==5){
                checkAll();
            }else if(n==6){
                System.out.println("进程结束!");
                break;
            }else{
                System.out.println("请输入正确的菜单号!");
            }
        }
    }
    //创建文件
    public static void createFile(){
        System.out.println();
        System.out.print("请输入文件名:");
        Scanner scanner=new Scanner(System.in);
        String fileName=scanner.next();
        System.out.print("请输入文件大小:");
        int size=scanner.nextInt();
        File1 file1=new File1(fileName,size);
        //查看是否有重名文件
        if(index.containsKey(file1.fileName)){
            System.out.println("文件名已存在!");
            return;
        }
        //先查看是否还有足够的磁盘空间
        if(file1.size>diskSize){
            System.out.println("磁盘空间不足!");
            return;
        }
        //查看位示图,找到空余的磁盘块号,并占用相应的磁盘块,同时在FAT分配表中做相应记录
        int tempSize= file1.size;
        int flag=0;
        for(int i=0;i<10;i++){
            for(int j=0;j<50;j++){
                if(tempSize==0){
                    break;
                }
                if(bitmap[i][j]==0){
                    diskBlock[i*50+j]=file1.fileId;
                    bitmap[i][j]=1;
                    if(tempSize== file1.size){
                        index.put(file1.fileName,i*50+j);
                        flag=i*50+j;
                    }else if(tempSize==1){
                        FAT[flag]=i*50+j;
                        FAT[i*50+j]=-1;
                    }else{
                        FAT[flag]=i*50+j;
                        flag=i*50+j;
                    }
                    tempSize--;
                }
            }
        }
        //更新文件diskSize
        diskSize-= file1.size;
        System.out.println("创建成功!");
    }
    //删除文件
    public static void deleteFile(){
        System.out.println();
        System.out.print("请输入要删除的文件名:");
        Scanner scanner=new Scanner(System.in);
        String fileName=scanner.next();
        //判断该文件是否存在
        if(!index.containsKey(fileName)){
            System.out.println("该文件不存在!");
            return;
        }
        //根据FAT表,找到要删除的文件的磁盘号,然后到磁盘中以及位示图中,将相应位置置为0
        int flag=index.get(fileName);
        while(flag!=-1){
            int temp=FAT[flag];
            FAT[flag]=0;
            diskBlock[flag]=0;
            bitmap[flag/50][flag%50]=0;
            flag=temp;
        }
        index.remove(fileName);
        System.out.println("删除成功!");
    }
    //读取文件
    public static void checkFile(){
        System.out.println();
        System.out.print("请输入要读取的文件名:");
        Scanner scanner=new Scanner(System.in);
        String fileName=scanner.next();
        //判断该文件是否存在
        if(!index.containsKey(fileName)){
            System.out.println("该文件不存在!");
            return;
        }
        System.out.print("读取到的磁盘块为:");
        int flag=index.get(fileName);
        while(flag!=-1){
            int temp=FAT[flag];
            System.out.print(flag+"->"+diskBlock[flag]+" ");
            flag=temp;
        }
        System.out.println();
    }
    //查看磁盘状态
    public static void checkDisk(){
        System.out.println("磁盘状态:");
        for(int i=0;i<500;i+=50){
            for(int j=i;j<50+i;j++){
                System.out.print(diskBlock[j]+" ");
            }
            System.out.println();
        }
        System.out.println("磁盘剩余大小:"+diskSize);
    }
    //查看位示图
    public static void checkBitmap(){
        System.out.println("位示图表:");
        for(int i=0;i<10;i++){
            for(int j=0;j<50;j++){
                System.out.print(bitmap[i][j]+" ");
            }
            System.out.println();
        }
    }
    //查看文件起始块号表
    public static void checkIndex(){
        System.out.println("文件起始块号表:"+index);
    }
    //查看FAT文件分配表
    public static void checkFAT(){
        System.out.println("FAT文件分配表:");
        for(int i=0;i<500;i+=50){
            System.out.print(i+"~"+(i+49)+"\t");
            for(int j=i;j<50+i;j++){
                System.out.print(FAT[j]+"\t");
            }
            System.out.println();
        }
    }
    //展示全部状态
    public static void checkAll(){
        System.out.println();
        checkDisk();
        System.out.println();
        checkBitmap();
        System.out.println();
        checkIndex();
        System.out.println();
        checkFAT();
    }
}
class File1{
    static int id=2;
    public int fileId; //文件id
    public String fileName; //文件名
    public int size; //文件大小
    public File1(String fileName,int size){
        this.fileId=id;
        this.fileName=fileName;
        this.size=size;
        id++;
    }
}


相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
Linux C语言
Linux操作系统实验四 文件管理(二)(下)
Linux操作系统实验四 文件管理(二)(下)
298 0
|
3月前
|
存储 自然语言处理 搜索推荐
【颠覆你的数字生活!】探索OS Copilot——那款让你瞬间变身超级用户、编程如呼吸般自然、文件管理如同魔法般的神奇操作系统辅助神器!
【8月更文挑战第8天】OS Copilot是一款新兴的操作系统辅助软件,通过智能化手段简化电脑使用,从办公到开发全面赋能。安装简易,启动即有引导教程。其智能命令建议功能,可在命令行输入时提供后续选项及其说明,特别适合Linux用户。内置代码片段生成器,根据需求或代码框架自动生成代码,大幅提升开发效率。文件管理助手支持批量操作且可预览结果,降低误操作风险。任务自动化功能便于设置重复性工作流程,如定时备份。搜索功能强大,支持自然语言查询。尽管尚有改进空间,OS Copilot已是提升生产力的得力助手。
110 5
|
2月前
|
存储 自然语言处理 搜索推荐
探索OS Copilot——那款让你瞬间变身超级用户、编程如呼吸般自然、文件管理如同魔法般的神奇操作系统辅助神器!
【9月更文挑战第4天】“OS Copilot”是一款高效的操作系统辅助软件,通过智能化手段简化电脑使用,涵盖智能命令建议、代码片段生成、文件管理及任务自动化等强大功能。其简洁的界面与友好的用户体验使其成为提升生产力的理想选择,无论是专业人士还是普通用户都能从中受益。从安装到实际应用都非常流畅,能显著提升工作效率,是优化数字生活的得力助手。
43 0
|
6月前
|
存储 算法 Unix
操作系统(13)-----文件管理3
操作系统(13)-----文件管理
152 0
操作系统(13)-----文件管理3
|
6月前
|
存储 安全 Linux
操作系统(13)-----文件管理4
操作系统(13)-----文件管理
62 0
|
6月前
|
存储 索引 Windows
操作系统(13)-----文件管理2
操作系统(13)-----文件管理
333 0
|
6月前
|
存储 SQL 算法
操作系统(13)-----文件管理1
操作系统(13)-----文件管理
55 0
|
6月前
|
存储 算法 安全
|
6月前
|
缓存 算法 Linux
[操作系统] 文件管理
[操作系统] 文件管理
|
存储 算法 固态存储
操作系统之文件管理
文件管理初识 文件的属性 文件内部的数据如何组织起来? 文件之间应该如何组织起来? 操作系统应该向上提供哪些功能? 从上往下看,文件应该如何存放在外存? 其他需要由操作系统实现的文件管理功能 最后总结一下: 文件的逻辑结构 、 这里说一下随机访问和顺序访问: 随机访问(Random Access)是计算机存储介质的一种访问方式。它指的是存储介质可以以任意的、不连续的方式访问存储的每个地址。也就是说,随机访问允许直接访问存储介质的任意位置,不需要从开头逐个访问到需要的地址。 与随机访问相对的是顺序访问(Sequential Access),它要求从存
107 0