[源码和文档分享]基于C语言实现的文件系统模拟

1 实验目的

了解文件管理系统的作用和工作方式

了解FAT文件系统的结构

学习文件管理系统的一般开发方法

2 需求说明

2.1 基本要求

准备一个FAT16格式的U盘,在Linux下编写一个文件系统管理程序,对U盘上的文件进行管理。具体要求如下:

设计并实现一个目录列表函数(无须支持选项,如ls -a、ls -l等),用来显示当前目录下包含的文件信息

设计并实现一个改变目录函数(无须处理路径名,如../../directoryName等),用来把当前目录切换到上一层目录或当前目录的子目录

设计并实现一个删除文件函数,使用当前目录中的要删除的文件名作为参数,用来删除指定的文件,要注意文件的隐藏、只读和其他系统属性

设计并实现一个创建文件函数,使用要创建的文件名和文件大小作为参数,用来创建一个新的文件

2.2 提高要求

增加创建目录的功能

增加删除目录的功能:通常需要先判断目录是否为空目录,若目录不为空,则需给出提示,并删除其包含的所有子目录和文件;若是空目录则可以直接删除

增加绝对路径和多级目录的支持:这里需要对输入的目录路径字符串进行解析,然后逐级查找目录

对ud_cf()函数进行改进,使其可以向文件中写入实际内容,并根据写入的内容计算文件的实际大小

对ud_ls()函数进行改进,增加对全部非根目录信息的读取(基本要求中仅读取一个扇区的非根目录细信息)

6607861-21575d26becb7c5f.png

参考文档和完整的文档和源码下载地址:

https://www.write-bug.com/article/1525.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴能够分享这个项目!以下是部分代码和文档说明: 代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define BLOCK_SIZE 1024 // 每个块的大小 #define MAX_FILENAME_LEN 256 // 文件名最大长度 #define MAX_FILE_NUM 100 // 最多文件数量 #define MAX_FILE_SIZE 1000 // 文件最大大小 // 目录项结构体 struct DirEntry { char name[MAX_FILENAME_LEN]; // 目录项名字 int startBlock; // 目录项起始块 int fileSize; // 目录项文件大小 }; // 文件系统结构体 struct FileSystem { int fat[MAX_FILE_SIZE / BLOCK_SIZE]; // 文件分配表 struct DirEntry dir[MAX_FILE_NUM]; // 目录项 char data[MAX_FILE_SIZE]; // 存储数据区 int dirNum; // 目录项数量 int dataNum; // 数据块数量 }; // 初始化文件系统 void initFileSystem(struct FileSystem *fs) { // 初始化文件分配表 for (int i = 0; i < MAX_FILE_SIZE / BLOCK_SIZE; i++) { fs->fat[i] = -1; } // 初始化目录项 fs->dirNum = 0; // 初始化数据区 fs->dataNum = 0; } // 创建文件 void createFile(struct FileSystem *fs, char *filename, int fileSize) { // 检查文件名是否已存在 for (int i = 0; i < fs->dirNum; i++) { if (strcmp(fs->dir[i].name, filename) == 0) { printf("文件已存在!\n"); return; } } // 检查文件大小是否超过最大值 if (fileSize > MAX_FILE_SIZE) { printf("文件太大了!\n"); return; } // 检查是否还有空闲块 int blockNumNeeded = (fileSize + BLOCK_SIZE - 1) / BLOCK_SIZE; // 需要的块数 if (blockNumNeeded > MAX_FILE_SIZE / BLOCK_SIZE - fs->dataNum) { printf("空间不足!\n"); return; } // 分配块 int firstBlock = -1; for (int i = 0; i < MAX_FILE_SIZE / BLOCK_SIZE; i++) { if (fs->fat[i] == -1) { fs->fat[i] = firstBlock; firstBlock = i; fs->dataNum++; if (fs->dataNum == blockNumNeeded) { break; } } } // 更新目录项 strcpy(fs->dir[fs->dirNum].name, filename); fs->dir[fs->dirNum].startBlock = firstBlock; fs->dir[fs->dirNum].fileSize = fileSize; fs->dirNum++; } // 删除文件 void deleteFile(struct FileSystem *fs, char *filename) { int index = -1; for (int i = 0; i < fs->dirNum; i++) { if (strcmp(fs->dir[i].name, filename) == 0) { index = i; break; } } if (index == -1) { printf("文件不存在!\n"); return; } // 释放块 int block = fs->dir[index].startBlock; while (block != -1) { int nextBlock = fs->fat[block]; fs->fat[block] = -1; fs->dataNum--; block = nextBlock; } // 删除目录项 for (int i = index; i < fs->dirNum - 1; i++) { fs->dir[i] = fs->dir[i + 1]; } fs->dirNum--; } // 读取文件 void readFile(struct FileSystem *fs, char *filename, char *data) { int index = -1; for (int i = 0; i < fs->dirNum; i++) { if (strcmp(fs->dir[i].name, filename) == 0) { index = i; break; } } if (index == -1) { printf("文件不存在!\n"); return; } int block = fs->dir[index].startBlock; int offset = 0; while (block != -1) { memcpy(data + offset, fs->data + block * BLOCK_SIZE, BLOCK_SIZE); offset += BLOCK_SIZE; block = fs->fat[block]; } } // 写入文件 void writeFile(struct FileSystem *fs, char *filename, char *data, int dataSize) { int index = -1; for (int i = 0; i < fs->dirNum; i++) { if (strcmp(fs->dir[i].name, filename) == 0) { index = i; break; } } if (index == -1) { printf("文件不存在!\n"); return; } // 检查文件大小是否超过最大值 if (dataSize > MAX_FILE_SIZE) { printf("文件太大了!\n"); return; } // 检查是否还有空闲块 int blockNumNeeded = (dataSize + BLOCK_SIZE - 1) / BLOCK_SIZE; // 需要的块数 if (blockNumNeeded > MAX_FILE_SIZE / BLOCK_SIZE - fs->dataNum) { printf("空间不足!\n"); return; } // 释放原块 int block = fs->dir[index].startBlock; while (block != -1) { int nextBlock = fs->fat[block]; fs->fat[block] = -1; fs->dataNum--; block = nextBlock; } // 分配新块 int firstBlock = -1; for (int i = 0; i < MAX_FILE_SIZE / BLOCK_SIZE; i++) { if (fs->fat[i] == -1) { fs->fat[i] = firstBlock; firstBlock = i; fs->dataNum++; if (fs->dataNum == blockNumNeeded) { break; } } } // 写入数据 block = firstBlock; int offset = 0; while (block != -1) { memcpy(fs->data + block * BLOCK_SIZE, data + offset, BLOCK_SIZE); offset += BLOCK_SIZE; block = fs->fat[block]; } // 更新目录项 fs->dir[index].startBlock = firstBlock; fs->dir[index].fileSize = dataSize; } int main() { struct FileSystem fs; initFileSystem(&fs); // 创建文件 createFile(&fs, "file1", 500); createFile(&fs, "file2", 700); createFile(&fs, "file3", 300); // 读取文件 char data[MAX_FILE_SIZE]; readFile(&fs, "file1", data); printf("file1: %s\n", data); // 写入文件 writeFile(&fs, "file1", "hello world", strlen("hello world")); readFile(&fs, "file1", data); printf("file1: %s\n", data); // 删除文件 deleteFile(&fs, "file2"); deleteFile(&fs, "file3"); return 0; } ``` 文档说明: 本项目是一个基于C语言实现模拟操作系统文件系统,支持创建、删除、读取和写入文件。 文件系统采用了FAT文件系统的设计思路,使用一个文件分配表(FAT)来管理文件存储位置。每个文件均被分成多个块,每个块的大小为1024字节。文件分配表记录了每个块的下一个块的位置,如果是最后一个块,下一个块的位置为-1。 文件系统中的目录项记录了文件名、文件起始块和文件大小等信息。目录项采用了线性查找的方式进行文件查找。 文件系统支持的最大文件数量为100个,最大文件大小为1000字节。 操作系统模拟文件管理c语言的完整代码和文档可以在我的Github上找到:https://github.com/ethan-funny/OS-FAT-FileSystem。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值