{"id":17354924,"url":"https://github.com/lazybearlee/filesystem","last_synced_at":"2026-03-12T14:20:35.400Z","repository":{"id":247177424,"uuid":"815152041","full_name":"lazybearlee/FileSystem","owner":"lazybearlee","description":null,"archived":false,"fork":false,"pushed_at":"2024-07-07T05:24:03.000Z","size":7595,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-17T11:42:31.413Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lazybearlee.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2024-06-14T13:13:17.000Z","updated_at":"2024-07-07T05:24:07.000Z","dependencies_parsed_at":"2024-07-07T06:42:10.704Z","dependency_job_id":null,"html_url":"https://github.com/lazybearlee/FileSystem","commit_stats":null,"previous_names":["lazybearlee/filesystem"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lazybearlee%2FFileSystem","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lazybearlee%2FFileSystem/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lazybearlee%2FFileSystem/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lazybearlee%2FFileSystem/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lazybearlee","download_url":"https://codeload.github.com/lazybearlee/FileSystem/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242768076,"owners_count":20182098,"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":[],"created_at":"2024-10-15T17:41:36.591Z","updated_at":"2026-03-12T14:20:30.348Z","avatar_url":"https://github.com/lazybearlee.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 类Linux实现——简单文件系统\n\n## 1. 简介\n\n本项目是一个简单的文件系统，实现了以下功能：\n\n1. 文件系统虚拟磁盘\n    1. `new`创建虚拟磁盘，包括超级块、位示图、inode表、数据区 ✔️\n    2. `format`格式化虚拟磁盘，设置超级块、位示图、inode表、数据区的初始值 ✔️\n   3. `sfs`挂载虚拟磁盘，加载超级块、位示图、inode表、数据区 ✔️\n    4. `exit`卸载/保存虚拟磁盘，保存超级块、位示图、inode表、数据区 ✔️\n    5. 空闲块管理，通过位图分配和回收inode和数据块，数据块额外采用成组链接法链接 ✔️\n    6. 磁盘索引，目前在数据结构上支持单/双/三级索引，但是暂时没有实现多级索引的具体操作 ✔️\n   7. 从配置文件读取配置信息 待完成\n2. 文件操作\n    1. `create/touch`创建文件—— ✔️\n        1. 暂时不支持递归创建目录\n        2. 不支持文件名中包含空格\n    2. `delete/rm`删除文件 ✔️\n        1. 暂时不支持`-r`递归删除目录\n   3. `cat`查看文件——支持按文件名、大小、偏移量查看文件内容 ️✔️\n   4. `echo`写入文件——支持向文件写入指定内容（会清空磁盘） ✔️\n   5. `open`打开文件——支持打开文件，返回文件描述符 ✔️\n   6. `close`关闭文件——支持关闭文件描述符 ✔️\n   7. `write`写入文件——支持向文件描述符对应的文件写入指定内容 ✔️\n   8. `read`读取文件——支持从文件描述符对应的文件读取指定内容 ✔️\n   9. `seek`移动文件指针——支持移动文件描述符对应的文件指针 ✔️\n3. 目录操作\n    1. `mkdir`创建目录——支持`-p`参数递归创建目录 ✔️\n    2. `rmdir`删除目录 ✔️\n        1. 暂时不支持`-p`递归删除目录\n        2. 暂时不支持`--ignore-fail-on-non-empty`参数\n    3. `ls`查看目录内容——支持-l参数查看文件详细信息 ✔️\n    4. `cd`切换目录——支持相对路径和绝对路径 ✔️\n   5. `pwd`显示当前目录路径——显示当前目录的绝对路径 ✔️\n4. 权限与用户\n    1. 完成了底层对于用户的权限控制，但是暂时没有实现用户的概念，所以所有文件都是root用户的 ✔️\n    2. 暂时不支持权限管理与用户管理相关的命令\n5. 其他\n   1. `clear`清屏——清空终端屏幕 ✔️\n   2. `quit`退出程序——保存文件系统状态并退出程序 ✔️\n   3. `help`帮助命令——列出所有支持的命令 ✔️\n   4. `exit`退出程序——保存文件系统状态并退出程序 ✔️\n   5. 使用**LRU算法**缓存INode，减少磁盘IO次数 ✔️\n   6. VI编辑器——支持简单的VI编辑器，支持`i`插入、`w`保存、`q`退出、`dd`删除行、`yy`复制行、`p`粘贴行 TODO\n\n## 2. 项目结构\n\n```\nmain.cpp // 主函数，产生交互界面\nFileSystem.cpp // 文件系统类，提供文件系统的大部分操作\nFSHelper.cpp // 文件系统帮助信息\nVDisk.h // 虚拟磁盘类，提供虚拟磁盘的数据结构与常量定义\nINodeCache.cpp // INode缓存类，提供INode的缓存机制\nFileManager.cpp // 文件管理类，提供文件描述符的管理\n```\n\n## 2. 使用方法\n\n### 可执行文件\n\n本系统的可执行文件均存放在bin目录下。\n\n#### Windows\n\n双击可执行程序执行：\n\n![img.png](img/img.png)\n\n如果无法正常打开，可能是因为编译版本不匹配，可尝试自行在项目目录编译得到可执行文件。\n\n#### Linux\n\n终端输入以下命令执行：\n\n```shell\n./LiFileSystem\n```\n\n### 源码编译\n\n本项目采用CMake+Ninja构建，编译源码需要安装CMake和Ninja。\n\n在项目根目录下执行以下命令：\n\n```shell\nmkdir build\ncd build\ncmake -G Ninja ..\nninja\n```\n\n编译完成后，可执行文件在`build/src`目录下。\n\n## 3. 使用流程\n\n### 创建虚拟磁盘\n\n使用以下命令创建虚拟磁盘：\n\n```shell\nnew example\n```\n\n这会在本机当前目录下创建一个名为`example.vdisk`的虚拟磁盘。\n并且系统会自动格式化和挂载这个虚拟磁盘。\n\n而如果new命令后面没有跟虚拟磁盘文件名，则会尝试创建`LiFS.vdisk`虚拟磁盘。\n\n### 载入虚拟磁盘\n\n使用以下命令载入虚拟磁盘：\n\n```shell\nsfs example.vdisk\n```\n\n这会载入当前目录下的`example.vdisk`虚拟磁盘。\n\n而如果sfs命令后面没有跟虚拟磁盘文件名，则会尝试载入当前目录下的`LiFS.vdisk`虚拟磁盘。\n\n### 退出虚拟磁盘\n\n使用以下命令退出虚拟磁盘：\n\n```shell\nexit\n```\n\n这会保存当前文件系统的状态，并退出虚拟磁盘。\n\n### 退出程序\n\n使用以下命令退出程序：\n\n```shell\nquit\n```\n\n这会保存当前文件系统的状态，并退出程序。\n\n### clear清屏\n\n使用以下命令清屏：\n\n```shell\nclear\n```\n\n**！！！在进入文件系统后，可以执行以下命令：**\n\n### 格式化虚拟磁盘\n\n使用以下命令格式化虚拟磁盘：\n\n```shell\nformat\n```\n\n这会格式化当前虚拟磁盘，清空所有数据。\n\n### 创建文件\n\n使用以下命令创建文件：\n\n```shell\ncreate file1 \n# or\ntouch file1\n```\n\n这个命令支持相对路径与绝对路径。\n\n### 删除文件\n\n使用以下命令删除文件：\n\n```shell\ndelete file1\n# or\nrm file1\n```\n\n这个命令支持相对路径与绝对路径。\n\n### 打开文件\n\n使用以下命令打开文件：\n\n```shell\nopen file1\n```\n\n这个命令会打开`file1`文件，并返回文件描述符。\n\n### 关闭文件\n\n使用以下命令关闭文件：\n\n```shell\nclose fd\n```\n\n这个命令会关闭文件描述符`fd`对应的文件。\n\n### 移动文件指针\n\n使用以下命令移动文件指针：\n\n```shell\nseek fd 10\n```\n\n这个命令会移动文件描述符`fd`对应的文件指针到`10`处。\n\n### 读取文件\n\n使用以下命令读取文件：\n\n```shell\nread fd 10\n```\n\n该命令会从文件描述符`fd`对应的文件中读取`10`个字节。\n\n### 写入文件\n\n使用以下命令写入文件：\n\n```shell\nwrite fd \"Hello World\"\n```\n\n该命令会向文件描述符`fd`对应的文件写入`Hello World`。\n\n### cat查看文件\n\n使用以下命令查看文件：\n\n```shell\ncat file1 -n 10 -o 10\n```\n\n该命令会查看`file1`文件，显示前`10`个字节，偏移量为`10`。\n\n该命令运行时会首先尝试以只读方式打开文件，如果文件不存在则会报错。\n在打开文件后会设置文件指针的位置，然后读取文件内容。\n\n### echo写入文件\n\n使用以下命令写入文件：\n\n```shell\necho hello \u003e file1\n```\n\n该命令会向`file1`文件写入`hello`。\n\n该命令会首先尝试以只写方式打开文件，如果文件不存在则会创建文件。\n而只写模式会清空文件内容，然后写入新内容。\n\n### 创建目录\n\n使用以下命令创建目录：\n\n```shell\nmkdir dir1\n```\n\n这个命令支持相对路径与绝对路径，同时也支持递归创建目录：\n\n```shell\nmkdir -p dir1/dir2/dir3\n```\n\n### 查看目录\n\n使用以下命令查看目录：\n\n```shell\nls dir1\n```\n\n这个命令会列出`dir1`目录下的所有文件和目录。\n当然，这个命令也支持`-l`参数，可以查看详细信息。\n\n详细信息包括：文件类型、权限、所有者、组、大小、修改时间和文件名。\n\n### 删除目录\n\n使用以下命令删除目录：\n\n```shell\nrmdir dir1\n```\n\n这个命令会删除`dir1`目录，支持相对路径与绝对路径。目前这个命令不支持递归删除目录。\n\n### 切换目录\n\n使用以下命令切换目录：\n\n```shell\ncd dir1\n```\n\n这个命令会切换到`dir1`目录，支持相对路径与绝对路径，如果目录不存在会切换到当前用户的主目录。\n\n### 查看系统信息\n\n使用以下命令查看系统信息：\n\n```shell\ninfo\n```\n\n会打印当前文件系统的信息。\n\n也可以采用`super`命令查看超级块信息：\n\n```shell\nsuper\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flazybearlee%2Ffilesystem","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flazybearlee%2Ffilesystem","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flazybearlee%2Ffilesystem/lists"}