2026/5/21 5:23:04
网站建设
项目流程
网站基本建设的原理,建设征信注册中心网站,网址你会感谢我的,济南三合一网站建设一、前言大家好#xff01;今天我们来系统梳理《计算机操作系统》第七章 “文件管理” 的核心知识点#xff0c;从基础概念到代码实现#xff0c;力求通俗易懂#xff0c;每个核心知识点都会搭配实战案例和架构图 / 流程图#xff0c;帮助大家彻底吃透文件管理的底层逻辑。…一、前言大家好今天我们来系统梳理《计算机操作系统》第七章 “文件管理” 的核心知识点从基础概念到代码实现力求通俗易懂每个核心知识点都会搭配实战案例和架构图 / 流程图帮助大家彻底吃透文件管理的底层逻辑。所有代码均采用C98 标准编写可直接编译运行注释详尽方便动手实操。二、核心知识点讲解7.1 文件和文件系统1. 核心概念文件是操作系统中存储信息的基本单位由一系列字符 / 字节组成具有唯一文件名存储在外部存储介质磁盘、U 盘等上。文件系统是操作系统中负责管理和存储文件信息的软件集合核心功能包括文件创建 / 删除、读写、目录管理、权限控制等。2. 架构图3. 实战案例模拟文件系统基础结构C98#include iostream #include string #include ctime using namespace std; // 遵循C98标准模拟文件的基本属性和操作 // 文件属性结构体对应文件系统中文件的元数据 struct FileAttribute { string fileName; // 文件名 int fileSize; // 文件大小字节 time_t createTime; // 创建时间 time_t modifyTime; // 修改时间 string fileType; // 文件类型文本/二进制等 }; // 文件系统基础类 class FileSystem { public: // 构造函数初始化文件系统 FileSystem() { cout 文件系统初始化完成 endl; } // 创建文件初始化文件属性 void createFile(const string name, const string type, int size) { FileAttribute file; file.fileName name; file.fileSize size; file.fileType type; // 获取当前时间作为创建/修改时间先赋值给变量再取地址 file.createTime time(NULL); file.modifyTime file.createTime; cout 文件创建成功 endl; cout 文件名 file.fileName endl; cout 文件大小 file.fileSize 字节 endl; cout 文件类型 file.fileType endl; cout 创建时间 ctime(file.createTime); } // 删除文件 void deleteFile(const string name) { cout 文件 name 删除成功 endl; } // 读取文件模拟 void readFile(const string name) { cout 正在读取文件 name endl; cout 文件内容模拟Hello, File System! endl; } // 写入文件模拟- 修复临时值取地址问题 void writeFile(const string name, const string content) { cout 向文件 name 写入内容 content endl; // 修复点先将time(NULL)的结果赋值给变量左值再取地址 time_t currentTime time(NULL); cout 文件修改时间更新为 ctime(currentTime); } }; // 主函数测试文件系统基础操作 int main() { // 创建文件系统实例 FileSystem fs; // 创建文本文件 fs.createFile(test.txt, 文本文件, 1024); // 读取文件 fs.readFile(test.txt); // 写入文件 fs.writeFile(test.txt, 这是测试文件的内容); // 删除文件 fs.deleteFile(test.txt); return 0; }4. 代码说明定义FileAttribute结构体模拟文件元数据文件名、大小、时间等对应文件系统中存储的文件属性FileSystem类封装文件系统核心操作创建、删除、读写符合 C98 语法规范主函数中完成完整的文件操作流程可直接编译运行g -stdc98 文件名.cpp -o 可执行文件。7.2 文件的逻辑结构1. 核心概念文件的逻辑结构是用户视角下文件的组织形式分为两类流式文件无结构由字符 / 字节流组成如.txt 文件记录式文件有结构由多条记录组成如数据库表、CSV 文件。2. 流程图3. 实战案例模拟流式文件和记录式文件C98#include iostream #include string #include vector #include iomanip using namespace std; // 遵循C98标准模拟两种文件逻辑结构 // 1. 流式文件类无结构字节流 class StreamFile { private: string fileName; string content; // 字节流形式存储内容 public: StreamFile(const string name) : fileName(name) {} // 写入字节流流式文件核心操作 void writeStream(const string data) { content data; // 直接追加无结构限制 cout 流式文件 fileName 写入成功当前内容长度 content.size() 字节 endl; } // 读取字节流 string readStream() { cout 读取流式文件 fileName 内容 endl; return content; } }; // 2. 记录式文件单条记录结构体 struct Record { int id; // 记录ID string name; // 姓名 int age; // 年龄 }; // 记录式文件类 class RecordFile { private: string fileName; vectorRecord records; // 按记录组织内容C98支持vector public: RecordFile(const string name) : fileName(name) {} // 添加记录记录式文件核心操作有固定结构 void addRecord(int id, const string name, int age) { Record r; r.id id; r.name name; r.age age; records.push_back(r); cout 记录式文件 fileName 添加记录成功当前记录数 records.size() endl; } // 读取指定记录 Record readRecord(int id) { for (vectorRecord::iterator it records.begin(); it ! records.end(); it) { // C98迭代器写法 if (it-id id) { cout 找到记录 ID id endl; return *it; } } cout 未找到记录 ID id endl; return Record(); // 返回空记录 } // 打印所有记录 void printAllRecords() { cout 记录式文件 fileName 所有记录 endl; cout setw(5) ID setw(10) 姓名 setw(5) 年龄 endl; for (vectorRecord::iterator it records.begin(); it ! records.end(); it) { cout setw(5) it-id setw(10) it-name setw(5) it-age endl; } } }; // 主函数测试两种文件逻辑结构 int main() { // 1. 测试流式文件 StreamFile sFile(stream.txt); sFile.writeStream(Hello, Stream File!); sFile.writeStream(这是流式文件的追加内容无结构限制。); cout sFile.readStream() endl endl; // 2. 测试记录式文件 RecordFile rFile(record.csv); rFile.addRecord(1, 张三, 20); rFile.addRecord(2, 李四, 22); rFile.printAllRecords(); Record r rFile.readRecord(1); cout 读取到的记录ID r.id 姓名 r.name 年龄 r.age endl; return 0; }4. 代码说明流式文件类StreamFile通过字符串直接存储字节流写入时无结构限制模拟.txt 等无结构文件记录式文件类RecordFile通过vector存储固定结构的Record结构体模拟 CSV / 数据库表等有结构文件全部采用 C98 语法如迭代器写法、无 C11 的 auto 关键字可直接编译运行。7.3 文件目录1. 核心概念文件目录文件夹是操作系统为管理文件而建立的索引结构核心作用是映射文件名和文件物理存储地址常见结构单级目录所有文件存于一个目录无层级两级目录分为用户目录和文件目录树形目录最常用多级层级结构如 Windows 的 C:\Users\XXX。2. 思维导图3. 实战案例模拟树形文件目录C98#include iostream #include string #include vector using namespace std; // 遵循C98标准模拟树形文件目录结构 // 目录节点类可包含文件或子目录 class DirNode { private: string name; // 目录/文件名 bool isDir; // 是否为目录true目录false文件 DirNode* parent; // 父目录指针 vectorDirNode* children; // 子节点文件/子目录 public: // 构造函数初始化节点 DirNode(const string name, bool isDir, DirNode* parent) : name(name), isDir(isDir), parent(parent) {} // 析构函数释放子节点内存C98手动管理内存 ~DirNode() { for (vectorDirNode*::iterator it children.begin(); it ! children.end(); it) { delete *it; } } // 添加子节点文件/子目录 void addChild(const string childName, bool isChildDir) { DirNode* child new DirNode(childName, isChildDir, this); children.push_back(child); cout (isChildDir ? 目录 : 文件) childName 创建成功 endl; } // 遍历当前目录下的所有节点 void listChildren() { cout 当前目录 name 下的内容 endl; for (vectorDirNode*::iterator it children.begin(); it ! children.end(); it) { cout ((*it)-isDir ? [目录] : [文件] ) (*it)-name endl; } } // 查找子节点返回指针用于进入子目录 DirNode* findChild(const string childName) { for (vectorDirNode*::iterator it children.begin(); it ! children.end(); it) { if ((*it)-name childName (*it)-isDir) { return *it; } } cout 未找到目录 childName endl; return NULL; } // 获取当前节点名称 string getName() { return name; } }; // 主函数模拟树形目录操作如Linux/macOS的cd、ls、mkdir、touch int main() { // 1. 创建根目录/ DirNode* root new DirNode(/, true, NULL); DirNode* currentDir root; // 当前工作目录 // 2. 在根目录创建子目录和文件 currentDir-addChild(home, true); // 创建home目录 currentDir-addChild(etc, true); // 创建etc目录 currentDir-addChild(readme.txt, false); // 创建readme.txt文件 currentDir-listChildren(); cout ------------------------ endl; // 3. 进入home目录 currentDir currentDir-findChild(home); cout 当前目录切换到 currentDir-getName() endl; // 4. 在home目录创建用户目录和文件 currentDir-addChild(user1, true); // 创建user1目录 currentDir-addChild(user2, true); // 创建user2目录 currentDir-addChild(profile.cfg, false); // 创建配置文件 currentDir-listChildren(); // 5. 释放内存 delete root; return 0; }4. 代码说明DirNode类模拟目录节点包含名称、类型目录 / 文件、父节点、子节点列表实现添加子节点、遍历目录、切换目录等核心操作模拟树形目录的层级管理手动管理内存析构函数释放子节点符合 C98 的内存管理规范。7.4 文件共享1. 核心概念文件共享是指多个用户 / 进程同时访问同一个文件常见实现方式基于索引节点i 节点多个目录项指向同一个 i 节点存储文件元数据符号链接软链接创建指向原文件的快捷方式硬链接多个文件名指向同一物理存储。2. 流程图3. 实战案例模拟文件共享C98#include iostream #include string #include map using namespace std; // 遵循C98标准模拟文件共享i节点硬链接软链接 // 模拟i节点存储文件元数据不存储文件名 struct INode { string fileData; // 文件实际内容 int linkCount; // 硬链接计数 string filePath; // 文件物理路径 }; // 文件共享管理器 class FileShareManager { private: mapint, INode inodeMap; // i节点表i节点ID→i节点 mapstring, int fileNameToInode;// 文件名→i节点ID硬链接 mapstring, string symLinkMap; // 软链接表链接名→原文件名 int nextInodeId; // 下一个可用i节点ID public: FileShareManager() : nextInodeId(1) {} // 创建文件初始化i节点 void createFile(const string fileName, const string data) { INode inode; inode.fileData data; inode.linkCount 1; inode.filePath /disk/ fileName; int inodeId nextInodeId; inodeMap[inodeId] inode; fileNameToInode[fileName] inodeId; cout 文件 fileName 创建成功i节点ID inodeId endl; } // 创建硬链接新增文件名→同一i节点 void createHardLink(const string linkName, const string origName) { if (fileNameToInode.find(origName) fileNameToInode.end()) { cout 原文件 origName 不存在 endl; return; } int inodeId fileNameToInode[origName]; fileNameToInode[linkName] inodeId; inodeMap[inodeId].linkCount; // 硬链接计数1 cout 硬链接 linkName 指向 origName 创建成功 endl; cout 当前i节点 inodeId 硬链接数 inodeMap[inodeId].linkCount endl; } // 创建软链接存储原文件路径不关联i节点 void createSymLink(const string linkName, const string origName) { if (fileNameToInode.find(origName) fileNameToInode.end()) { cout 原文件 origName 不存在 endl; return; } symLinkMap[linkName] origName; cout 软链接 linkName 指向 origName 创建成功 endl; } // 读取文件支持硬链接/软链接- 修复const参数修改问题 void readFile(const string fileName) { // 修复点创建临时变量存储文件名避免修改const参数 string actualFileName fileName; // 1. 先判断是否是软链接 if (symLinkMap.find(actualFileName) ! symLinkMap.end()) { string origName symLinkMap[actualFileName]; cout 软链接 actualFileName 指向原文件 origName endl; actualFileName origName; // 修改临时变量而非const参数 } // 2. 判断是否是硬链接/原文件 if (fileNameToInode.find(actualFileName) fileNameToInode.end()) { cout 文件 actualFileName 不存在 endl; return; } int inodeId fileNameToInode[actualFileName]; cout 读取文件 actualFileName i节点ID inodeId 内容 endl; cout inodeMap[inodeId].fileData endl; } // 删除文件硬链接计数为0时才真正删除i节点 void deleteFile(const string fileName) { if (fileNameToInode.find(fileName) fileNameToInode.end()) { cout 文件 fileName 不存在 endl; return; } int inodeId fileNameToInode[fileName]; fileNameToInode.erase(fileName); // 删除文件名映射 inodeMap[inodeId].linkCount--; // 硬链接计数-1 cout 文件 fileName 已删除当前i节点 inodeId 硬链接数 inodeMap[inodeId].linkCount endl; // 硬链接计数为0删除i节点 if (inodeMap[inodeId].linkCount 0) { inodeMap.erase(inodeId); cout i节点 inodeId 已释放 endl; } } }; // 主函数测试文件共享 int main() { FileShareManager fsm; // 1. 创建原文件 fsm.createFile(data.txt, 这是共享文件的内容); // 2. 创建硬链接 fsm.createHardLink(data_hardlink.txt, data.txt); // 3. 创建软链接 fsm.createSymLink(data_symlink.txt, data.txt); // 4. 读取硬链接/软链接 cout ------------------------ endl; fsm.readFile(data_hardlink.txt); cout ------------------------ endl; fsm.readFile(data_symlink.txt); // 5. 删除原文件硬链接仍可用 cout ------------------------ endl; fsm.deleteFile(data.txt); fsm.readFile(data_hardlink.txt); // 硬链接仍可读取 // 6. 删除硬链接i节点释放 cout ------------------------ endl; fsm.deleteFile(data_hardlink.txt); // 7. 软链接失效 cout ------------------------ endl; fsm.readFile(data_symlink.txt); return 0; }4. 代码说明用INode结构体模拟 i 节点存储文件实际内容和硬链接计数硬链接多个文件名映射到同一 i 节点 ID计数 0 时文件不真正删除软链接单独存储链接名→原文件名原文件删除则链接失效全部操作符合 C98 标准模拟 Linux 系统的文件共享逻辑。7.5 文件保护1. 核心概念文件保护是防止文件被未授权访问 / 修改常见方式访问控制列表ACL为每个文件指定用户 / 组的访问权限读 R、写 W、执行 X口令保护访问文件需输入口令加密保护文件内容加密存储只有解密后才能访问。2. 架构图3. 实战案例模拟文件权限保护C98#include iostream #include string #include map using namespace std; // 遵循C98标准模拟文件访问权限保护ACL // 用户类型枚举C98支持enum enum UserType { OWNER, // 文件所有者 GROUP, // 同组用户 OTHER // 其他用户 }; // 文件权限结构体 struct FilePermission { bool read; // 读权限 bool write; // 写权限 bool exec; // 执行权限 // C98兼容添加默认构造函数避免初始化问题 FilePermission() : read(false), write(false), exec(false) {} // 带参数的构造函数方便初始化 FilePermission(bool r, bool w, bool e) : read(r), write(w), exec(e) {} }; // 文件保护管理器 class FileProtectManager { private: // 修复点1C98要求嵌套模板的必须分开写为 mapstring, mapUserType, FilePermission permMap; // 用户-文件所有者映射 mapstring, string userFileOwnerMap; // 模拟用户口令 mapstring, string userPwdMap; public: // 初始化添加测试用户和口令 FileProtectManager() { userPwdMap[user1] 123456; // 文件所有者 userPwdMap[user2] 654321; // 同组用户 userPwdMap[user3] 000000; // 其他用户 } // 创建文件并设置权限所有者默认拥有全部权限 void createFileWithPerm(const string fileName, const string owner) { // 记录文件所有者 userFileOwnerMap[fileName] owner; // 设置所有者权限R/W/X- 使用C98的构造函数初始化 FilePermission ownerPerm(true, true, true); // 设置同组用户权限R/X FilePermission groupPerm(true, false, true); // 设置其他用户权限仅R FilePermission otherPerm(true, false, false); permMap[fileName][OWNER] ownerPerm; permMap[fileName][GROUP] groupPerm; permMap[fileName][OTHER] otherPerm; cout 文件 fileName 创建成功 endl; cout 所有者 owner endl; cout 权限设置 endl; cout 所有者读(R)是写(W)是执行(X)是 endl; cout 同组用户读(R)是写(W)否执行(X)是 endl; cout 其他用户读(R)是写(W)否执行(X)否 endl; } // 用户登录验证 bool userLogin(const string userName, const string pwd) { if (userPwdMap.find(userName) userPwdMap.end()) { cout 用户 userName 不存在 endl; return false; } if (userPwdMap[userName] ! pwd) { cout 口令错误 endl; return false; } cout 用户 userName 登录成功 endl; return true; } // 判断用户对文件的权限 FilePermission checkPerm(const string userName, const string fileName) { if (permMap.find(fileName) permMap.end()) { cout 文件 fileName 不存在 endl; // 修复点2使用C98的构造函数返回空权限而非列表初始化 return FilePermission(false, false, false); } // 判断用户类型 string owner userFileOwnerMap[fileName]; UserType ut; if (userName owner) { ut OWNER; } else if (userName user2) { // 模拟同组用户 ut GROUP; } else { ut OTHER; } cout 用户 userName 对文件 fileName 的权限类型 (ut OWNER ? 所有者 : (ut GROUP ? 同组用户 : 其他用户)) endl; return permMap[fileName][ut]; } // 执行文件操作检查权限 void doFileOperation(const string userName, const string fileName, const string op) { FilePermission perm checkPerm(userName, fileName); bool allowed false; if (op read perm.read) { allowed true; } else if (op write perm.write) { allowed true; } else if (op exec perm.exec) { allowed true; } if (allowed) { cout 允许执行 op 操作 endl; } else { cout 拒绝执行 op 操作权限不足 endl; } } }; // 主函数测试文件保护 int main() { FileProtectManager fpm; // 1. 创建文件指定所有者为user1 fpm.createFileWithPerm(app.exe, user1); cout ------------------------ endl; // 2. 用户1登录测试所有操作 if (fpm.userLogin(user1, 123456)) { fpm.doFileOperation(user1, app.exe, read); fpm.doFileOperation(user1, app.exe, write); fpm.doFileOperation(user1, app.exe, exec); } cout ------------------------ endl; // 3. 用户2同组登录测试操作 if (fpm.userLogin(user2, 654321)) { fpm.doFileOperation(user2, app.exe, read); fpm.doFileOperation(user2, app.exe, write); // 无写权限 fpm.doFileOperation(user2, app.exe, exec); } cout ------------------------ endl; // 4. 用户3其他登录测试操作 if (fpm.userLogin(user3, 000000)) { fpm.doFileOperation(user3, app.exe, read); fpm.doFileOperation(user3, app.exe, write); // 无写权限 fpm.doFileOperation(user3, app.exe, exec); // 无执行权限 } return 0; }4. 代码说明用UserType枚举区分用户类型所有者 / 同组 / 其他FilePermission存储 R/W/X 权限FileProtectManager实现用户登录、权限检查、操作鉴权核心逻辑模拟不同用户的权限差异符合操作系统中文件权限管理的核心思想。三、习题基础题简述文件的逻辑结构分类及各自特点结合 7.2 的代码说明流式文件和记录式文件的实现差异。解释硬链接和软链接的区别结合 7.4 的代码说明为何硬链接删除原文件后仍可访问而软链接不行。操作系统中文件目录的核心作用是什么树形目录相比单级目录有哪些优势编程题基于 7.5 的文件保护代码扩展功能添加 “修改文件权限” 的函数允许文件所有者修改同组 / 其他用户的 R/W/X 权限增加 “用户组管理” 功能支持将用户加入 / 移出指定组动态判断用户权限类型。四、代码运行说明编译命令确保编译器支持 C98g -stdc98 文件名.cpp -o 可执行文件名运行命令./可执行文件名 # Linux/macOS # 或 可执行文件名.exe # Windows所有代码无第三方依赖仅依赖 C98 标准库可直接编译运行。总结文件管理核心包括文件 / 文件系统基础、逻辑结构、目录管理、共享、保护五大模块每个模块均对应操作系统的核心功能实战代码基于 C98 标准实现模拟了各模块的核心逻辑如树形目录、i 节点共享、ACL 权限控制可直接编译运行各知识点配套架构图 / 流程图Mermaid 格式可直接复制到 Mermaid 编辑器生成可视化图形辅助理解概念。