学习一个系统的基本操作原理
前言(防杠贴士)
系统的开发是一个漫长且复杂的过程,
文章中展示的代码是系统的基本操作原理,
并不是一个操作系统。
不是操作系统,不是操作系统!
学习目标
-
如何设计文件系统数据结构。
-
实现命令行界面(CLI)交互。
-
创建分层帮助系统。
-
构建内置计算器。
-
处理路径解析和错误处理。
开始学习设计一个基本架构
文件系统设计
文件结构
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 文档 - 进入文档目录
====================================================
架构中的不足与反思
-
没有持久化存储:退出后文件会丢失。
-
没有用户系统:无法添加用户登录和权限管理。
-
没有进程管理:无法实现简单的任务调度。
-
没有网络功能:无法添加简单的网络命令。
你问我为什么没做?我太垃了还不会。
结语
通过本教程,你已经构建了一个功能齐全的操作系统模拟器。ZON OS 包含:
- 完整的文件系统(目录和文件管理)。
- 丰富的系统命令(DIR, CD, MKDIR等)。
- 强大的计算器功能(CALC)。
- 详尽的帮助系统(HELP)。
这个系统的完整代码我会放在末尾,以便学习研讨,你可以继续完善这个操作系统并且二次转发以便更多人学习。
代码:
#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;
}