设计实现一个模拟文件系统。包括文件目录管理、存储空间管理、文件创建、删除、读、写等基本操作功能。测试环境 DEVc++


#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include <iomanip>
using namespace std;const int mem_maxsize = 8 * 1024; // 8M最大内存空间
const int block_size = 512; // 盘块大小// 文件结构
typedef struct file
{string name; // 文件名int size; // 文件大小int start_bid; // 首盘块号file* next; // 同一目录下一文件
};// 文件夹结构
typedef struct folder
{string name; // 目录名folder* par_folder; // 父目录folder* sub_folder; // 子目录folder* next; // 兄弟目录file* sub_file; // 子文件
};// 盘块结构
typedef struct free_block {int block_id; // 盘块号int start_add; // 开始地址int mem_size; // 内存大小int remain_mem_size; // 剩余空间int state; // 是否被占用free_block* next; // 下一空闲盘块
};folder* home; // 根目录
folder* cur_catalog; // 当前目录
free_block* fb_arr[mem_maxsize / block_size + 1]; // 盘块指针数组// 初始化内存空间
void init_mem_system() {int bid = 0;for (int i = 0; i < mem_maxsize; i += 512) {free_block* fbt = new free_block;fbt->block_id = bid;fbt->start_add = i;fbt->mem_size = 512;fbt->remain_mem_size = 512;fbt->state = 0;fbt->next = NULL;fb_arr[bid] = fbt;bid++;}fb_arr[bid] = NULL;
}// 初始化文件系统
folder* init_file_system() {folder* home = new folder;home->name = "home";home->par_folder = NULL;home->sub_file = NULL;home->sub_folder = NULL;cur_catalog = home;return home;
}// 显示内存空间
void show_mem() {string str = "";cout << str.assign(14, '#') << " MEM " << str << endl;cout << setw(8) << "盘块号" << setw(10) << "是否分配" << setw(10) << "内存大小"<< setw(14) << "剩内存大小" << endl;free_block** fbt = fb_arr;for (; *fbt; fbt++) {cout << setw(8) << (*fbt)->block_id << setw(10) << (*fbt)->state << setw(10) << (*fbt)->mem_size<< setw(14) << (*fbt)->remain_mem_size << endl;}cout << endl;
}// 显示当前目录
void show_catalog() {string str = "";cout << str.assign(14, '#') << " FOLDER " << str << endl;folder* fdt = cur_catalog->sub_folder;for (; fdt; fdt = fdt->next) {cout << str.assign(18 - fdt->name.size() / 2, ' ')<< fdt->name << str << endl;}cout << endl;cout << str.assign(15, '#') << " FIlE " << str << endl;file* ft = cur_catalog->sub_file;for (; ft; ft = ft->next) {cout << str.assign(18 - ft->name.size() / 2, ' ')<< ft->name << str << endl;}cout << endl;
}// 判断文件夹是否存在
bool is_folder_exist(string name) {folder* fdt = cur_catalog->sub_folder;for (; fdt; fdt = fdt->next) {if (fdt->name == name) {return true;}}return false;
}// 判断文件是否存在
bool is_file_exist(string name) {file* ft = cur_catalog->sub_file;for (; ft; ft = ft->next) {if (ft->name == name) {return true;}}return false;
}
// 创建目录
int create_folder() {cout << "##请输入文件夹名称##" << endl;string name;cin >> name;if (is_folder_exist(name)) {return -1;}folder* fdt = new folder;fdt->name = name;fdt->par_folder = cur_catalog;fdt->sub_folder = NULL;fdt->sub_file = NULL;fdt->next = NULL;if (cur_catalog->sub_folder == NULL) {cur_catalog->sub_folder = fdt;}else {folder* fd = cur_catalog->sub_folder;for (; fd->next; fd = fd->next);fd->next = fdt;}cout << "##文件夹创建成功!##" << endl << endl;return 0;
}
// 释放空间
int free_mem(file* f) {free_block* fb = fb_arr[f->start_bid];for (; fb; ) {fb->state = 0;fb->remain_mem_size = fb->mem_size;free_block* t = fb;fb = fb->next;t->next = NULL;}return 0;
}
// 递归删除当前目录的所有文件和子目录
void delete_sub_folder(folder* fd) {if (fd == NULL) {return;}file* f = fd->sub_file;for (; f; ) {file* ft = f;f = f->next;free_mem(ft);delete(ft);}folder* fdt = fd->sub_folder;for (; fdt;) {delete_sub_folder(fdt);folder* t = fdt;fdt = fdt->next;delete(t);}delete(fd);
}// 删除目录
int delete_folder() {cout << "##请输入文件夹的名称##" << endl;string name;cin >> name;if (!is_folder_exist(name)) {cout << "##文件夹不存在!##" << endl << endl;return -1;}folder* fdt = cur_catalog->sub_folder;if (cur_catalog->sub_folder->name == name) {cur_catalog->sub_folder = cur_catalog->sub_folder->next;delete_sub_folder(fdt);}else {for (; fdt->next->name != name; fdt = fdt->next);folder* t = fdt->next;fdt->next = fdt->next->next;delete_sub_folder(t);}cout << "##文件夹删除成功!##" << endl << endl;
}// 打开目录
int open_folder() {cout << "##请输入文件夹名称##" << endl;string name;cin >> name;if (!is_folder_exist(name)) {cout << "##文件夹不存在!##" << endl << endl;return -1;}folder* fdt = cur_catalog->sub_folder;for (; fdt->name != name; fdt = fdt->next);cur_catalog = fdt;
}// 分配内存
int allot_mem(file* f) {int start_block_id = 0;int file_size = f->size;free_block* fb = NULL;free_block** fbt = fb_arr;for (; *fbt; fbt++) {if ((*fbt)->state == 0) {if ((*fbt)->mem_size >= f->size) {(*fbt)->state = 1;(*fbt)->remain_mem_size -= f->size;return (*fbt)->block_id;}else {if (file_size == f->size) {start_block_id = (*fbt)->block_id;file_size -= (*fbt)->mem_size;(*fbt)->remain_mem_size = 0;(*fbt)->state = 1;fb = (*fbt);}else {if ((*fbt)->mem_size >= file_size) {(*fbt)->remain_mem_size -= file_size;(*fbt)->state = 1;fb->next = (*fbt);fb = fb->next;return start_block_id;}else {(*fbt)->remain_mem_size = 0;(*fbt)->state = 1;fb->next = (*fbt);fb = fb->next;file_size -= (*fbt)->mem_size;}}}}}return -1;
}// 创建文件
int create_file() {cout << "##请输入文件名称和大小##" << endl;string name;int size;cin >> name >> size;if (is_file_exist(name)) {return -1;}file* ft = new file;ft->name = name;ft->size = size;ft->next = NULL;if ((ft->start_bid = allot_mem(ft)) != -1) {if (cur_catalog->sub_file == NULL) {cur_catalog->sub_file = ft;}else {file* f = cur_catalog->sub_file;for (; f->next; f = f->next);f->next = ft;}}else {cout << "##内存空间不足,创建文件失败!##" << endl << endl;}cout << "##文件创建成功!##" << endl << endl;return 0;
}// 删除文件
int delete_file() {cout << "##请输入文件名称##" << endl;string name;cin >> name;if (!is_file_exist(name)) {cout << "##文件不存在!##" << endl << endl;return -1;}file* f;file* ft = cur_catalog->sub_file;if (cur_catalog->sub_file->name == name) {f = ft;cur_catalog->sub_file = cur_catalog->sub_file->next;}else {for (; ft->next->name != name; ft = ft->next);f = ft->next;ft->next = ft->next->next;}free_mem(f);delete(f);cout << "##文件删除成功!##" << endl << endl;
}// 读取文件
int read_file() {cout << "##请输入文件名称##" << endl;string name;cin >> name;if (is_file_exist(name)) {file* ft = cur_catalog->sub_file;//在当前目录下找到文件 for (; ft; ft = ft->next) {if (ft->name == name) {     //如果名字查到 退出 break;}}free_block* fbt = fb_arr[ft->start_bid]; //空闲的磁盘号产给他//cout << "##";cout<<"当前所在的磁盘号为:"; while (fbt){cout << fbt->block_id;//找到当前磁盘号id if (fbt->next) {cout << "-";}fbt = fbt->next;//传到下一个结点 }cout << """""" << endl;}else {cout << "##  文件不存在! ##" << endl;}return 0;
}// 追加写入
int write_file() {cout << "##请输入文件名称和写入长度##" << endl;string name;int len;cin >> name >> len;if (is_file_exist(name)) {file* ft = cur_catalog->sub_file;  //转到当前目录下 for (; ft; ft = ft->next) {       // 查看是否有这个文件 if (ft->name == name) {break;}}free_block* fbt = fb_arr[ft->start_bid]; //空闲盘块写入 for (; fbt->next; fbt = fbt->next);if (len <= fbt->remain_mem_size) {      //比较剩余空间 fbt->remain_mem_size -= len;        //剩余空间减少 }else {                                 //创建新文件 file* t = new file;t->size = len;t->size -= fbt->remain_mem_size;fbt->remain_mem_size = 0;int sub_bid;if ((sub_bid = allot_mem(t)) != -1){fbt->next = fb_arr[sub_bid];  //}delete(t);}}return 0;
}// 返回上一目录
int return_last_catalog() {if (cur_catalog == home) {cout << "##已是根目录##" << endl << endl;}cur_catalog = cur_catalog->par_folder;return 0;
}int main() {init_mem_system();home = init_file_system();int cmd;while (true){show_catalog();cout << setw(14) << "#1创建文件夹 " << setw(14) << "#2删除文件夹"<< setw(14) << "#3打开文件夹" << setw(12) << "#4创建文件"<< setw(12) << "#5删除文件" << setw(12) << "#6读取文件"<< setw(12) << "#7写入文件" << setw(14) << "#8返回上一层" << setw(16) << "#9查看磁盘空间" << endl;cin >> cmd;switch (cmd){case 1:create_folder();break;case 2:delete_folder();break;case 3:open_folder();break;case 4:create_file();break;case 5:delete_file();break;case 6:read_file();break;case 7:write_file();break;case 8:return_last_catalog();break;case 9:show_mem();break;default:break;}}
}

文件创建部分
先创建文件夹,在文件夹中创建文件,设置好名字和文件大小,创建多个文件在不同的磁盘中,
读部分
读写文件时输入增加的内存大小,读取文件时输出磁盘的编号,删除文件,所在的磁盘内存恢复
测试如下:
创建文件夹 命名为001
然后打开文件夹后 创建文件1 和2 内存大小为128kb(自己设计大小 不易过大)
可以读取文件 1和2 文件1的磁盘号 查看磁盘内存 磁盘0和磁盘1的内存减少了相应的内存 128kb
写入文件1 内存1024kb 查看磁盘号为0-2-3 用内存代替输入的内容
删除部分
删除文件2 文件夹中文件2消失

操作系统实验:文件管理 C语言相关推荐

  1. 操作系统实验文件管理_系统设计硬核知识(5)——操作系统的文件管理

    操作系统对计算机的管理包括两个方面:硬件资源和软件资源.硬件资源的管理包括CPU 的管理.存储器的管理.设备管理等,主要解决硬件资源的有效和合理利用问题. 软件资源包括各种系统程序.各种应用程序.各种 ...

  2. 操作系统实验:虚拟存储器 (C语言实现) 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。

    一实验内容: 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺 页中断. 二.实验题目: 模拟分页式存储管理中硬件的地址转换和产生缺页中断. 用先进先出(FIFO)页面调度 ...

  3. 处理机调度实验c语言,操作系统实验处理机调度C语言实现

    操作系统实验处理机调度C语言实现 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...

  4. c语言处理机调度实验报告,操作系统实验处理机调度C语言实现.docx

    操作系统实验处理机调度C语言实现.docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. ...

  5. 计算机操作系统实验之进程调度(一)轮转调度法(C语言)

    计算机操作系统实验之进程调度(一)轮转调度法(C语言) 实验目的 实验内容与基本要求 轮转调度法的基本原理 实现思路及功能分析 算法流程图 全部代码 工程图 ProcessScheduling.h P ...

  6. java 动态分区 链表_大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理...

    实验:动态分区式存储管理 实验内容: 编写程序模拟完成动态分区存储管理方式的内存分配和回收.实验具体包括:首先确定内存空闲分配表:然后采用最佳适应算法完成内存空间的分配和回收:最后编写主函数对所做工作 ...

  7. 南京邮电大学c语言实验报告3v2,南京邮电大学操作系统实验报告

    <南京邮电大学操作系统实验报告>由会员分享,可在线阅读,更多相关<南京邮电大学操作系统实验报告(20页珍藏版)>请在人人文库网上搜索. 1.通信与信息工程学院2015 / 20 ...

  8. C语言 操作系统实验 四种调度(最高响应比优先算法 HRN)

    注: 本文是四个调度算法的第一篇算法. 本文是根据CSDN上某一FCFS调度算法魔改来的,所以FCFS的算法不会发到网站. 我是个菜鸡,发文是为了纪念自己完成了代码,以及累计自己的经验. 如有知识错误 ...

  9. 生产者消费者操作系统实验报告用C语言来实现

    #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h& ...

  10. 进程同步c语言实验报告,操作系统实验报告实验3-1

    操作系统实验报告 操作系统实验报告 实验3-1: Linux进程的创建与父子进程同步 1. 实验目的 (1)熟悉在C语言源程序中使用Linux所提供的系统调用界面的方法: (2)掌握Linux中进程的 ...

最新文章

  1. ubuntu下matplotlib 升级
  2. 326. Power of Three
  3. spring api 中文_Spring高级技术梳理
  4. 通信工程施工图案例分析
  5. 论文浅尝 | 基于对抗学习的弱监督知识图谱对齐
  6. 有关《8zsb》的一些介绍
  7. Luogu P1164小A点菜
  8. Android OkHttp经验小结
  9. Oracle数据库常用sql语句
  10. 解决MarkDown上传本地图片无法显示
  11. 基于ng-alain做国际化
  12. tws耳机哪个牌子音质好?tws耳机音质排行榜
  13. 基于单片机的频率测量控制系统设计 (频率计)(电路+程序)
  14. 【Yolo】Jetson Orin Nano下部署 YoloV5
  15. 七夕节·烈火英雄·观后感
  16. Euler Finance 完成 3200 万美元融资 Haun Ventures 领投
  17. mmdetection里的image_demo
  18. 如何理解矩阵的乘法?
  19. 利用Matlab从图片中获取凸多边形的内角角度
  20. C语言典型代码---SSDP设备发现

热门文章

  1. 企业网管与网吧网管的区别!
  2. 中国56个少数民族服饰图片及介绍,超级大全了
  3. 干货系列五!Linux 运维必备的100条命令总结
  4. 法拉第未来出售其洛杉矶总部 以弥补资金不足
  5. NextCloud目录同步及onlyoffice在线协作配置
  6. deepin(深度)系统字体文件位置
  7. day11 - 手写数字笔迹细化
  8. ASEMI常见整流桥KBP210、MB6S、2W10、DB107参数展示
  9. Spark Executor内存管理
  10. Bokeh,一个超强交互式 Python 可视化库!