操作系统模拟文件管理c语言,[源码和文档分享]基于C语言实现的模拟操作系统文件系统...
时间: 2023-10-29 20:07:49 浏览: 123
很高兴能够分享这个项目!以下是部分代码和文档说明:
代码:
```
#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。
阅读全文