{"id":28477046,"url":"https://github.com/carmjos/filesys","last_synced_at":"2025-07-02T17:31:53.318Z","repository":{"id":296327147,"uuid":"992989220","full_name":"CarmJos/filesys","owner":"CarmJos","description":"简易的文件系统。功能包括磁盘初始化、新建文件、删除文件、更新文件、查找文件、文件统计、磁盘统计、分配策略选择、磁盘整理。基于C语言实现。","archived":false,"fork":false,"pushed_at":"2025-05-31T22:14:48.000Z","size":327,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-06-07T15:48:46.039Z","etag":null,"topics":["c","console","file","filesystem","simulation"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CarmJos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-30T03:09:29.000Z","updated_at":"2025-05-31T22:14:51.000Z","dependencies_parsed_at":"2025-05-30T04:41:37.058Z","dependency_job_id":null,"html_url":"https://github.com/CarmJos/filesys","commit_stats":null,"previous_names":["carmjos/filesys"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/CarmJos/filesys","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarmJos%2Ffilesys","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarmJos%2Ffilesys/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarmJos%2Ffilesys/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarmJos%2Ffilesys/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CarmJos","download_url":"https://codeload.github.com/CarmJos/filesys/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarmJos%2Ffilesys/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263184550,"owners_count":23427039,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","console","file","filesystem","simulation"],"created_at":"2025-06-07T15:40:25.207Z","updated_at":"2025-07-02T17:31:53.299Z","avatar_url":"https://github.com/CarmJos.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 简易文件系统模拟\n\n\u003cimg src=\"logo.png\" width=\"120px\"  height=\"120px\" alt=\"Project logo\" align=\"right\"\u003e\n\n![CodeSize](https://img.shields.io/github/languages/code-size/CarmJos/filesys)\n\n编码实现简易的文件系统，功能包括磁盘初始化、新建文件、删除文件、更新文件、查找文件、文件统计、磁盘统计、分配策略选择。\n\n\u003e 本项目系 [《操作系统》]() 课程设计的实践项目，旨在帮助理解文件系统的基本原理和实现方式。\n\n## 需求\n\n1. 磁盘空间的模拟: 通过二维数组`fileData [x][x]`模拟磁盘空间。\n2. 分配算法: 连续分配法，在fileData内为文件分配连续的空闲存储空间。\n3. 文件系统功能\n    1. **磁盘初始化**：初始化相关数据结构，完成磁盘的初始化（若磁盘已存储信息，相当于格式化磁盘）\n    2. **新建文件**：输入文件名和文件内容，创建文件（文件不允许重名）\n    3. **删除文件**：输入文件名，删除文件（若没有找到，给出适当提示）\n    4. **更新文件**：输入文件名，找到该文件并显示内容，然后重新输入内容保存到该文件（若没有找到，给出适当提示）\n    5. **查找文件**：输入文件名，显示文件内容（若没有找到，给出适当提示）\n    6. **文件统计**：按文件大小，从大到小按行显示所有文件（文件名+文件大小+文件内容）\n    7. **磁盘统计**：打印磁盘存储情况（格式化打印数组fileData，空闲元素打印'-'）\n    8. **分配策略**：最先适配、最佳适配、最坏适配（默认为最先适配）\n\n## 操作\n\n```shell\nDISK SIMULATION console (types 'exit' to quit)\n\nconsole \u003e\n```\n\n在控制台中，提供基于指令的操作。\n\n```shell\n# 查看帮助信息\nhelp\n\n# 以给定的行数和列数初始化磁盘空间。\ninit \u003crows\u003e \u003ccols\u003e\n\n#  修改磁盘分配策略\nmode \u003cstrategy, 0=first, 1=best, 2=worst\u003e\n\n# 写入文件内容到磁盘\nw \u003cfile\u003e [new_content...]\n\n# 从磁盘中删除文件\nrm \u003cfile\u003e\n\n# 查看文件内容\ncat \u003cfile\u003e\n\n# 列出当前磁盘中的所有文件\nls\n\n# 执行磁盘整理 （额外功能）\ndefragment\n```\n## 实现逻辑\n\n### 指令系统（`commands.c/h`）\n\n1. **命令注册机制**\n    - 使用 `Command` 结构体存储命令信息（名称、用法、描述和执行函数）\n    - 通过 `register_command` 函数注册新命令\n    - 支持最多 32 个命令（MAX_COMMANDS）\n\n2. **命令解析器**\n    - `parse_args` 函数负责将输入字符串解析为参数数组\n    - 支持空格和制表符作为分隔符\n    - 每条命令最多支持 16 个参数（MAX_ARGS）\n\n3. **控制台运行器**\n    - `console_run` 函数提供交互式命令行界面\n    - 支持命令历史记录和退出功能\n    - 内置帮助系统，显示所有可用命令\n\n### 文件系统（`file_system.c/h`）\n\n1. **存储结构**\n    - 使用二维字符数组模拟磁盘存储空间\n    - 支持动态大小的磁盘空间（通过 rows 和 cols 指定）\n    - 文件元数据存储在独立的数组中\n\n2. **文件管理**\n    - `FileMeta` 结构体存储文件元信息（名称、位置、大小）\n    - 支持最多 32 个文件（MAX_FILE_COUNT）\n    - 文件名最大长度为 10 字符（MAX_FILE_NAME_LENGTH）\n\n3. **空间分配策略**\n    - 实现三种分配策略：\n        - 最先适配（First Fit）：选择第一个足够大的空闲空间\n        - 最佳适配（Best Fit）：选择最小的足够大的空闲空间\n        - 最坏适配（Worst Fit）：选择最大的空闲空间\n    - 使用连续分配方式，将二维空间视为一维连续空间处理\n\n4. **文件操作**\n    - 文件创建：检查名称唯一性，分配空间，写入内容\n    - 文件删除：清除内容，更新元数据\n    - 文件读取：支持跨行读取，自动添加字符串结束符\n    - 文件更新：先删除后重新创建\n\n5. **磁盘维护**\n    - 碎片整理：将文件重新排列，合并空闲空间\n    - 磁盘统计：显示存储使用情况\n\n### 控制台界面（`file_console.c`）\n\n1. **用户交互**\n    - 提供命令行界面进行文件系统操作\n    - 支持文件内容的输入和显示\n    - 提供友好的错误提示\n\n2. **命令实现**\n    - `init`：初始化磁盘空间\n    - `mode`：切换分配策略\n    - `w`：写入文件内容\n    - `rm`：删除文件\n    - `cat`：查看文件内容\n    - `ls`：列出所有文件\n    - `defrag`：执行碎片整理\n\n3. **状态管理**\n    - 维护全局磁盘状态\n    - 提供磁盘未初始化的检查\n    - 支持命令执行结果的反馈\n\n## 开源协议\n\n本项目代码基于 [GNU General Public License v3.0](https://opensource.org/licenses/GPL-3.0) 开源。\n\n## Supports\n\n万分感谢 Jetbrains 慷慨地提供了开源许可证，让我可以专心致力于开发此项目及其他开源项目之上。\n\n[![](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](https://www.jetbrains.com/?from=https://github.com/CarmJos/CWorks)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarmjos%2Ffilesys","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarmjos%2Ffilesys","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarmjos%2Ffilesys/lists"}