前言

​ 文件管理系统是我们在使用电脑是经常会使用的功能,支持创建、删除、移动文件等一系列功能操作。接下来将开发一款含有大部分基础功能的文件管理系统。

​ 本次将了解文件管理系统的基本原理,并通过控制台实现对文件及目录的部分处理操作,以加深对文件管理系统的理解,为后续文件控制系统的开发奠定基础。

一、什么是文件?

文件(File)是计算机中存储数据的基本单元,本质是一组按特定格式组织的二进制数据流(0 和 1),用于长期保存文本、图片、视频、程序等信息。

文件 vs 目录:

类型作用核心特征
文件存储具体数据(文本 / 二进制)有大小、内容,不可包含其他文件
目录组织和管理文件无大小、无内容,可包含文件 / 子目录

二、LINUX命令

在Linux系统中,在处理文件和目录时,有许多常用的命令行工具和命令。以下是一些最常用的文件和目录相关的命令:

  1. ls - 列出目录内容
    • 示例:ls 列出当前目录内容
    • 示例:ls -l 以长格式列出详细信息
    • 示例:ls -a 列出所有文件,包括隐藏文件
  2. cd - 改变当前目录
    • 示例:cd /path/to/directory 改变当前工作目录到指定路径
    • 示例:cd .. 返回上一级目录
    • 示例:cd ~ 返回用户的主目录
  3. pwd - 打印当前工作目录的完整路径
    • 示例:pwd 显示当前目录的绝对路径
  4. mkdir - 创建新目录
    • 示例:mkdir new_directory 在当前目录下创建一个名为 new_directory 的新目录
    • 示例:mkdir -p parent/child/new_directory 创建多级目录结构
  5. rmdir- 删除空目录
    • 示例:rmdir directory_name 删除名为 directory_name 的空目录
  6. rm - 删除文件或目录
    • 示例:rm file_name 删除名为 file_name 的文件
    • 示例:rm -r directory_name 删除名为 directory_name 的目录及其内容(递归)
    • 注意:使用 rm -r 时要小心,以避免误删除重要数据。
  7. cp - 复制文件或目录
    • 示例:cp source_file dest_filesource_file 复制为 dest_file
    • 示例:cp -r source_directory dest_directory 递归复制目录及其内容
  8. mv - 移动或重命名文件或目录
    • 示例:mv old_name new_name 重命名文件或目录
    • 示例:mv file_or_directory /path/to/destination 将文件或目录移动到指定路径
  9. touch - 创建空文件或更新文件的时间戳
    • 示例:touch new_file.txt 创建一个名为 new_file.txt 的空文件
    • 示例:touch existing_file.txt 更新 existing_file.txt 的访问和修改时间

二、文件管理系统设计

1. 核心属性 - 基础信息:

  • 名称(name)
  • 路径(path)
  • 格式(format)
  • 大小(size)
  • 类型(文件/目录,type)
  • 时间(time)
  • 权限(读写等)

2. 核心方法 - 基础操作:

在处理文件和目录时,采用linux命令风格来实现以下几种基础操作:

  • 查看当前目录下的文件和目录(ls)
  • 创建目录(mkdir)
  • 创建文件(touch)
  • 删除文件/目录(rm)
  • 退出系统(exit)
  • 显示帮助信息(help)

3. 规避命名冲突

  • 自定义类(如文件类)避免与系统内置类(如File类)重名

三、文件管理系统代码框架

1、核心属性与全局变量

1.1 成员属性(文件 / 目录的核心信息)
// 核心属性
String name;       // 名称
String path;       // 路径(绝对路径,如 /test/file)
String format;     // 格式(仅文件有效,目录为空)
int size;          // 大小(文件:KB;目录:0)
String type;       // 类型:文件 / 目录
String permission; // 权限(默认 读写)

这些属性是每个文件 / 目录的 “身份信息”,通过构造方法初始化,后续所有操作(查找、删除、显示)都依赖这些属性。

1.2 静态全局变量
// 存储所有文件/目录的集合
static final List<SFile1> fileSystem = new ArrayList<>();
// 当前工作目录
static String dir = "/";
  • fileSystem:用ArrayList存储所有资源;
  • dir:记录用户当前所在目录,构建绝对路径。

2、构造方法

因为文件和目录的属性不同(文件有格式、大小,目录没有),所以设计了两个构造方法,分别对应两种资源类型:

2.1 文件构造方法
// 文件构造方法:创建文件时调用,需要传入 名称、路径、格式、大小
public SFile1(String name, String path, String format, int size) {
    this.name = name;       // 赋值文件名
    this.path = path;       // 赋值绝对路径
    this.format = format;   // 赋值文件格式
    this.size = size;       // 赋值文件大小(KB)
    this.type = "文件";     // 固定类型为“文件”
    this.permission = "读写"; // 默认权限
}
  • 必须传入formatsize,因为文件的核心特征是 “格式” 和 “大小”;
  • type固定为 “文件”,避免手动输入错误。
2.2 目录构造方法
// 目录构造方法:创建目录时调用,只需传入 名称、路径(格式和大小固定)
public SFile1(String name, String path) {
    this.name = name;       // 赋值目录名
    this.path = path;       // 赋值绝对路径
    this.format = "";       // 目录无格式,设为空字符串
    this.size = 0;          // 目录无大小,设为0
    this.type = "目录";     // 固定类型为“目录”
    this.permission = "读写"; // 默认权限
}
  • 不需要formatsize参数,直接固定为默认值;
  • type固定为 “目录”,与文件做明确区分。

3、方法

3.1 构建绝对路径(buildAbsolutePath
// 基于当前工作目录,构建“绝对路径”
static String buildAbsolutePath(String name) {
    if (dir.equals("/")) {  // 如果当前在根目录(/),直接拼接为 "/名称"
        return "/" + name;
    } else {                // 如果当前在子目录(如 /docs),拼接为 "/docs/名称"
        return dir + "/" + name;
    }
}
  • 用途:用户输入相对名称(如mkdir test)时,自动转为绝对路径(如当前在/docs,则转为/docs/test);
  • 示例:
    • 当前目录/buildAbsolutePath("test")/test
    • 当前目录/docsbuildAbsolutePath("file")/docs/file
3.2 检查名称冲突(isNameExists
// 检查当前目录下是否已存在同名文件/目录(避免重复创建)
static boolean isNameExists(String name) {
    String targetPath = buildAbsolutePath(name); // 先构建目标绝对路径
    for (SFile1 file : fileSystem) {             // 遍历所有资源
        if (file.path.equals(targetPath)) {      // 对比路径
            return true; // 存在冲突,返回true
        }
    }
    return false; // 无冲突,返回false
}
  • 核心逻辑:文件系统中 “绝对路径唯一”,所以判断 “当前目录是否有同名文件/目录”,本质是判断 “目标路径是否已存在”;
  • 用途:mkdirtouch命令执行前,都会调用这个方法,避免重复创建。
3.3 查找当前目录下的文件 / 目录(findFileInDir
// 根据名称查找当前目录下的文件/目录(返回找到的资源,没找到返回null)
static SFile1 findFileInDir(String name) {
    String targetPath = buildAbsolutePath(name); // 构建目标绝对路径
    for (SFile1 file : fileSystem) {             // 遍历所有资源
        if (file.path.equals(targetPath)) {      // 匹配路径
            return file; // 找到,返回该资源对象
        }
    }
    return null; // 没找到,返回null
}
  • 用途:rm命令删除资源前,需要先通过这个方法找到要删除的对象;如果返回null,则提示 “未找到”。

4、核心功能方法

每个方法对应一个用户命令(ls/mkdir/touch/rm/help),是程序的核心逻辑。

4.1 ls命令:查看当前目录下的所有资源
static void ls() {
    System.out.println("\n当前目录:" + dir);
    System.out.println("------------------------------------------------");
    System.out.printf("%-10s %-10s %-8s %s%n", "类型", "大小(KB)", "权限", "名称");
    System.out.println("------------------------------------------------");

    boolean falg = false;
    for (SFile1 file : fileSystem) {
        // 只显示当前目录的直接子文件/目录
        String expectedPath = dir.equals("/") ? "/" + file.name : dir + "/" + file.name;
        if (file.path.equals(expectedPath)) {
        	falg = true;
         	String Name = file.type.equals("目录") ? file.name + "/" : file.name + "." + file.format;
            System.out.printf("%-10s %-10d %-8s %s%n",
                file.type, file.size, file.permission, Name);
        }
    }
    if (!falg) {
        System.out.println("当前目录为空");
    }
    System.out.println("------------------------------------------------");
}
  • 功能:遍历fileSystem中所有资源,按 “类型、大小、权限、名称” 的格式显示;
4.2 mkdir命令:创建目录
static void mkdir(String dirName) {
    // 目录名不能为空
    if (dirName.isEmpty()) {
        System.out.println("目录名不能为空!");
        return;
    }
    // 当前目录是否已存在同名目录/文件
    if (isNameExists(dirName)) {
        System.out.println("当前目录已存在 '" + dirName + "'!");
        return;
    }

    // 构建目录的绝对路径(调用buildAbsolutePath方法)
    String dirPath = buildAbsolutePath(dirName);
    // 创建目录对象(调用目录构造方法)
    SFile1 newDir = new SFile1(dirName, dirPath);
    // 将目录添加到文件系统
    fileSystem.add(newDir);
    // 提示创建成功
    System.out.println("成功创建目录:" + newDir.path + "(权限:" + newDir.permission + ")");
}
  • 核心:通过buildAbsolutePath保证路径唯一,通过isNameExists避免重复创建。
4.3 touch命令:创建文件
static void touch(String fileName, String format, int size) {
    // 文件名和格式不能为空
    if (fileName.isEmpty() || format.isEmpty()) {
        System.out.println("文件名和格式不能为空!");
        return;
    }
    // 当前目录是否已存在同名文件/目录
    if (isNameExists(fileName)) {
        System.out.println("当前目录已存在 '" + fileName + "'!");
        return;
    }

    // 构建文件的绝对路径
    String filePath = buildAbsolutePath(fileName);
    // 创建文件对象(调用文件构造方法)
    SFile1 newFile = new SFile1(fileName, filePath, format, size);
    // 将文件添加到文件系统
    fileSystem.add(newFile);
    // 提示创建成功(显示完整路径、大小、权限)
    System.out.println("成功创建文件:" + newFile.path + "." + newFile.format +
            "(大小:" + newFile.size + "KB,权限:" + newFile.permission + ")");
}
  • mkdir的区别:多了formatsize参数,且创建时调用 “文件构造方法”。
4.4 rm命令:删除文件 / 目录
static void rm(String name) {
    // 查找要删除的资源
    SFile1 target = findFileInDir(name);
    // 校验:如果没找到,提示错误
    if (target == null) {
        System.out.println("未找到文件/目录 '" + name + "'!");
        return;
    }

    // 执行删除
        fileSystem.remove(target);
        String displayPath = target.type.equals("目录") ? target.path : target.path + "." + target.format;
        System.out.println("成功删除:" + displayPath);
}
  • 执行流程:查找目标资源是否存在 → 从fileSystem中删除 → 提示结果;
4.5 help命令:显示帮助信息
static void help() {
    System.out.println("\n===== 文件管理系统帮助 =====");
    System.out.println("ls                - 查看当前目录下的文件和目录");
    System.out.println("mkdir [目录名]    - 创建新目录(如 mkdir Test)");
    System.out.println("touch [文件名] [格式] [大小KB] - 创建新文件(如 touch test txt 20)");
    System.out.println("rm [名称]         - 删除文件或空目录(如 rm test)");
    System.out.println("help              - 显示帮助信息");
    System.out.println("exit              - 退出系统");
    System.out.println("===========================\n");
}
  • 功能:向用户展示所有支持的命令及用法。

5、程序入口与命令处理

main负责初始化系统、接收用户输入、解析命令、调用对应功能方法。

5.1 初始化系统
public static void main(String[] args) {
    // 创建Scanner对象,用于读取用户输入(控制台交互)
    Scanner scanner = new Scanner(System.in);

    System.out.println("======================================");
    System.out.println("=====       基础文件管理系统       ======");
    System.out.println("=====    输入 help 查看可用命令    ======");
    System.out.println("======================================\n");

    // 初始化根目录(默认存在,路径为 "/",名称为 "root")
    fileSystem.add(new SFile1("root", "/"));
  • 根目录初始化:程序启动时自动创建根目录/,用户所有操作都基于根目录;
  • Scanner:用于读取用户在控制台输入的命令。
5.2 循环处理用户命令
    while (true) { 
        // 命令提示符:显示当前目录,模拟终端交互
        System.out.print(dir + " > ");
        // 读取用户输入的一行命令
        String input = scanner.nextLine();
        // 处理空输入
        if (input.isEmpty())
            continue;

        // 解析命令:按空格分割输入字符串,得到命令数组(如 "touch test txt 20" → ["touch", "test", "txt", "20"])
        String[] cmds = input.split(" ");
        String cmd = cmds[0]; // 第一个元素是核心命令(如 "touch"、"ls")

        // 执行命令:根据核心命令调用对应功能方法
        switch (cmd) {
            case "ls": // 查看目录
                ls();
                break;
            case "mkdir": // 创建目录
                if (cmds.length < 2) { // 必须传入目录名(1个参数)
                    System.out.println("格式错误!输入 help 查看可用命令");
                } else {
                    mkdir(cmds[1]); // 传入目录名
                }
                break;
            case "touch": // 创建文件
                if (cmds.length < 4) { //必须传入 文件名、格式、大小(3个参数)
                    System.out.println("格式错误!输入 help 查看可用命令");
                } else {
                    // 提取参数:文件名(cmds[1])、格式(cmds[2])、大小(cmds[3],转为整数)
                    String fileName = cmds[1];
                    String format = cmds[2];
                    int size = Integer.parseInt(cmds[3]);
                    touch(fileName, format, size); 
                }
                break;
            case "rm": // 删除资源
                if (cmds.length < 2) { 
                    System.out.println("格式错误!输入 help 查看可用命令");
                } else {
                    rm(cmds[1]); 
                }
                break;
            case "help": // 显示帮助
                help();
                break;
            case "exit": // 退出系统
                System.out.println("感谢使用,再见!");
                System.exit(0);
                break;
            default: 
                System.out.println("未知命令 '" + cmd + "'!输入 help 查看可用命令");
        }
    }
}
  • 命令解析逻辑:
    1. split(" ")分割输入字符串,得到命令数组(如"mkdir docs"["mkdir", "docs"]);
    2. 第一个元素是核心命令(cmd),后续元素是参数(如cmds[1]是目录名 / 文件名);
  • 参数检查:每个命令都检查参数数量(如touch需要 3 个参数);

四、实际操作演示

以 “查看命令→创建目录→创建文件→查看→删除→检查→退出” 为例,展示程序的完整运行流程:

  1. 程序启动,初始化根目录/,并输入 help查看可用命令;

在这里插入图片描述

  1. 用户输入 mkdir Test → 解析命令mkdir,参数Test → 构建路径/Test → 无冲突 → 创建目录并加入fileSystem → 提示 “成功创建目录:/Test(权限:读写)”;

在这里插入图片描述

  1. 用户输入 touch test txt 50 → 解析命令touch,参数testtxt50 → 构建路径/test → 无冲突 → 创建文件并加入fileSystem → 提示 “成功创建文件:/test.txt(大小:50KB,权限:读写)”;

在这里插入图片描述

  1. 用户输入 ls → 遍历fileSystem → 显示当前目录/下的资源;

在这里插入图片描述

  1. 用户输入 rm test → 查找路径/test → 找到文件 → 从fileSystem删除 → 提示 “成功删除:/test.txt”;
    在这里插入图片描述

  2. 用户输入 rm Test → 查找路径/Test → 找到目录 → 从fileSystem删除 → 提示 “成功删除:/Test”;
    在这里插入图片描述

  3. 用户输入 ls → 遍历fileSystem → 检查是否删除;
    在这里插入图片描述

  4. 用户输入 exit → 提示 “感谢使用,再见!” → 程序终止。
    在这里插入图片描述

五、版本规划

  • V1.0:显示本地目录结构
  • V2.0:新增创建文件、创建文件夹功能
  • V3.0:支持点击按钮打开文件夹、点击标签打开文件
  • V4.0:新增文件搜索功能
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐