FAT 文件系统模拟设计与实现:C语言程序模拟FAT16
2023-12-22 07:11:56
实验描述
利用标准C 语言,模拟实现 FAT 16文件系统,支持 FAT 文件系统格式的模拟磁盘卷及其中的目录与文件的存取操作,包括磁盘卷格式化、创建目录、改变当前目录、重命名目录、显示目录、删除目录、创建空文件、重命名文件、写文件、显示文件内容、删除文件。
用到的数据结构
- 路径存储,存储卷的名字和当前的目录,存储目录的起点和空闲块。当卷没有初始化即卷名字为空时可以实现报错?
typedef struct { char filename[MAX_FILENAME_LENGTH]; int start_block; int size; char data[MAX_FILE_SIZE]; } DirectoryEntry;
- 文件的数据结构,存储文件的起点和占用的块的大小,data存储文件内部的数据
typedef struct { char volume_name[MAX_FILENAME_LENGTH]; int total_blocks; int free_blocks; DirectoryEntry* directory; char current_path[MAX_FILENAME_LENGTH]; } FileSystem;
磁盘使用模拟
分别用函数实现磁盘卷格式化、创建目录、改变当前目录、重命名目录、显示目录、删除目录、创建空文件、重命名文件、写文件、显示文件内容、删除文件。列表编号每个操作,输入对应的序号选择操作并且进行交互,遇到一些错误则会有提示,模拟结束可以选择退出的操作。
运行示例
卷的初始化:输入卷名字和空间大小,即磁盘的格式化
创建目录user1
进入目录user1,此处若没有写对目录名字则会报错
创建新文件story
查看目录
写文件story,需要在此处输入有效的文件名
查看文件story,需要在此处输入有效的文件名
完整程序?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_FILENAME_LENGTH 16
#define MAX_FILE_SIZE 1024
typedef struct {
char filename[MAX_FILENAME_LENGTH];
int start_block;
int size;
char data[MAX_FILE_SIZE];
} DirectoryEntry;
typedef struct {
char volume_name[MAX_FILENAME_LENGTH];
int total_blocks;
int free_blocks;
DirectoryEntry* directory;
char current_path[MAX_FILENAME_LENGTH];
} FileSystem;
FileSystem fs;
void formatDisk() {
printf("Enter volume name: ");
scanf("%s", fs.volume_name);
printf("Enter total number of blocks: ");
scanf("%d", &fs.total_blocks);
fs.free_blocks = fs.total_blocks;
fs.directory = (DirectoryEntry*)malloc(sizeof(DirectoryEntry) * fs.total_blocks);
for (int i = 0; i < fs.total_blocks; i++) {
strcpy(fs.directory[i].filename, "");
fs.directory[i].start_block = -1;
fs.directory[i].size = 0;
}
strcpy(fs.current_path, "/");
printf("Disk formatted successfully.\n");
}
void createDirectory() {
char dirname[MAX_FILENAME_LENGTH];
printf("Enter directory name: ");
scanf("%s", dirname);
for (int i = 0; i < fs.total_blocks; i++) {
if (strcmp(fs.directory[i].filename, "") == 0) {
strcpy(fs.directory[i].filename, dirname);
fs.directory[i].start_block = -1;
fs.directory[i].size = 0;
printf("Directory created successfully.\n");
return;
}
}
printf("No free space for directory creation.\n");
}
void changeDirectory() {
char dirname[MAX_FILENAME_LENGTH];
printf("Enter directory name: ");
scanf("%s", dirname);
for (int i = 0; i < fs.total_blocks; i++) {
if (strcmp(fs.directory[i].filename, dirname) == 0) {
strcat(fs.current_path, dirname);
strcat(fs.current_path, "/");
printf("Directory changed to '%s'.\n", fs.current_path);
return;
}
}
printf("Directory '%s' not found.\n", dirname);
}
void renameDirectory() {
char oldname[MAX_FILENAME_LENGTH], newname[MAX_FILENAME_LENGTH];
printf("Enter old directory name: ");
scanf("%s", oldname);
printf("Enter new directory name: ");
scanf("%s", newname);
for (int i = 0; i < fs.total_blocks; i++) {
if (strcmp(fs.directory[i].filename, oldname) == 0) {
strcpy(fs.directory[i].filename, newname);
printf("Directory renamed successfully.\n");
return;
}
}
printf("Directory '%s' not found.\n", oldname);
}
void displayDirectory() {
printf("Current Disk: %s\n", fs.volume_name);
printf("Current Path: %s\n", fs.current_path);
printf("Directory listing:\n");
for (int i = 0; i < fs.total_blocks; i++) {
if (strcmp(fs.directory[i].filename, "") != 0) {
printf("- %s\n", fs.directory[i].filename);
}
}
}
void deleteDirectory() {
char dirname[MAX_FILENAME_LENGTH];
printf("Enter directory name: ");
scanf("%s", dirname);
for (int i = 0; i < fs.total_blocks; i++) {
if (strcmp(fs.directory[i].filename, dirname) == 0) {
strcpy(fs.directory[i].filename, "");
printf("Directory deleted successfully.\n");
return;
}
}
printf("Directory '%s' not found.\n", dirname);
}
void createFile() {
char filename[MAX_FILENAME_LENGTH];
printf("Enter file name: ");
scanf("%s", filename);
for (int i = 0; i < fs.total_blocks; i++) {
if (strcmp(fs.directory[i].filename, "") == 0) {
strcpy(fs.directory[i].filename, filename);
fs.directory[i].start_block = i;
fs.directory[i].size = 0;
fs.directory[i].data[0] = '\0';
fs.free_blocks--;
printf("File created successfully.\n");
return;
}
}
printf("No free space for file creation.\n");
}
void renameFile() {
char oldname[MAX_FILENAME_LENGTH], newname[MAX_FILENAME_LENGTH];
printf("Enter old file name: ");
scanf("%s", oldname);
printf("Enter new file name: ");
scanf("%s", newname);
for (int i = 0; i < fs.total_blocks; i++) {
if (strcmp(fs.directory[i].filename, oldname) == 0) {
strcpy(fs.directory[i].filename, newname);
printf("File renamed successfully.\n");
return;
}
}
printf("File '%s' not found.\n", oldname);
}
void writeFile() {
char filename[MAX_FILENAME_LENGTH];
printf("Enter file name: ");
scanf("%s", filename);
for (int i = 0; i < fs.total_blocks; i++) {
if (strcmp(fs.directory[i].filename, filename) == 0) {
int block_index = fs.directory[i].start_block;
if (block_index == -1) {
printf("File '%s' not found.\n", filename);
return;
}
printf("Enter file content:\n");
char content[MAX_FILE_SIZE];
scanf("%s", content);
strcpy(fs.current_path, filename);
fs.directory[i].size = strlen(content);
strcpy(fs.directory[i].data, content);
printf("File '%s' written successfully.\n", filename);
return;
}
}
printf("File '%s' not found.\n", filename);
}
void displayFileContent() {
char filename[MAX_FILENAME_LENGTH];
printf("Enter file name: ");
scanf("%s", filename);
for (int i = 0; i < fs.total_blocks; i++) {
if (strcmp(fs.directory[i].filename, filename) == 0) {
printf("Content of file '%s':\n%s\n", filename, fs.directory[i].data);
return;
}
}
printf("File '%s' not found.\n", filename);
}
void deleteFile() {
char filename[MAX_FILENAME_LENGTH];
printf("Enter file name: ");
scanf("%s", filename);
for (int i = 0; i < fs.total_blocks; i++) {
if (strcmp(fs.directory[i].filename, filename) == 0) {
strcpy(fs.directory[i].filename, "");
fs.directory[i].start_block = -1;
fs.directory[i].size = 0;
fs.free_blocks++;
printf("File deleted successfully.\n");
return;
}
}
printf("File '%s' not found.\n", filename);
}
int main() {
int choice;
printf("----------------------------------- FAT16 File System ----------------------------------\n");
printf("1. Format Disk 2. Create Directory 3. Change Directory 4. Rename Directory\n");
printf("5. Display Directory 6. Delete Directory 7. Create File 8. Rename File\n");
printf("9. Write File 10. Display File 11. Delete File 0. Exit\n");
do {
printf("\nCurrent Disk: %s Current Path: %s\n", fs.volume_name, fs.current_path);
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1: formatDisk(); break;
case 2: createDirectory(); break;
case 3: changeDirectory(); break;
case 4: renameDirectory(); break;
case 5: displayDirectory(); break;
case 6: deleteDirectory(); break;
case 7: createFile(); break;
case 8: renameFile(); break;
case 9: writeFile(); break;
case 10: displayFileContent(); break;
case 11: deleteFile(); break;
case 0: break;
default: printf("Invalid choice.\n");
}
} while (choice != 0);
free(fs.directory);
return 0;
}
文章来源:https://blog.csdn.net/lijj0304/article/details/135143196
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!