首页 > 编程语言 >操作系统课程设计-模拟文件管理系统java实现

操作系统课程设计-模拟文件管理系统java实现

时间:2024-07-10 23:02:52浏览次数:14  
标签:课程设计 java 操作系统 System private String println public out

模拟文件管理系统

学校的期末课程设计,进行一个简单的分享,不足之处请各位大佬指正。

一、主要内容

综合运用操作系统理论知识和编程知识设计实现一个可视化操作的文件管理模拟系统,该系统包含的基本信息:创建用户、登录用户、创建文件、删除文件、打开文件、显示文件、关闭文件等信息,能显示文件内容(50字符换行显示)、更改文件内容和更改文件名,并能修改文件的读写权限控制,支持查看文件的属性,主要包括:文件类型、文件大小、创建时间、文件权限、修改时间等。

二、效果展示

1.登录注册和模拟磁盘划分的实现

在这里插入图片描述

2.功能展示

在这里插入图片描述

3.磁盘目录

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6f739ecb3b3a41789829a8878c801b80.png4.目录创建和文件创建在这里插入图片描述

4.目录和文件的创建

实现多级子目录的创建

在这入图片描述

5.实现文件的读写权限

在这里插入图片描述

6.修改文件名

在这里插入图片描述

7.删除目录和文件

在这里插入图片描述
大致功能演示完毕

大致代码实现

主要实现类
在这里插入图片描述

用户类
在public class User {
    // 用户名
    private String UserName;
    // 密码
    private String Password;
    private MyDisk disk;
    // 是否对磁盘分区
    private boolean flag;
    public User(String userName, String password){
        UserName = userName;
        Password = password;
    }
    public User(String userName, String password, MyDisk disk) {
        UserName = userName;
        Password = password;
        this.disk = disk;
    }
    public User(){}
    public String getUserName() {
        return UserName;
    }

    public void setUserName(String userName) {
        UserName = userName;
    }

    public String getPassword() {
        return Password;
    }

    public void setPassword(String password) {
        Password = password;
    }

    public MyDisk getDisk() {
        return disk;
    }

    public void setDisk(MyDisk disk) {
        this.disk = disk;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}
MyDirectory类主要属性
public class MyDirectory {
    private String name;
    // 目录创建时间
    private String createTime;
    // 目录修改时间
    private String updaTime;
    // 目录权限
    private String status;
    /*存储文件*/
    private Map<String, MyFile> files;

    /*下一个节点*/
    private MyDirectory nextNode;
    /*上一个节点*/
    private MyDirectory prevNode;
    /*根节点*/
    private MyDirectory rootDirectory;
    public MyDirectory(String name){
            this.name=name;
            this.rootDirectory =new MyDirectory();
            this.files=new HashMap<>();
    }
    public MyDirectory(){

    }
    }
    
MyDisk

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

/**
 * @author GH Fire
 * @version 1.0
 * @description: TODO
 * @date 2024/5/12 21:25
 */
public class MyDisk {
    private long size;// 磁盘大小
    // 存储分区
    private HashMap<String,MyParts> parts;
    /* n 为创建磁盘数量*/
    public MyDisk(int n){
        // 存储分区
        this.parts = new HashMap<>();
        Scanner scanner=new Scanner(System.in);
        for (int i = 0; i < n; i++) {
            System.out.println("输入第"+(i+1)+"个磁盘名");
            String partName=scanner.next();
            System.out.print("输入"+partName+"的容量:");
            long length= scanner.nextLong();
            size+=length;
            parts.put(partName,new MyParts(partName, length));
        }

    }
    public MyDisk(){

    }
    public long getSize() {
      return size;
    }

    public void setSize(long size) {
        this.size = size;
    }

    public HashMap<String, MyParts> getParts() {
        return parts;
    }

    public void setParts(HashMap<String, MyParts> parts) {
        this.parts = parts;
    }
}

MyFile

主要属性

public class MyFile {
    //文件类型
    private String type;
    // 文件大小
    private long length;
    // 文件创建时间
    private String createTime;
    // 文件修改时间
    private String updaTime;
    // 文件权限
    private String status;
    // 文件名
    private String Name;
    // 文件内容
    private String string;

MyParts

模拟实现磁盘分区效果

import java.nio.file.FileSystem;
import java.time.LocalDateTime;

/**
 * @author GH Fire
 * @version 1.0
 * @description: TODO
 * @date 2024/5/12 21:40
 */
/*表示磁盘分区*/
public class MyParts {
    private String name;
    private long size; // 分区大小,以字节为单位
    private MyFileSystem fileSystem; // 分区上的文件系统*/
    /*文件数量*/
    private int fileCount;
    public int getFileCount() {
        return fileCount;
    }

    public void setFileCount(int fileCount) {
        this.fileCount = fileCount;
    }

    public MyParts(String name, long size) {
        this.size=size;
        this.name=name+":";
        this.fileSystem=new MyFileSystem(this);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getSize() {
        return size;
    }

    public void setSize(long size) {
        this.size = size;
    }

    public MyFileSystem getFileSystem() {
        return fileSystem;
    }

    public void setFileSystem(MyFileSystem fileSystem) {
        this.fileSystem = fileSystem;
    }

    /*-------creat 创建文件--------*/
    public MyFile create(String fileName,long length,String status,String Type){
        /*1.判断当前容量是否足够*/
            if(this.size<length){
                System.out.println("磁盘容量不足");
                return null;
            }else {
                MyFile myFile=new MyFile();
                // 创建时间
                /*2024-05-13T12:49:07.795777200*/
                String string=LocalDateTime.now().toString();
                int lastIndex=string.lastIndexOf(".");
                String createTime=string.substring(0,lastIndex);
                /*-----------------*/
                myFile.setCreateTime(createTime);
                myFile.setUpdaTime(createTime);
                myFile.setName(fileName);
                myFile.setLength(length);
                myFile.setStatus(status);
                myFile.setType(Type);
                /*  磁盘容量减少*/
                this.size-=length;
                /*文件数量增加*/
                this.fileCount++;
                return myFile;
            }

    }
}

MyFileSystem
大部分的功能都是在这个类中实现的

import java.time.LocalDateTime;
import java.util.*;
import java.util.regex.Pattern;

/**
 * @author GH Fire
 * @version 1.0
 * @description: TODO
 * @date 2024/5/12 22:40
 */
public class MyFileSystem {

    private MyParts parts;
    private MyDirectory rootDirectory; // 文件系统的根目录
    /*指向当前目录*/
    private MyDirectory currentDir;// 指向当前目录的一个指针
    private  HashMap<String,String> orders; /*命令表*/
    private HashMap<String,MyDirectory> dirMap;/*存储所有目录的绝对路径*/
    private ArrayList<String> filesList;/*存储所有文件的绝对路径*/
    /*存储下一级和上一级的目录*/
    private MyDirectory[] cd_arr=new MyDirectory[2];
    /*路径*/
    private String path;
    private long  fileOfSum;/*文件总容量*/
    public MyFileSystem(MyParts parts){
        this.parts=parts;
        this.rootDirectory=new MyDirectory(parts.getName()+"\\");
        this.currentDir=rootDirectory;
        this.dirMap =new HashMap<>();//初始化集合目录
        dirMap.put(rootDirectory.getName(),rootDirectory);
        this.orders=new HashMap<>();// 初始化命令集合
        this.filesList=new ArrayList<>();// 初始化存储文件的集合
        this.path=rootDirectory.getName();
        this.orderList();// 初始化指令
    }


    public MyFileSystem() {
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public MyDirectory getCurrentDir() {
        return currentDir;
    }


    public void setCurrentDir(MyDirectory currentDir) {
        this.currentDir = currentDir;
    }

    public HashMap<String, String> getOrders() {
        return orders;
    }

    public void setOrders(HashMap<String, String> orders) {
        this.orders = orders;
    }

    public MyParts getParts() {
        return parts;
    }

    public void setParts(MyParts parts) {
        this.parts = parts;
    }

    public MyDirectory getRootDirectory() {
        return rootDirectory;
    }

    public void setRootDirectory(MyDirectory rootDirectory) {
        this.rootDirectory = rootDirectory;
    }

    public HashMap<String, MyDirectory> getDirMap() {
        return dirMap;
    }

    public void setDirMap(HashMap<String, MyDirectory> dirMap) {
        this.dirMap = dirMap;
    }

    public ArrayList<String> getFilesList() {
        return filesList;
    }


    /*--------------------文件系统管理方法------------------------------------------------*/
    /*文件创建*/
    public void create(String fileName,String length,String status){
       // 1.判断文件是否有后缀名
            if(fileName.contains("."))
            {
                /*获取最后一个.的位置*/
                int lastIndex=fileName.lastIndexOf(".");
                String fileType=fileName.substring(lastIndex,fileName.length());// 获取文件后缀名称
                String absolute=this.getAbsolute(fileName);
                if(this.getFileByName(fileName)!=null){
                    System.out.println("文件已存在!");
                }else{
                    /*当前目录下存储文件的集合 局部的*/
                    /*获得当前绝对路径所对应的目录列*/

                    MyDirectory myDirectory = this.dirMap.get(this.path);
                    Map<String, MyFile> filesMap= myDirectory.getFiles();

                    // 3.创建文件
                        MyFile myFile = this.parts.create(fileName, Long.parseLong(length), status, fileType);
                        // 4.添加目录到集合
                        if (myFile != null) {
                            filesMap.put(fileName, myFile);
                            filesList.add(absolute);// 存储全局的文件名 用于 dir展示全部信息
                            this.fileOfSum+=myFile.getLength();
                            System.out.println("文件创建成功!");
                        } else {
                            System.out.println("文件创建失败");
                        }
                    }
                }else {
                System.out.println("输入文件后缀名!");
            }



    }
    /*删除文件,删除目录*/
    public void remove(String fileName){
        if(fileName.contains(".")){
            // 文件删除
            // 1.判断文件是否存在
            if(this.getFileByName(fileName)!=null){
                /*获得该文件大小*/
                MyFile f=this.getFileByName(fileName);
                long f_size=f.getLength();
                /*分区容量增加*/
                this.parts.setSize(parts.getSize()+f_size);
                /*文件数量减少*/
                this.parts.setFileCount(this.getFileNum()-1);
                /**/
                this.fileOfSum-=f.getLength();

                Map<String, MyFile> filesMap = this.getFilesMap(this.path);
                filesMap.remove(fileName);
                this.filesList.remove(this.path+"\\"+fileName);

            }
            else {
                System.out.println("文件不存在!");
            }
        }else
        {
            String absolute=this.getAbsolute(fileName);
            // 判断目录是否存在
            if (this.exitsDir(absolute)) {
                // 目录存在 获得这个目录对象  通过绝对路径
                MyDirectory currentDir=this.getDirByAbsolute(absolute);
                /*删除目录之前再次判断是否存在文件*/
                if(currentDir.getFiles().size()>0){
                    System.out.println("该目录存在文件!请先删除文件");
                }else{
                    /*------------删除逻辑-------------*/
                    /*如果这个目录节点是最后一个节点,则让这个目录的前一个的节点的nextNode为空*/
                    if(currentDir.getNextNode()==null){
                        MyDirectory prev=currentDir.getPrevNode();
                        prev.setNextNode(null);
                        // 让目录指针指向这个节点
                        this.currentDir=prev;

                    }else {
                        /*这个目录节点有前节点A和后节点C
                        * 让 A的后节点指向C
                        * 让C的前节点执行A
                        * */
                        MyDirectory prevNode=currentDir.getPrevNode();
                        MyDirectory nextNode=currentDir.getNextNode();
                        prevNode.setNextNode(nextNode);
                        nextNode.setPrevNode(prevNode);
                    }
                    // 在系统目录表中删除这个目录节点的信息
                    this.getDirMap().remove(absolute);
                }

            }
            else {
                System.out.println("目录不存在!");
            }
        }


    }
    /*写入文件*/
    public void write(String fileName){
        // 1.判断文件是否存在
        if(this.getFileByName(fileName)!=null){
            // 2.是否有w的权限
            MyFile f=this.getFileByName(fileName);
            if(f.getStatus().contains("w")||f.getStatus().contains("W")){
                Scanner scanner=new Scanner(System.in);
                StringBuilder sb=new StringBuilder();
                String close="close "+fileName;
                System.out.println("写入文件:");
                String nextLine;
                while (true) {
                    nextLine = scanner.nextLine();
                    if (nextLine.contains(close)) {
                        nextLine="";
                        break;
                    }
                    // 否则,将输入追加到StringBuilder中
                    sb.append(nextLine).append("\n");
                }
                /*判断写入文件是否超出指定大小*/
                if(sb.toString().length()>f.getLength()){
                    System.out.println("超出文件指定内容");
                }else{
                    /*写入信息*/
                    f.setString(sb.toString());
                  /*   修改文件时间*/
                    f.setUpdaTime(this.getNowTime());
                }

            }else {
                System.out.println("没有写入权限");
            }

        }
        else {
            System.out.println("文件不存在!");
        }
    }
    /*查看文件内容*/
    public void cat(String fileName){
        // 1.判断文件是否存在
        if(this.getFileByName(fileName)!=null){
            // 获取当前文件
            MyFile f=this.getFileByName(fileName);
            // 判断文件权限
            if(f.getStatus().contains("r")||f.getStatus().contains("R")){
                String string = f.getString();
                System.out.println(string);
            }else {
                System.out.println("文件没有r的权限");
            }
        }else {
            System.out.println("文件不存在!");
        }
    }
    /*查看文件属性*/
    public void file(String fileName){
        // 1.判断文件是否存在
        if(this.getFileByName(fileName)!=null){
           MyFile myFile=this.getFileByName(fileName);
            if (myFile != null) {
                System.out.println(myFile.toString());
            }
        }else {
            System.out.println("文件不存在!");
        }
    }
    /*重命名文件*/
    public void rename(String oldName,String newName){
        if(this.getFileByName(newName)!=null){
            System.out.println(newName+"已存在");
            return;
        }
        // 1.判断文件是否存在
        if(this.getFileByName(oldName)!=null){
//            MyFile myFile=this.exits(oldName);
            /*oldName 指向*/
            MyFile myFile1 = this.getFileByName(oldName);
            /*改名*/
            myFile1.setName(newName);
            /*修改文件时间*/
            myFile1.setUpdaTime(this.getNowTime());
            Map<String, MyFile> filesMap = this.getFilesMap(this.path);
            filesMap.remove(oldName);
            this.filesList.remove(this.path+"\\"+oldName);
            this.filesList.add(this.path+"\\"+newName);
            filesMap.put(newName,myFile1);

        }else {
            System.out.println("文件不存在!");
        }
    }

    /*显示当前用户所有文件,文件夹 dir userName*/
    public void show(){

            /*遍历所以文件名*/
            for (String fileName:this.filesList){
                System.out.println(fileName);
            }
            /*遍历所以目录名*/
        Set<String> dirNames = this.dirMap.keySet();
        for (String dirName:dirNames){
                System.out.println(dirName);
            }
    }
    /*命令提示*/
    public void help(){
        System.out.println("***********************************");
        System.out.println("create fileName length status |创建文件");
        System.out.println("rm [fileName][dirName]|删除文件 删除目录");
        System.out.println("cat fileName|查看文件内容");
        System.out.println("write fileName|写入文件");
        System.out.println("file fileName|查询文件属性");
        System.out.println("chmod fileName status|修改文件权限");
        System.out.println("rename oldName newName|重命名文件");
        System.out.println("dir userName|显示当前用户下的所有文件");
        System.out.println("df|产看磁盘");
        System.out.println("close fileName|关闭文件");
        System.out.println("return|返回登录界面");
        System.out.println("exit|退出程序");
        System.out.println("mkdir dirName|新建目录");
        System.out.println("ls|产看当前目录下文件和子目录");
        System.out.println("cd[dirName][..]|进入子目录或或者退出");
        System.out.println("***********************************");
    }
    /*显示磁盘空间使用情况*/
    public void display(MyDisk disk){
        HashMap<String, MyParts> map = disk.getParts();
        Collection<MyParts> values = map.values();

        System.out.println("分区名---------文件数量---------使用容量---------剩余容量");
        long allUsed=0;
        for (MyParts myParts :values ) {
            String partName = myParts.getName();
            int fileNums = myParts.getFileCount();
            long used = myParts.getFileSystem().getSystemFileSize();
            long Available = myParts.getSize();
            allUsed+=used;
            System.out.println(partName + "             " + fileNums + "             " + used + "Byte" + "             " + Available + "Byte");

        }
        System.out.println("**************************************************");
        System.out.println("系统总容量:"+disk.getSize()+"Byte      使用容量:"+allUsed+"Byte        剩余容量:"+(disk.getSize()-allUsed)+"Byte");
        /*分区名---------文件数量--------------使用容量------剩余容量------*/

    }
    /*修改文件权限*/
    public void chmod(String fileName,String status){
        //1.判断文件是否存在
        if(this.getFileByName(fileName)!=null){
           MyFile f=getFileByName(fileName);
           f.setStatus(status);
           /*修改文件时间*/
            f.setUpdaTime(this.getNowTime());
        }else {
            System.out.println("文件不存在!");
        }
    }
    /*获取当前系统文件使用容量*/
    public long getSystemFileSize(){

        return  this.fileOfSum;
    }
    /*----------------------------------------------------------*/
    /*创建目录*/
    public void mkdir(String dirName){
        String regex = "^[^\\\\/<>\\.?]*$";
        boolean matches = Pattern.matches(regex, dirName);
        if(!matches){
            System.out.println("目录名不能包含\\/<>.");
            return;
        }

        /*创造绝对路径*/
         String absolute=getAbsolute(dirName);
        // 1.判断是否存在目录
        if(exitsDir(absolute)){
            System.out.println("目录已存在");
            return;
        }
        // 创建目录
        MyDirectory dir=new MyDirectory(dirName);
        dir.setCreateTime(this.getNowTime());
        dir.setUpdaTime(this.getNowTime());
        if(rootDirectory.getNextNode()==null){
            rootDirectory.setNextNode(dir);
            dir.setPrevNode(rootDirectory);
        }else {
            this.currentDir.setNextNode(dir);
            dir.setPrevNode(this.currentDir);
        }
        this.currentDir=dir;
        /*添加绝对路径*/
       dirMap.put(absolute,dir);

    }
    /*进入下一级 返回上一级 目录 cd */
    public void cdDir(String DirName){
       if (DirName.equals("..")){
            /*返回上一级目录 ..*/
            try {
                this.currentDir=cd_arr[0];// 返回上一级的目录指向
                this.path=this.path.substring(0,this.getPath().lastIndexOf("\\"));
                if(path.length()==2){
                    path+="\\";
                }
            } catch (Exception e) {
                System.out.println("系统找不到指定的路径");
            }

        }
       else{
            /*进入目录*/
            /*1.获得 DirName的绝对路径*/
            String absolutePath=this.getAbsolute(DirName);
            if(exitsDir(absolutePath)){
                /*存在 指向该目录的内部*/
                cd_arr[0]=this.currentDir;// 保存父目录的指向
                this.path=absolutePath;
                /*进入一个目录
                * 该目录如果没有子目录 指向->root
                * 该目录不为空  指向最后一个目录
                *this.currentDir.getRootDirectory() 表示该目录内部的起点
                * */
                MyDirectory cd_Dir= dirMap.get(absolutePath);//进入该目录
                MyDirectory rootNode=cd_Dir.getRootDirectory();
               if(rootNode.getNextNode()==null){
                   /*没有子目录  指针指向起点*/
                  this.currentDir=rootNode;
               }else {
                   /*存在子目录*/
                   //1.获得最后一个目录位置的指向
                   this.currentDir=this.getLastNode(rootNode);

               }
            }else{
                System.out.println("系统找不到指定的路径");
            }

        }




    }
    /* 显示当前目录下的所有文件,目录*/
    public void ls(){
        /*当前根节点*/
       MyDirectory root=this.returnRootDir(this.currentDir);
       /*遍历目录名*/
       while (true){
           if(root.getNextNode()!=null){
               /*若果root的下一个节点不为空,输出root下一个节点的值*/
               System.out.println(root.getNextNode().getName());
               root=root.getNextNode();
           }else{
                break;
           }
       }
       /*遍历文件名*/
        /*获得当前绝对路径*/


        Map<String, MyFile> filesMap=this.getFilesMap(path);
        Set<String> files = filesMap.keySet();
        for (String fileName:files){
            System.out.println(fileName);
        }


    }
    /*返回登录界面前让指针指向系统根节点*/
    public void returnLogin() {
        this.currentDir=rootDirectory;
        // path 回到最初样式
        this.path=rootDirectory.getName();
    }
    public void clear()  {
        System.out.println("清除屏幕");
    }
    /*对输入命令的检验*/
    public boolean compareTo(HashMap<String,String> orders,String[] receive){
        /*获得键*/
        Set<String> keys = orders.keySet();
        /*判断是否存在命令*/
        for (String key:keys){
            if(receive[0].equals(key)){
                /*该命令存在*/
                String value = orders.get(key);//根据键获的值
                String[] split = value.split(";");//拆分指令 获得各项参数;
                // 比较参数数量
                if(receive.length-1==Integer.parseInt(split[1])){
                    return true;
                }
            }
        }
        return false;
    }
    /*----------------------------------------------------------*/
    /*调用当前系统下目录的存储文件集合*/
    /*获取当前时间*/
    private  String getNowTime(){
       /* LocalDateTime now = LocalDateTime.now();*/
        String string=LocalDateTime.now().toString();
        int lastIndex=string.lastIndexOf(".");
        return string.substring(0,lastIndex);
    }
    /*获取当前文件对象*/
    /*获得分区文件数量*/
    private int getFileNum(){
        return this.parts.getFileCount();
    }
    /*命令表*/
    private void orderList(){
        /*    参数长度;*/
        String c1="create;3;";
        String c2="rm;1";
        String c3="cat;1";
        String c4="write;1";
        String c5="file;1";
        String c6="chmod;2";
        String c7="rename;2";
        String c8="dir;1";
        String c9="df;0";
        String c10="close;1";
        String c11="return;0";
        String c12="exit;0";
        String c13="cd;1";
        String c14="mkdir;1";
        String c15="ls;0";
        String c16="help;0";
        String c17="clear;0";
        orders.put("create",c1);
        orders.put("rm",c2);
        orders.put("cat",c3);
        orders.put("write",c4);
        orders.put("file",c5);
        orders.put("chmod",c6);
        orders.put("rename",c7);
        orders.put("dir",c8);
        orders.put("df",c9);
        orders.put("close",c10);
        orders.put("return",c11);
        orders.put("exit",c12);
        orders.put("cd",c13);
        orders.put("mkdir",c14);
        orders.put("ls",c15);
        orders.put("help",c16);
        orders.put("clear",c17);



    }
    /*------------------------------------ 目录相关-----------------------------------------------------------*/
    /*该目录是否存在
    * 通过命令行的当前路径和 目录名 组成一个新的路径
    * 然后和系统的目录表进行比较判断是否存在! 啧啧
    *
    *
    * */
   /*判断是否存目录*/
    private boolean exitsDir(String absolute){
        Set<String> dirNames = this.dirMap.keySet();
        for(String s:dirNames){
            if(s.equals(absolute))
                return true;
        }
        return false;
        /*岂不是可以用键值对存储目录?*/
    }
    /*获得绝对路径*/
    private String getAbsolute(String dirName){
        String absolute;
        if(this.path.endsWith("\\")){
            /*    C:\    */
            absolute=this.path+dirName;
        }else{
            /*   C:\xxx */
            absolute=this.path+"\\"+dirName;
        }
        return absolute;
    }
    /*获得当前目录下的文件---根据绝对路径获得文件*/
    private MyFile getFileByName(String fileName){

        /*获得目录绝对路径*/
        String absolute=this.path;
        /*获得文件绝对路径*/
        String absolutFile=absolute+"\\"+fileName;
        /*根据路径获得所在目录*/
        MyDirectory myDirectory = this.dirMap.get(absolute);
        /**/
        return myDirectory.getFiles().get(fileName);
    }
    /*找到当前目录下的根节点*/
    private MyDirectory returnRootDir(MyDirectory currentDir) {
       while (true){
           if(currentDir.getPrevNode()!=null){
               currentDir=currentDir.getPrevNode();
           }else {
               return currentDir;
           }
       }

    }
    /*根据根节点找到最后一个节点*/
    private MyDirectory getLastNode(MyDirectory rootNode){
        while (true){
            if(rootNode.getNextNode()!=null){
                rootNode=rootNode.getNextNode();
            }else {
                return rootNode;
            }

        }
    }
    /*当前目录下存储文件的集合*/
    private Map<String, MyFile> getFilesMap(String path){
        MyDirectory myDirectory = dirMap.get(path);
        return myDirectory.getFiles();
    }
    /*判断文件还是目录*/
    private boolean fileOrDir(String name){
        // 为文件 true
        // 为目录 false
        return name.contains(".");


    }
    /* 根据绝对路径获得对应的目录对象*/
    private MyDirectory getDirByAbsolute(String absolutePath){
        HashMap<String, MyDirectory> dirMap = this.getDirMap();
        return dirMap.get(absolutePath);

    }



}

Login

注册登录业务的实现



import java.util.*;

/**
 * @author GH Fire
 * @version 1.0
 * @description: TODO
 * @date 2024/5/12 21:42
 */
public class Login {

    // 存储用户信息
    static ArrayList<User> uesrArrayList=new ArrayList<>();
    static {
        uesrArrayList.add(new User("zgh","123456"));
    }

    public Login(){
        showlogin();
    }

    /*用户登录*/
    private static void login(String username, String password) {
        // 1.判断用户是否存在
        if(!exitsUser(username)){
            System.out.println("用户不存在!请注册");
        }else{
           for (User user:uesrArrayList){
               if(user.getPassword().equals(password)&&user.getUserName().equals(username)){
                   User u=user;
                   System.out.println("登录成功!");
                   /*  进入磁盘划分   */
                   createDisk(u);
                   break;
               }
           }
            System.out.println("密码错误!");
        }
    }
    public static void showlogin(){
        Scanner sc=new Scanner(System.in);
        String command;
        while (true) {
            System.out.println("****文件管理系统****");
            System.out.println("*---1.Login-------*");
            System.out.println("*---2.Register----*");
            System.out.println("*******************");
            System.out.print("输入命令:");
            command=sc.nextLine();
            switch (command) {
                case "1":
                    System.out.println("输入用户名:");
                    String username = sc.nextLine();
                    System.out.println("输入密码:");
                    String password = sc.nextLine();
                    login(username, password);
                    break;
                case "2":
                        System.out.println("输入用户名:");
                        String username2 = sc.nextLine();
                        System.out.println("输入密码:");
                        String password2 = sc.nextLine();
                        System.out.println("确认密码:");
                        String passwordAgai = sc.nextLine();
                        // 检查两次密码是否一致
                      check(username2, password2, passwordAgai);
                    break;
                default:
                    System.out.println("指令错误!");
            }

        }

    }
    /*注册用户*/
    private static boolean check(String username2, String password2, String passwordAgai) {
        //1.检查用户是否存在
       if(!exitsUser(username2)){
           /*用户不存在*/
         if(compareTo( password2,  passwordAgai)){

             // 添加用户
             User user=new User();
             user.setUserName(username2);
             user.setPassword(passwordAgai);
             // 磁盘指向

             uesrArrayList.add(user);
             System.out.println("注册成功!");
             return true;
         } else {
             System.out.println("两次密码不一致!");
             return false;
         }
       }else {
           System.out.println("用户已存在!");
           return false;
       }

    }
    /*判断两次密码是否一致*/
    private static boolean compareTo(String password2, String passwordAgai){
        if (password2.equals(passwordAgai)){
            return true;
        }else{
            return false;
        }
    }
    /*判断用户是否存在*/
    private static boolean exitsUser(String username2) {
        for (User user:uesrArrayList){
            if(user.getUserName().equals(username2)){
                /*用户存在*/
                return true;
            }
        }
        return  false;
    }
    /*-----------------------------------------------------------------------------------*/
    /*创建磁盘进行划分*/
    private static void createDisk(User u) {
        Scanner sc=new Scanner(System.in);
        String name;
        // 还未分区
        if(!u.isFlag()) {
            System.out.print("输入划分磁盘数量:");
            int num=sc.nextInt();
            /*磁盘划分数量 名称 每个磁盘容量*/
            /* 构造一个磁盘对象*/
            MyDisk myDisk=new MyDisk(num);
            u.setDisk(myDisk);
            u.setFlag(true);
            HashMap<String, MyParts> parts = myDisk.getParts();
            Set<String> keys = parts.keySet();
            while (true) {
                System.out.println("选择分区进入:");
                name=sc.next();
                for (String s:keys){
                    if(s.equals(name)){
                        menu(u,name);
                        break;
                    }
                }
                System.out.println("分区不存在");
            }

        }else{
            HashMap<String, MyParts> parts = u.getDisk().getParts();
            Set<String> keys = parts.keySet();
            while (true) {
                System.out.println("选择分区进入:");
                name=sc.next();
                for (String s:keys){
                    if(s.equals(name)){
                        menu(u,name);
                        break;
                    }
                }
                System.out.println("-----分区不存在----");
                System.out.println("可能存在的分区");
                for (String s:keys){
                    System.out.println(s);
                }
                System.out.println("----------------");
            }


        }


    }
    /*主要功能*/
    public static void  menu(User u ,String partName){
        Scanner sc=new Scanner(System.in);
        /*文件管理系统*/
        HashMap<String, MyParts> partsMap = u.getDisk().getParts();

            MyParts  myParts = partsMap.get(partName);
            MyFileSystem myFileSystem=myParts.getFileSystem();
            String[] receive;
            while (true){
                /*文件路径*/
                String path= myFileSystem.getPath();
                System.out.println("-----------------"+u.getUserName()+"的文件管理系统--------------------------------");
                System.out.print("输入指令 "+path+">");
                /*命令接收*/
                receive= sc.nextLine().split("\\s+");// 至少匹配一个空格
                if(myFileSystem.compareTo(myFileSystem.getOrders(),receive)){
                    switch (receive[0]){
                        /*创建文件*/
                        case  "create":
                            try {
                                Long.parseLong(receive[2]);
                                myFileSystem.create(receive[1],receive[2],receive[3]);
                            } catch (NumberFormatException e) {
                                System.err.println("file size Exception!");
                            }
                            break;
                        case "rm":
                            myFileSystem.remove(receive[1]);
                            break;
                        case"cat":
                            myFileSystem.cat(receive[1]);
                            break;
                        case "write":
                            myFileSystem.write(receive[1]);
                            break;
                        case "file":
                            myFileSystem.file(receive[1]);
                            break;
                        case "rename":
                            myFileSystem.rename(receive[1],receive[2]);
                            break;
                        case "dir":
                                    if(!u.getUserName().equals(receive[1])){
                                        System.out.println("请输入当前用户!");
                                    }else
                                        myFileSystem.show();
                            break;
                        case "df":
                            myFileSystem.display(u.getDisk());
                            break;
                        case "close":
                            System.out.println(".....");
                            break;
                        case "chmod":
                            myFileSystem.chmod(receive[1],receive[2]);
                            break;
                        case  "return":
                            /*返回登录界面*/
                            myFileSystem.returnLogin();
                        showlogin();
                            break;
                        case "exit":
                            /*退出程序*/
                            System.exit(0);
                        case "help":
                            /*命令提示*/
                            myFileSystem.help();
                            break;
                        case "mkdir":
                            myFileSystem.mkdir(receive[1]);
                            break;
                        case"cd":/*进入下一级目录*/
                            myFileSystem.cdDir(receive[1]);
                            break;
                        case "ls":
                            myFileSystem.ls();
                            break;
                        case "clear":
                            myFileSystem.clear();
                            break;
                        default:
                            System.out.println("指令错误!");
                            break;

                    }
                }
                else {
                    System.out.println("请输入正确的指令!");
                }


            }




    }
    /*输入格式的检验  int except */
    public static boolean checkout(int except,int actual){
        if(except!=actual){
            return false;
        }
        else{
            return true;
        }

    }

    }


标签:课程设计,java,操作系统,System,private,String,println,public,out
From: https://blog.csdn.net/m0_44993206/article/details/140335220

相关文章

  • JavaWeb-js(4)
    js事件在前端页面中,js程序大多数是由事件来驱动的,当触发某些事件的时候,可以使用js负责响应。js事件由三部分组成:    事件源——》指的是被触发的对象;    事件类型——》如何触发的事件,如:鼠标单击、双击、键盘操作等;    事件处理程序——》触发事件以......
  • 常见的设计模式-java实现
    设计模式的目的代码从重用性(相同的功能可以复用)代码的可读性(编程的规范性,便于其他人的阅读)可扩展性(程序添加新功能不会很困难)可靠性(添加新功能后对原有的功能没有影响)使程序高内聚低耦合七大设计原则1.单一职责原则介绍一个类应该只负责一个职责,降低类的耦合度。提高......
  • 数据结构(Java):集合类LinkedList&集合类Stack
    1、集合类LinkedList1.1什么是LinkedListLinkedList的底层是一个双向链表的结构(故不支持随机访问):在LinkedList中,定义了first和last,分别指向链表的首节点和尾结点。每个节点中有一个成员用来存储数据,还有两个指针域next和prev分别存储下一个节点和上一个节点的地址。Link......
  • JavaSE基础面试题 (24年7月10日)
    1、Lambda的作用:用于简化匿名内部类的书写我们可以用下面的格式编写Lambda(被重写方法的形参列表)->{        被重写方法的方法体代码;}需要说明的是,使用Lambda表达式之前,必须先有一个接口,而且接口中只能有一个抽象方法。(注意:不能是抽象类,只能是接口)......
  • 基于Java+SSM+jsp的宠物信息交流平台系统的设计与实现(源码+数据库+讲解等)
    文章目录前言详细视频演示项目运行截图技术框架后端采用SSM框架前端框架JSP可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • 基于Java+SSM+jsp的汉服商城网站系统的设计与实现(源码+数据库+讲解等)
    文章目录前言详细视频演示项目运行截图技术框架后端采用SSM框架前端框架JSP可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • 基于Java+SSM+jsp的汉服商城网站系统的设计与实现(源码+数据库+讲解等)
    文章目录前言详细视频演示项目运行截图技术框架后端采用SSM框架前端框架JSP可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • 基于Java+SSM+jsp的儿童众筹救助系统的设计与实现(源码+数据库+讲解等)
    文章目录前言详细视频演示项目运行截图技术框架后端采用SSM框架前端框架JSP可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • java Redission 分布式锁的使用
    在微服务的场景下,一个应用会部署多个实例,在一些业务场景中,需要保证同一时间多个线程只能有一个线程操作资源,分布式锁可以实现这一需求。JAVA中,Redission分布式锁是基于Redis实现的分布式锁,使用简单,只需要关注业务场景和使用到的接口即可。引入依赖<!--https://mvnreposito......
  • JavaScript简易ATM机功能
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......