当前位置:首页 > 技术 > 正文内容

FAT16文件系统读写测试程序设计与实现

访客 技术 2026年5月25日 5

FAT16文件系统核心结构解析

本测试程序采用C语言实现FAT16文件系统的底层操作,包含引导扇区定义、目录项结构及长文件名支持。

#include <stdint.h>
#include <stdio.h>
#include <string.h>

#pragma pack(push, 1)
typedef struct {
    uint8_t jmp[3];
    char oem[8];
    uint16_t bytes_per_sector;
    uint8_t sectors_per_cluster;
    uint16_t reserved;
    uint8_t fat_count;
    uint16_t root_entries;
    uint16_t total_sectors;
    uint8_t media;
    uint16_t sectors_per_fat;
    uint16_t track;
    uint16_t heads;
    uint32_t hidden;
    uint32_t total_sectors_large;
    uint8_t drive;
    uint8_t reserved1;
    uint8_t boot_sig;
    uint32_t vol_id;
    char label[11];
    char fs_type[8];
    uint8_t code[448];
    uint16_t sig;
} boot_sector;

typedef struct {
    char name[8];
    char ext[3];
    uint8_t attr;
    uint8_t reserved;
    uint8_t time_tenth;
    uint16_t time;
    uint16_t date;
    uint16_t access;
    uint16_t high;
    uint16_t modify_time;
    uint16_t modify_date;
    uint16_t low;
    uint32_t size;
} dir_entry;

typedef struct {
    uint8_t seq;
    uint16_t name1[5];
    uint8_t attr;
    uint8_t type;
    uint8_t checksum;
    uint16_t name2[6];
    uint16_t cluster;
    uint16_t name3[2];
} lfn_entry;
#pragma pack(pop)

虚拟磁盘管理实现

提供磁盘创建、打开和关闭功能,支持跨平台操作。

typedef struct {
    int fd;
    uint8_t *data;
    uint32_t size;
    boot_sector boot;
    uint16_t fat_offset;
    uint16_t root_offset;
    uint16_t data_offset;
    uint16_t *fat;
    uint16_t clusters;
} disk_info;

int create_disk(const char *name, uint32_t size) {
    int fd = open(name, O_RDWR | O_CREAT, 0666);
    if (fd < 0) return -1;
    ftruncate(fd, size);
    close(fd);
    return 0;
}

disk_info* open_disk(const char *name) {
    disk_info *d = malloc(sizeof(disk_info));
    d->fd = open(name, O_RDWR);
    // 映射内存...
    return d;
}

文件系统初始化流程

格式化操作包含参数计算、引导扇区配置和FAT表初始化。

int format(disk_info *d, const char *label) {
    // 计算簇数量
    uint32_t total_sectors = d->size / 512;
    uint16_t clusters = (total_sectors - 1 - 128*2 - 512*32/512) / 8;
    
    // 配置引导扇区
    d->boot.bytes_per_sector = 512;
    d->boot.sectors_per_cluster = 8;
    d->boot.reserved = 1;
    d->boot.fat_count = 2;
    d->boot.root_entries = 512;
    d->boot.sectors_per_fat = 128;
    
    // 初始化FAT表
    d->fat = (uint16_t*)(d->data + 512);
    d->fat[0] = 0xFFF8;
    d->fat[1] = 0xFFFF;
    // 其他初始化...
    return 0;
}

文件操作实现

包含读取、写入、创建和删除文件的功能实现。

int write_file(disk_info *d, const char *name, const uint8_t *data, uint32_t size) {
    // 查找文件
    dir_entry *e = find_file(d, name);
    if (!e) {
        create_file(d, name);
        e = find_file(d, name);
    }
    
    // 释放旧簇
    free_clusters(d, e->cluster);
    
    // 分配新簇
    uint16_t cluster = alloc_cluster(d);
    // 写入数据...
    return 0;
}

测试程序架构

包含基本功能测试、性能评估和系统验证模块。

void run_tests() {
    create_disk("test.img", 32*1024*1024);
    disk_info *d = open_disk("test.img");
    format(d, "TEST");
    
    // 文件操作测试
    write_file(d, "test.txt", "Hello", 5);
    read_file(d, "test.txt", buffer, &size);
    
    // 性能测试
    uint8_t *big_data = malloc(1024*1024);
    write_file(d, "big.dat", big_data, 1024*1024);
    read_file(d, "big.dat", buffer, &size);
    
    // 完整性检查
    check_fat(d);
    check_clusters(d);
    close_disk(d);
}

扩展功能支持

实现子目录管理和文件属性操作。

int create_dir(disk_info *d, const char *name) {
    create_file(d, name, ATTR_DIRECTORY);
    dir_entry *e = find_file(d, name);
    uint16_t cluster = alloc_cluster(d);
    e->cluster = cluster;
    // 初始化目录内容...
    return 0;
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。