学习一个系统的基本操作原理

· · 科技·工程

前言(防杠贴士)

系统的开发是一个漫长且复杂的过程,

文章中展示的代码是系统的基本操作原理,

并不是一个操作系统。

不是操作系统,不是操作系统!

学习目标

开始学习设计一个基本架构

文件系统设计

文件结构

struct File {
    string name;        // 文件名
    string content;     // 文件内容
    time_t created;     // 创建时间
    time_t modified;    // 修改时间
    size_t size;        // 文件大小
};

目录结构

struct Directory {
    string name;                        // 目录名
    map<string, File> files;            // 文件映射
    map<string, Directory> dirs;        // 子目录映射
    Directory* parent;                  // 父目录指针
    time_t created;                     // 创建时间
};

这个树状结构允许我们创建嵌套的目录和文件系统,类似于真实的文件系统。

核心系统架构

操作系统类

class ZON_OS {
private:
    Directory* current_dir;    // 当前目录指针
    Directory root;            // 根目录
    string system_date;        // 系统日期
    string system_time;        // 系统时间
    string version;            // 系统版本
    bool running;              // 运行状态
    Calculator calculator;     // 计算器实例

    // 辅助方法
    tm* safe_localtime(const time_t* time);
    void update_time();
    vector<string> split_args(const string& input);
    Directory* resolve_path(const string& path);

public:
    ZON_OS();
    void run();
    // 命令实现...
};

实现核心功能

1. 路径解析

Directory* ZON_OS::resolve_path(const string& path) {
    if (path.empty()) return current_dir;

    Directory* target = current_dir;
    vector<string> parts;
    stringstream ss(path);
    string part;

    // 分割路径
    while (getline(ss, part, '\\')) {
        if (part.empty()) continue;
        parts.push_back(part);
    }

    // 遍历路径组件
    for (const string& p : parts) {
        if (p == ".") continue;
        if (p == "..") {
            if (target->parent) target = target->parent;
            continue;
        }
        auto it = target->dirs.find(p);
        if (it != target->dirs.end()) {
            target = &it->second;
        } else {
            return nullptr; // 目录不存在
        }
    }
    return target;
}

2. 文件创建

void ZON_OS::cmd_create(const string& name) {
    if (name.empty()) {
        cout << "语法错误" << endl;
        return;
    }

    // 检查文件是否存在
    if (current_dir->files.find(name) != current_dir->files.end()) {
        cout << "文件已存在。是否覆盖? (Y/N): ";
        char choice;
        cin >> choice;
        cin.ignore();
        if (toupper(choice) != 'Y') return;
    }

    // 获取用户输入
    cout << "请输入文件内容 (空行结束):" << endl;
    string content, line;
    while (getline(cin, line) && !line.empty()) {
        content += line + "\n";
    }

    // 创建新文件
    File new_file(name);
    new_file.content = content;
    new_file.size = content.size();
    time(&new_file.modified);

    // 添加到当前目录
    current_dir->files[name] = new_file;
    cout << "文件已创建: " << name << " (" << content.size() << " 字节)" << endl;
}

3. 计算器实现

void Calculator::calculate(const string& expression) {
    try {
        double result = 0;

        // 处理平方根
        if (expression.find("sqrt") != string::npos) {
            size_t start = expression.find('(');
            size_t end = expression.find(')');
            if (start != string::npos && end != string::npos && start < end) {
                string num_str = expression.substr(start + 1, end - start - 1);
                double num = stod(num_str);
                if (num < 0) throw runtime_error("负数不能开平方");
                result = sqrt(num);
            }
        }
        // 处理幂运算
        else if (expression.find('^') != string::npos) {
            size_t pos = expression.find('^');
            double base = stod(expression.substr(0, pos));
            double exponent = stod(expression.substr(pos + 1));
            result = pow(base, exponent);
        }
        // 基本表达式
        else {
            result = evaluate_expression(expression);
        }

        cout << "结果: " << fixed << setprecision(4) << result << endl;
    } catch (const exception& e) {
        cout << "计算错误: " << e.what() << endl;
    }
}

构建分层帮助系统

帮助摘要

void ZON_OS::cmd_help_summary() {
    cout << "\nZON 操作系统 - 命令摘要\n";
    cout << "====================================================\n";
    cout << "输入 'HELP 命令名' 获取特定命令的详细帮助\n";
    cout << "例如: HELP DIR, HELP CREATE, HELP CALC\n";
    cout << "====================================================\n\n";

    cout << "基本命令:\n";
    cout << "  DIR       - 列出当前目录的内容\n";
    cout << "  CD        - 更改当前工作目录\n";
    // ... 其他命令摘要
}

详细命令帮助

void ZON_OS::cmd_help_detail(const string& command) {
    cout << "\n命令帮助: " << command << "\n";
    cout << "====================================================\n";

    if (command == "DIR") {
        cout << "功能: 列出当前目录的内容\n";
        cout << "语法: DIR\n";
        cout << "说明:\n";
        cout << "  - 显示当前目录中的所有文件和子目录\n";
        cout << "  - 每个条目显示创建/修改日期、时间和大小\n";
        cout << "示例:\n";
        cout << "  DIR\n";
    }
    // ... 其他命令的详细帮助
}

主循环实现

void ZON_OS::run() {
    cout << version << endl;
    cout << "输入 'HELP' 查看详细帮助信息\n" << endl;

    while (running) {
        update_time(); // 更新时间
        cout << "C:" << get_current_path() << "> ";

        string input;
        getline(cin, input);

        if (input.empty()) continue;

        vector<string> args = split_args(input);
        string command = args[0];
        transform(command.begin(), command.end(), command.begin(), ::toupper);

        // 命令分发
        if (command == "EXIT") {
            running = false;
        } else if (command == "HELP" || command == "/?") {
            if (args.size() > 1) {
                cmd_help_detail(args[1]);
            } else {
                cmd_help_summary();
            }
        } 
        // ... 其他命令处理
        else {
            cout << "无效命令。输入 'HELP' 查看可用命令。" << endl;
        }
    }
}

编译和运行

在Windows上编译

cl /EHsc zonos.cpp
zonos.exe

在Linux/macOS上编译

g++ -o zonos zonos.cpp
./zonos

使用示例

基本文件操作

C:\> MKDIR 文档
目录已创建: 文档

C:\> CD 文档
C:\文档> CREATE 笔记.txt
请输入文件内容 (空行结束):
这是ZON操作系统的笔记
第一行
第二行
(空行结束输入)
文件已创建: 笔记.txt (36 字节)

C:\文档> TYPE 笔记.txt

文件 笔记.txt 的内容:

这是ZON操作系统的笔记
第一行
第二行

C:\文档> DIR

 C:\文档 的目录

12-06-2025  18:30    <目录>         ..
12-06-2025  18:32         36  笔记.txt

        1 个文件
        1 个目录

计算器使用

C:\> CALC 5 + 3 * 2
结果: 11.0000

C:\> CALC sqrt(25)
结果: 5.0000

C:\> CALC 2^8
结果: 256.0000

帮助系统

C:\> HELP CD

命令帮助: CD
====================================================
功能: 更改当前工作目录
语法: CD [路径]
参数:
  路径 - 要切换到的目录路径(可选)
说明:
  - 如果不带参数使用,显示当前目录路径
  - 支持相对路径(如: .. 表示上级目录)
  - 支持绝对路径(如: \\系统\\工具)
示例:
  CD              - 显示当前目录
  CD ..           - 返回上级目录
  CD 文档         - 进入文档目录
====================================================

架构中的不足与反思

  1. 没有持久化存储:退出后文件会丢失。

  2. 没有用户系统:无法添加用户登录和权限管理。

  3. 没有进程管理:无法实现简单的任务调度。

  4. 没有网络功能:无法添加简单的网络命令。

你问我为什么没做?我太垃了还不会。

结语

通过本教程,你已经构建了一个功能齐全的操作系统模拟器。ZON OS 包含:

这个系统的完整代码我会放在末尾,以便学习研讨,你可以继续完善这个操作系统并且二次转发以便更多人学习。

代码:

#include <iostream>
#include <vector>
#include <map>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <cctype>
#include <ctime>
#include <iomanip>
#include <cstdlib>
#include <cmath>
#include <stdexcept>

using namespace std;

// 文件系统结构
struct File {
    string name;
    string content;
    time_t created;
    time_t modified;
    size_t size;

    File() : name(""), content(""), size(0) {
        time(&created);
        modified = created;
    }

    File(string n) : name(n), content(""), size(0) {
        time(&created);
        modified = created;
    }
};

// 目录结构
struct Directory {
    string name;
    map<string, File> files;
    map<string, Directory> dirs;
    Directory* parent;
    time_t created;

    Directory() : name(""), parent(nullptr) {
        time(&created);
    }

    Directory(string n, Directory* p = nullptr) : name(n), parent(p) {
        time(&created);
    }
};

// 计算器类
class Calculator {
private:
    // 计算表达式
    double evaluate_expression(const string& expr) {
        istringstream iss(expr);
        vector<double> numbers;
        vector<char> operators;
        double num;
        char op;

        if (!(iss >> num)) {
            throw invalid_argument("无效表达式");
        }
        numbers.push_back(num);

        while (iss >> op >> num) {
            // 处理乘除运算
            if (!operators.empty() && (operators.back() == '*' || operators.back() == '/')) {
                char last_op = operators.back();
                operators.pop_back();
                double last_num = numbers.back();
                numbers.pop_back();

                if (last_op == '*') {
                    numbers.push_back(last_num * num);
                } else if (last_op == '/') {
                    if (num == 0) throw runtime_error("除数不能为零");
                    numbers.push_back(last_num / num);
                }
            } else {
                operators.push_back(op);
                numbers.push_back(num);
            }
        }

        // 处理加减运算
        double result = numbers[0];
        for (size_t i = 0; i < operators.size(); i++) {
            if (operators[i] == '+') {
                result += numbers[i+1];
            } else if (operators[i] == '-') {
                result -= numbers[i+1];
            }
        }

        return result;
    }

public:
    // 计算命令
    void calculate(const string& expression) {
        try {
            double result = 0;

            // 处理特殊函数
            if (expression.find("sqrt") != string::npos) {
                size_t start = expression.find('(');
                size_t end = expression.find(')');
                if (start != string::npos && end != string::npos && start < end) {
                    string num_str = expression.substr(start + 1, end - start - 1);
                    double num = stod(num_str);
                    if (num < 0) throw runtime_error("负数不能开平方");
                    result = sqrt(num);
                } else {
                    throw invalid_argument("无效的平方根格式");
                }
            }
            // 处理幂运算
            else if (expression.find('^') != string::npos) {
                size_t pos = expression.find('^');
                double base = stod(expression.substr(0, pos));
                double exponent = stod(expression.substr(pos + 1));
                result = pow(base, exponent);
            }
            // 处理基本表达式
            else {
                result = evaluate_expression(expression);
            }

            cout << "结果: " << fixed << setprecision(4) << result << endl;
        } catch (const exception& e) {
            cout << "计算错误: " << e.what() << endl;
        }
    }
};

// 操作系统核心类
class ZON_OS {
private:
    Directory* current_dir;
    Directory root;
    string system_date;
    string system_time;
    string version;
    bool running;
    Calculator calculator;

    // 安全的时间转换函数
    tm* safe_localtime(const time_t* time) {
        static tm result;
#ifdef _WIN32
        localtime_s(&result, time);
#else
        result = *localtime(time);
#endif
        return &result;
    }

    // 更新系统时间
    void update_time() {
        time_t now = time(0);
        tm* ltm = safe_localtime(&now);
        stringstream date_ss, time_ss;
        date_ss << setfill('0') << setw(2) << ltm->tm_mday << "/"
                << setw(2) << 1 + ltm->tm_mon << "/" << 1900 + ltm->tm_year;
        time_ss << setfill('0') << setw(2) << ltm->tm_hour << ":"
                << setw(2) << ltm->tm_min << ":" << setw(2) << ltm->tm_sec;
        system_date = date_ss.str();
        system_time = time_ss.str();
    }

    // 分割命令参数
    vector<string> split_args(const string& input) {
        vector<string> args;
        stringstream ss(input);
        string arg;
        while (ss >> arg) {
            args.push_back(arg);
        }
        return args;
    }

    // 路径解析
    Directory* resolve_path(const string& path) {
        if (path.empty()) return current_dir;

        Directory* target = current_dir;
        vector<string> parts;
        stringstream ss(path);
        string part;

        while (getline(ss, part, '\\')) {
            if (part.empty()) continue;
            parts.push_back(part);
        }

        for (const string& p : parts) {
            if (p == ".") continue;
            if (p == "..") {
                if (target->parent) target = target->parent;
                continue;
            }
            auto it = target->dirs.find(p);
            if (it != target->dirs.end()) {
                target = &it->second;
            } else {
                return nullptr; // 目录不存在
            }
        }
        return target;
    }

public:
    ZON_OS() : root("C:", nullptr), running(true) {
        current_dir = &root;
        version = "ZON 操作系统 v1.0";
        update_time();

        // 创建初始目录结构
        root.dirs.insert({"系统", Directory("系统", &root)});
        root.dirs.insert({"用户", Directory("用户", &root)});
        root.dirs.insert({"程序", Directory("程序", &root)});
    }

    // 主循环
    void run() {
        cout << version << endl;
        cout << "输入 'HELP' 查看详细帮助信息\n" << endl;

        while (running) {
            update_time();
            cout << "C:" << get_current_path() << "> ";

            string input;
            getline(cin, input);

            if (input.empty()) continue;

            vector<string> args = split_args(input);
            string command = args[0];
            transform(command.begin(), command.end(), command.begin(), ::toupper);

            if (command == "EXIT") {
                running = false;
            } else if (command == "HELP" || command == "/?") {
                if (args.size() > 1) {
                    // 显示特定命令的帮助
                    string cmd_name = args[1];
                    transform(cmd_name.begin(), cmd_name.end(), cmd_name.begin(), ::toupper);
                    cmd_help_detail(cmd_name);
                } else {
                    // 显示所有命令的摘要
                    cmd_help_summary();
                }
            } else if (command == "DIR") {
                cmd_dir();
            } else if (command == "CD") {
                cmd_cd(args.size() > 1 ? args[1] : "");
            } else if (command == "MKDIR") {
                cmd_mkdir(args.size() > 1 ? args[1] : "");
            } else if (command == "CREATE") {
                cmd_create(args.size() > 1 ? args[1] : "");
            } else if (command == "TYPE") {
                cmd_type(args.size() > 1 ? args[1] : "");
            } else if (command == "DEL") {
                cmd_del(args.size() > 1 ? args[1] : "");
            } else if (command == "RMDIR") {
                cmd_rmdir(args.size() > 1 ? args[1] : "");
            } else if (command == "DATE") {
                cmd_date();
            } else if (command == "TIME") {
                cmd_time();
            } else if (command == "VER") {
                cmd_ver();
            } else if (command == "CLS") {
                cmd_cls();
            } else if (command == "CALC") {
                if (args.size() < 2) {
                    cmd_help_detail("CALC");
                } else {
                    string expr;
                    for (size_t i = 1; i < args.size(); i++) {
                        expr += args[i];
                        if (i < args.size() - 1) expr += " ";
                    }
                    calculator.calculate(expr);
                }
            } else {
                cout << "无效命令。输入 'HELP' 查看可用命令。" << endl;
            }
        }
    }

    // 获取当前路径
    string get_current_path() {
        vector<string> path_parts;
        Directory* dir = current_dir;

        while (dir && dir != &root) {
            path_parts.push_back(dir->name);
            dir = dir->parent;
        }

        reverse(path_parts.begin(), path_parts.end());
        string path = "\\";
        for (const string& part : path_parts) {
            path += part + "\\";
        }
        return path.substr(0, path.size() - 1);
    }

    // 命令帮助摘要
    void cmd_help_summary() {
        cout << "\nZON 操作系统 - 命令摘要\n";
        cout << "====================================================\n";
        cout << "输入 'HELP 命令名' 获取特定命令的详细帮助\n";
        cout << "例如: HELP DIR, HELP CREATE, HELP CALC\n";
        cout << "====================================================\n\n";

        cout << "基本命令:\n";
        cout << "  DIR       - 列出当前目录的内容\n";
        cout << "  CD        - 更改当前工作目录\n";
        cout << "  MKDIR     - 创建新目录\n";
        cout << "  CREATE    - 创建新文件\n";
        cout << "  TYPE      - 显示文本文件的内容\n";
        cout << "  DEL       - 删除文件\n";
        cout << "  RMDIR     - 删除空目录\n\n";

        cout << "系统命令:\n";
        cout << "  DATE      - 显示当前系统日期\n";
        cout << "  TIME      - 显示当前系统时间\n";
        cout << "  VER       - 显示操作系统版本\n";
        cout << "  CLS       - 清除屏幕内容\n";
        cout << "  EXIT      - 退出操作系统\n";
        cout << "  CALC      - 执行数学计算\n\n";

        cout << "文件系统说明:\n";
        cout << "  - 路径分隔符使用反斜杠 (\\)\n";
        cout << "  - 支持相对路径 (如: CD ..) 和绝对路径 (如: CD \\系统)\n";
        cout << "  - 目录名和文件名不区分大小写\n";
        cout << "  - 使用 CREATE 命令创建文件后,可以输入多行内容,以空行结束\n\n";

        cout << "计算器功能:\n";
        cout << "  支持基本运算: + - * /\n";
        cout << "  支持函数: sqrt(数字)\n";
        cout << "  支持幂运算: 底数^指数\n\n";

        cout << "示例用法:\n";
        cout << "  DIR               - 列出当前目录内容\n";
        cout << "  CD 用户           - 进入用户目录\n";
        cout << "  MKDIR 文档        - 创建文档目录\n";
        cout << "  CREATE 笔记.txt   - 创建笔记文件\n";
        cout << "  CALC 5 + 3 * 2    - 计算表达式\n";
        cout << "  HELP CD           - 显示CD命令详细帮助\n";
        cout << "====================================================\n";
    }

    // 详细命令帮助
    void cmd_help_detail(const string& command) {
        cout << "\n命令帮助: " << command << "\n";
        cout << "====================================================\n";

        if (command == "DIR") {
            cout << "功能: 列出当前目录的内容\n";
            cout << "语法: DIR\n";
            cout << "说明:\n";
            cout << "  - 显示当前目录中的所有文件和子目录\n";
            cout << "  - 每个条目显示创建/修改日期、时间和大小\n";
            cout << "  - <目录> 标记表示该项是目录\n";
            cout << "  - 最后显示文件和目录的总数\n";
            cout << "示例:\n";
            cout << "  DIR\n";
        }
        else if (command == "CD") {
            cout << "功能: 更改当前工作目录\n";
            cout << "语法: CD [路径]\n";
            cout << "参数:\n";
            cout << "  路径 - 要切换到的目录路径(可选)\n";
            cout << "说明:\n";
            cout << "  - 如果不带参数使用,显示当前目录路径\n";
            cout << "  - 支持相对路径(如: .. 表示上级目录)\n";
            cout << "  - 支持绝对路径(如: \\系统\\工具)\n";
            cout << "  - 路径中可以使用反斜杠 (\\) 作为分隔符\n";
            cout << "示例:\n";
            cout << "  CD              - 显示当前目录\n";
            cout << "  CD ..           - 返回上级目录\n";
            cout << "  CD 文档         - 进入文档目录\n";
            cout << "  CD \\系统\\工具   - 进入系统工具目录\n";
        }
        else if (command == "MKDIR") {
            cout << "功能: 创建新目录\n";
            cout << "语法: MKDIR 目录名\n";
            cout << "参数:\n";
            cout << "  目录名 - 要创建的新目录名称\n";
            cout << "说明:\n";
            cout << "  - 在当前目录下创建新目录\n";
            cout << "  - 目录名不能包含以下字符: \\ / : * ? \" < > |\n";
            cout << "  - 如果目录已存在,会显示错误信息\n";
            cout << "示例:\n";
            cout << "  MKDIR 文档      - 创建名为'文档'的目录\n";
            cout << "  MKDIR 项目\\代码 - 创建嵌套目录(需要先存在'项目'目录)\n";
        }
        else if (command == "CREATE") {
            cout << "功能: 创建新文件\n";
            cout << "语法: CREATE 文件名\n";
            cout << "参数:\n";
            cout << "  文件名 - 要创建的新文件名称\n";
            cout << "说明:\n";
            cout << "  - 在当前目录下创建新文件\n";
            cout << "  - 文件名可以包含扩展名(如: 笔记.txt)\n";
            cout << "  - 如果文件已存在,会提示是否覆盖\n";
            cout << "  - 输入文件内容时,以空行结束\n";
            cout << "  - 文件大小限制为可用内存大小\n";
            cout << "示例:\n";
            cout << "  CREATE 笔记.txt     - 创建文本文件\n";
            cout << "  CREATE config.cfg   - 创建配置文件\n";
        }
        else if (command == "TYPE") {
            cout << "功能: 显示文本文件的内容\n";
            cout << "语法: TYPE 文件名\n";
            cout << "参数:\n";
            cout << "  文件名 - 要显示内容的文件名称\n";
            cout << "说明:\n";
            cout << "  - 显示指定文本文件的内容\n";
            cout << "  - 文件必须在当前目录或指定路径中存在\n";
            cout << "  - 不支持二进制文件显示\n";
            cout << "示例:\n";
            cout << "  TYPE 笔记.txt      - 显示笔记文件内容\n";
            cout << "  TYPE \\系统\\配置.cfg - 显示系统配置文件\n";
        }
        else if (command == "DEL") {
            cout << "功能: 删除文件\n";
            cout << "语法: DEL 文件名\n";
            cout << "参数:\n";
            cout << "  文件名 - 要删除的文件名称\n";
            cout << "说明:\n";
            cout << "  - 删除指定的文件\n";
            cout << "  - 文件必须在当前目录或指定路径中存在\n";
            cout << "  - 删除操作不可逆,请谨慎使用\n";
            cout << "  - 不支持通配符(如: *.*)\n";
            cout << "示例:\n";
            cout << "  DEL 临时文件.tmp - 删除临时文件\n";
        }
        else if (command == "RMDIR") {
            cout << "功能: 删除空目录\n";
            cout << "语法: RMDIR 目录名\n";
            cout << "参数:\n";
            cout << "  目录名 - 要删除的目录名称\n";
            cout << "说明:\n";
            cout << "  - 删除指定的空目录\n";
            cout << "  - 目录必须为空(不含任何文件和子目录)\n";
            cout << "  - 如果目录非空,会显示错误信息\n";
            cout << "  - 删除操作不可逆\n";
            cout << "示例:\n";
            cout << "  RMDIR 临时目录 - 删除空目录\n";
        }
        else if (command == "DATE") {
            cout << "功能: 显示当前系统日期\n";
            cout << "语法: DATE\n";
            cout << "说明:\n";
            cout << "  - 显示当前系统日期(格式: 日/月/年)\n";
            cout << "  - 日期信息从系统时钟获取\n";
            cout << "示例:\n";
            cout << "  DATE\n";
        }
        else if (command == "TIME") {
            cout << "功能: 显示当前系统时间\n";
            cout << "语法: TIME\n";
            cout << "说明:\n";
            cout << "  - 显示当前系统时间(格式: 时:分:秒)\n";
            cout << "  - 时间信息从系统时钟获取\n";
            cout << "示例:\n";
            cout << "  TIME\n";
        }
        else if (command == "VER") {
            cout << "功能: 显示操作系统版本\n";
            cout << "语法: VER\n";
            cout << "说明:\n";
            cout << "  - 显示ZON操作系统的名称和版本号\n";
            cout << "  - 版本信息在系统启动时显示\n";
            cout << "示例:\n";
            cout << "  VER\n";
        }
        else if (command == "CLS") {
            cout << "功能: 清除屏幕内容\n";
            cout << "语法: CLS\n";
            cout << "说明:\n";
            cout << "  - 清除命令行界面的所有内容\n";
            cout << "  - 相当于清屏功能\n";
            cout << "  - 清除后只显示命令提示符\n";
            cout << "示例:\n";
            cout << "  CLS\n";
        }
        else if (command == "EXIT") {
            cout << "功能: 退出操作系统\n";
            cout << "语法: EXIT\n";
            cout << "说明:\n";
            cout << "  - 退出ZON操作系统\n";
            cout << "  - 所有未保存的数据将丢失\n";
            cout << "  - 返回操作系统宿主环境\n";
            cout << "示例:\n";
            cout << "  EXIT\n";
        }
        else if (command == "CALC") {
            cout << "功能: 执行数学计算\n";
            cout << "语法: CALC 表达式\n";
            cout << "参数:\n";
            cout << "  表达式 - 要计算的数学表达式\n";
            cout << "支持的运算:\n";
            cout << "  +      加法 (如: 5 + 3)\n";
            cout << "  -      减法 (如: 10 - 4)\n";
            cout << "  *      乘法 (如: 6 * 7)\n";
            cout << "  /      除法 (如: 20 / 5)\n";
            cout << "  ^      幂运算 (如: 2^8)\n";
            cout << "  sqrt() 平方根 (如: sqrt(16))\n";
            cout << "说明:\n";
            cout << "  - 表达式可以包含多个运算\n";
            cout << "  - 支持运算符优先级(乘除优先于加减)\n";
            cout << "  - 计算结果保留4位小数\n";
            cout << "  - 错误处理:除数为零、负数平方根等\n";
            cout << "示例:\n";
            cout << "  CALC 5 + 3 * 2\n";
            cout << "  CALC (10 + 5) / 3\n";
            cout << "  CALC sqrt(25)\n";
            cout << "  CALC 2^8\n";
        }
        else {
            cout << "未知命令: " << command << endl;
            cout << "使用 'HELP' 查看所有可用命令\n";
        }

        cout << "====================================================\n";
    }

    void cmd_dir() {
        cout << "\n C:" << get_current_path() << " 的目录\n" << endl;

        // 列出目录
        for (const auto& dir : current_dir->dirs) {
            tm* ltm = safe_localtime(&dir.second.created);
            cout << setfill('0') << setw(2) << ltm->tm_mday << "-"
                 << setw(2) << 1 + ltm->tm_mon << "-" << 1900 + ltm->tm_year << "  "
                 << setw(2) << ltm->tm_hour << ":" << setw(2) << ltm->tm_min << "    "
                 << "<目录>         " << dir.first << endl;
        }

        // 列出文件
        for (const auto& file : current_dir->files) {
            tm* ltm = safe_localtime(&file.second.modified);
            cout << setfill('0') << setw(2) << ltm->tm_mday << "-"
                 << setw(2) << 1 + ltm->tm_mon << "-" << 1900 + ltm->tm_year << "  "
                 << setw(2) << ltm->tm_hour << ":" << setw(2) << ltm->tm_min << "    "
                 << setw(10) << file.second.size << "  " << file.first << endl;
        }

        cout << "\n        " << current_dir->files.size() << " 个文件" << endl;
        cout << "        " << current_dir->dirs.size() << " 个目录\n" << endl;
    }

    void cmd_cd(const string& path) {
        if (path.empty()) {
            cout << "当前目录: C:" << get_current_path() << endl;
            return;
        }

        Directory* target = resolve_path(path);
        if (!target) {
            cout << "目录不存在: " << path << endl;
            return;
        }

        current_dir = target;
    }

    void cmd_mkdir(const string& name) {
        if (name.empty()) {
            cout << "语法错误" << endl;
            return;
        }

        if (current_dir->dirs.find(name) != current_dir->dirs.end()) {
            cout << "目录已存在" << endl;
            return;
        }

        current_dir->dirs.insert({name, Directory(name, current_dir)});
        cout << "目录已创建: " << name << endl;
    }

    void cmd_create(const string& name) {
        if (name.empty()) {
            cout << "语法错误" << endl;
            return;
        }

        if (current_dir->files.find(name) != current_dir->files.end()) {
            cout << "文件已存在。是否覆盖? (Y/N): ";
            char choice;
            cin >> choice;
            cin.ignore();
            if (toupper(choice) != 'Y') return;
        }

        cout << "请输入文件内容 (空行结束):" << endl;
        string content, line;
        while (getline(cin, line) && !line.empty()) {
            content += line + "\n";
        }

        File new_file(name);
        new_file.content = content;
        new_file.size = content.size();
        time(&new_file.modified);

        current_dir->files[name] = new_file;
        cout << "文件已创建: " << name << " (" << content.size() << " 字节)" << endl;
    }

    void cmd_type(const string& name) {
        if (name.empty()) {
            cout << "语法错误" << endl;
            return;
        }

        auto it = current_dir->files.find(name);
        if (it == current_dir->files.end()) {
            cout << "文件不存在: " << name << endl;
            return;
        }

        cout << "\n文件 " << name << " 的内容:\n" << endl;
        cout << it->second.content << endl;
    }

    void cmd_del(const string& name) {
        if (name.empty()) {
            cout << "语法错误" << endl;
            return;
        }

        auto it = current_dir->files.find(name);
        if (it == current_dir->files.end()) {
            cout << "文件不存在: " << name << endl;
            return;
        }

        current_dir->files.erase(it);
        cout << "文件已删除: " << name << endl;
    }

    void cmd_rmdir(const string& name) {
        if (name.empty()) {
            cout << "语法错误" << endl;
            return;
        }

        auto it = current_dir->dirs.find(name);
        if (it == current_dir->dirs.end()) {
            cout << "目录不存在: " << name << endl;
            return;
        }

        if (!it->second.files.empty() || !it->second.dirs.empty()) {
            cout << "目录非空" << endl;
            return;
        }

        current_dir->dirs.erase(it);
        cout << "目录已删除: " << name << endl;
    }

    void cmd_date() {
        cout << "当前日期: " << system_date << endl;
    }

    void cmd_time() {
        cout << "当前时间: " << system_time << endl;
    }

    void cmd_ver() {
        cout << version << endl;
    }

    void cmd_cls() {
#ifdef _WIN32
        system("cls");
#else
        system("clear");
#endif
    }
};

int main() {
    ZON_OS os;
    os.run();
    return 0;
}