FAT 文件系统模拟设计与实现:C语言程序模拟FAT16

 代码仓库:JJLi0427/operationsystem (github.com)

实验描述

利用标准C 语言,模拟实现 FAT 16文件系统,支持 FAT 文件系统格式的模拟磁盘卷及其中的目录与文件的存取操作,包括磁盘卷格式化、创建目录、改变当前目录、重命名目录、显示目录、删除目录、创建空文件、重命名文件、写文件、显示文件内容、删除文件。

用到的数据结构

  1. 路径存储,存储卷的名字和当前的目录,存储目录的起点和空闲块。当卷没有初始化即卷名字为空时可以实现报错 
    typedef struct {
        char filename[MAX_FILENAME_LENGTH];
        int start_block;
        int size;
        char data[MAX_FILE_SIZE];
    } DirectoryEntry;
  2. 文件的数据结构,存储文件的起点和占用的块的大小,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;
}

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
操作系统课程设计报告 题 目: 文件系统模拟设计 一、设计目的 本课程设计是学习完"操作系统原理"课程后进行的一次全面的综合训练,通过课程 设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的 理解,加强学生的动手能力。 二、设计内容 (1)概述 为Linux系统设计一个简单的二级文件系统。要求做到以下几点: 1.可以实现下列几条命令: login 用户登录 dir 列目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 cd 进出目录 2.列目录时要列出文件名,物理地址,保护码和文件长度 3.源文件可以进行读写保护 (2)设计原理和系统总体功能框架图 1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录 的文件系统。 2、文件物理结构可采用显式链接或其他方法。 3、磁盘空闲空间的管理可选择位示图或其他方法。如果采用位示图来管理文件存储 空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。 4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长 度等信息,还可以通过目录项实现对文件的读和写的保护。 5、对文件或目录的操作采用windows系统的API函数来实现。 6、设计一个较实用的用户界面,方便用户使用。要求提供以下相关文件操作:用户 登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、复制文件、移动 文件、返回根目录、退出。 功能结构图如图1.0所示: (3)详细设计及少数重要编码的说明 这次课程设计中,我负责4个板块,分别是显示列表函数和目录、创建函数文件创 建函数、打开文件函数和关闭文件系统函数。 1. 显示列表函数和目录 流程图如图1.1所示 2. 文件创建函数 算法:查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容 ,以'###'结束。申请inode空间(ialloc函数),申请硬盘block空间(balloc函数), 申请失败则结束。将文件内容写入inode空间和block空间。修改当前目录的结构,修改 inode位图,block位图,写入模拟硬盘。详细过程如流程图1.2所示: 、打开文件函数 对文件进行关闭操作,若此时文件不存在或处于读状态或写状态,则返回关闭失败信 息;若此时文件处于空闲状态,则调用Close函数进行关闭操作。流程图如图1.3所示 : 、关闭文件系统函数 对文件进行打开操作,若此时文件不存在或已处于打开状态或读状态或写状态,则返回 打开失败信息;若此时文件处于空闲状态,则调用Open函数进行打开操作。流程图如图 1.4所示: (4)运行结果分析 程序结果如图1.5-1.7所示 图1.5 图1.6 图1.7 (5)设计小结 操作系统课程设计是本课程重要的实践教学环节。课程设计的目的,一方面使学生 更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通过课程设 计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、应用知识的能 力和创新精神。与本课程的实验教学相比,课程设计独立设课,具有更多的学时,给学 生更多自行设计、自主实验的机会,充分放手让学生真正培养学生的实践动手能力,全 面提高学生的综合素质。 对于本次操作系统课程设,由于Linux比较陌生,刚起步阶段花了很大时间去查阅各 种资料。当完成设计时,感觉掌握了以前学到的知识,并且还对操作系统应用有了更深 入的认识。对二级文件系统也有了很好的了解,熟练C语言布局的使用,如何解决实现里 面功能的各种问题。 (6)参考文献 [1]计算机操作系统(第3版),汤小丹,西安电子科技大学出版社,2007年7月 [2]C语言程序设计,孟庆昌,人民邮电出版社,2006年4月 [3]计算机操作系统教程(第3版)习题解答与实验指导,张尧学,清华大学出版社, 2006年11月 (7)附源代码 12、显示列表函数dir( )和目录创建函数mkdir( )等(文件名dir.c) #include "stdio.h" #include "string.h" #include "filesys.h" _dir( ) /*dir*/ { unsigned int di_mode; int i,j,one; struct inode *temp_inode; printf("\nCURRENT DIRECTORY:\n"); for(i=0;i<DIRNUM;i++) {if(!(strcmp(dir.direct[i].d_name,""))&&(dir.direct[i].d_ino==0)) { dir.size = i;break; }} for(i=0;i<dir
嵌入式fat32文件系统是一种针对嵌入式系统设计文件系统,它能够在资源有限的嵌入式设备上高效地存储和管理数据。基于振南znfat设计实现,主要包括两个方面:文件系统设计文件系统实现。 在文件系统设计方面,需要考虑嵌入式设备的资源限制,如存储容量和处理能力,同时也需要考虑fat32文件系统的特点和要求。设计阶段需要确定文件系统的结构,包括文件索引、目录结构、簇大小等参数的选择,以及文件系统的功能模块划分和接口设计。在设计过程中需要充分考虑嵌入式设备的实际需求和限制,保证文件系统的高效性和可靠性。 在文件系统实现方面,需要根据设计方案逐步实现文件系统的各个功能模块,如文件的创建、删除、读写等操作,目录的管理,磁盘空间的分配和回收等。同时需要考虑嵌入式设备的存储介质和操作系统的支持情况,保证文件系统能够在特定的硬件和软件环境下正常工作。在实现过程中需要进行充分的测试和优化,确保文件系统的稳定性和性能。 总的来说,基于振南znfat的嵌入式fat32文件系统设计实现需要充分考虑嵌入式设备的实际需求和限制,同时也需要充分理解fat32文件系统的特点和要求,通过合理的设计实现,为嵌入式设备提供高效可靠的文件存储和管理功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哆啦叮当

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值