一、文件系統簡介
文件系統是指計算機操作系統用於管理和組織計算機文件和目錄的一種數據結構,是將數據存儲到硬盤中的方法。在計算機存儲系統中,文件系統是相當重要的一環,因為它將數據存儲在硬盤中,並為系統提供了一些基本的文件管理功能,如創建、刪除、查找、讀取和寫入等操作。常見的文件系統類型有NTFS、FAT32、EXT2/3、HFS和FAT16等。
二、FAT16文件系統
FAT16文件系統是Microsoft在DOS操作系統中使用的一種文件系統類型,廣泛用於早期的PC和移動設備。FAT16文件系統中最大的特點就是文件名稱的8.3命名規則,其中文件名最多可以使用8個字符,擴展名最多可以使用3個字符,例如“test.txt”文件的短文件名可以使用“TEST.TXT”、“TET.TX_”等等。在FAT16文件系統中,文件是通過磁盤上的文件分配表(File Allocation Table)來存儲的,這個表格記錄了磁盤上每個文件的位置和狀態信息。文件分配表也是FAT16文件系統中最為重要的數據之一。
三、FAT16文件系統格式化
FAT16文件系統的格式化可以通過DOS系統中的Format命令來完成,例如:format c: /fs:fat,表示將C盤格式化成FAT16格式的文件系統。在格式化過程中,系統會在磁盤上創建引導扇區、文件分配表、根目錄等各種數據結構,並將這些數據結構寫入磁盤。在格式化FAT16文件系統時,需要指定磁盤格式為FAT16,並設置扇區大小、簇大小等參數。例如,對於1.44MB的軟盤來說,扇區大小為512字節,簇大小為1個扇區,則卷總大小為1.44MB。
四、FAT16文件系統的操作
FAT16文件系統的常見操作包括文件的讀取、寫入、複製、刪除等。讀取文件時,系統首先通過文件名查找文件位置和大小信息,然後按照簇的順序讀取磁盤上的數據,將這些數據組合成一個完整的文件。寫入文件時,系統首先要在文件分配表中找到一個空閑的簇,然後寫入數據到這個簇中,最後修改文件分配表的對應記錄。複製文件和刪除文件也是類似的操作。
五、FAT16文件系統的缺點
雖然FAT16文件系統是早期計算機系統中廣泛使用的一種文件系統,但它也存在一些缺點。首先,FAT16文件系統對文件名長度的限制比較嚴格,只能使用8個字符的文件名和3個字符的擴展名,這在一些應用場景中可能會造成不便。其次,FAT16文件系統對單個文件的大小也有限制,最大只能存儲2GB的文件大小,當存儲容量超過2GB時需要使用FAT32或NTFS等更先進的文件系統類型。此外,FAT16文件系統也存在一些安全性和穩定性問題,如文件的刪除只是在文件分配表中標記為刪除狀態而不是真正刪除,容易導致磁盤空間的浪費等問題。
六、FAT16文件系統的完整示例代碼
#include <stdio.h> #include <stdlib.h> #include <string.h> //定義磁盤塊大小 #define BLOCK_SIZE 512 //定義文件分配表佔據的塊數 #define FAT_BLOCKS 10 //定義FAT16文件名長度 #define FILENAME_LENGTH 8 //定義FAT16擴展名長度 #define EXTENSION_LENGTH 3 //定義文件分配表項結構體 struct fat16_fat_entry { unsigned short next_cluster; }; //定義目錄項結構體 struct fat16_directory_entry { unsigned char filename[FILENAME_LENGTH]; unsigned char extension[EXTENSION_LENGTH]; unsigned char attributes; unsigned short reserved; unsigned short created_time; unsigned short created_date; unsigned short last_accessed_date; unsigned short first_cluster_high; unsigned short last_modified_time; unsigned short last_modified_date; unsigned short first_cluster_low; unsigned int file_size; }; //定義文件系統結構體 struct fat16_filesystem { char *image; int img_size; int fat_start_block; int rootdir_start_block; int data_start_block; int block_size; int fat_blocks; int rootdir_blocks; int clusters; int fat_entry_size; }; //定義函數 void read_sector(struct fat16_filesystem *fs, char *buf, int sector); void read_block(struct fat16_filesystem *fs, char *buf, int block); void read_fat_entry(struct fat16_filesystem *fs, struct fat16_fat_entry *entry, int cluster); void write_fat_entry(struct fat16_filesystem *fs, struct fat16_fat_entry *entry, int cluster); void read_directory_entry(struct fat16_filesystem *fs, struct fat16_directory_entry *entry, int block, int index); void write_directory_entry(struct fat16_filesystem *fs, struct fat16_directory_entry *entry, int block, int index); //主函數 int main(int argc, char *argv[]) { struct fat16_filesystem fs; char buf[BLOCK_SIZE]; struct fat16_directory_entry rootdir_entry; char filename[] = "test.txt"; char contents[] = "Hello, World!"; int cluster, index; int i; //讀取FAT16文件系統映像 FILE *fp = fopen("fat16.img", "rb"); fseek(fp, 0, SEEK_END); fs.img_size = ftell(fp); fseek(fp, 0, SEEK_SET); fs.image = malloc(fs.img_size); fread(fs.image, fs.img_size, 1, fp); fclose(fp); //計算FAT16文件系統數據結構 fs.block_size = BLOCK_SIZE; fs.fat_blocks = FAT_BLOCKS; fs.fat_entry_size = sizeof(struct fat16_fat_entry); fs.rootdir_blocks = 1; fs.clusters = (fs.img_size / BLOCK_SIZE) - (1 + FAT_BLOCKS + fs.rootdir_blocks); fs.data_start_block = 1 + FAT_BLOCKS + fs.rootdir_blocks; fs.fat_start_block = 1; fs.rootdir_start_block = 1 + FAT_BLOCKS; //創建文件 cluster = fs.data_start_block; for(i=0; iimage[sector*fs->block_size], fs->block_size); } //讀取磁盤塊 void read_block(struct fat16_filesystem *fs, char *buf, int block) { memcpy(buf, &fs->image[block*fs->block_size], fs->block_size); } //讀取FAT表項 void read_fat_entry(struct fat16_filesystem *fs, struct fat16_fat_entry *entry, int cluster) { char fat_entry[fs->fat_entry_size]; read_block(fs, fat_entry, fs->fat_start_block + (cluster / (fs->block_size / sizeof(struct fat16_fat_entry)))); memcpy(entry, &fat_entry[(cluster % (fs->block_size / sizeof(struct fat16_fat_entry))) * sizeof(struct fat16_fat_entry)], sizeof(struct fat16_fat_entry)); } //寫入FAT表項 void write_fat_entry(struct fat16_filesystem *fs, struct fat16_fat_entry *entry, int cluster) { char fat_entry[fs->fat_entry_size]; read_block(fs, fat_entry, fs->fat_start_block + (cluster / (fs->block_size / sizeof(struct fat16_fat_entry)))); memcpy(&fat_entry[(cluster % (fs->block_size / sizeof(struct fat16_fat_entry))) * sizeof(struct fat16_fat_entry)], entry, sizeof(struct fat16_fat_entry)); write_block(fs, fat_entry, fs->fat_start_block + (cluster / (fs->block_size / sizeof(struct fat16_fat_entry)))); } //讀取目錄項 void read_directory_entry(struct fat16_filesystem *fs, struct fat16_directory_entry *entry, int block, int index) { char dir_entry[32]; read_block(fs, dir_entry, block+index); memcpy(entry, dir_entry, sizeof(struct fat16_directory_entry)); } //寫入目錄項 void write_directory_entry(struct fat16_filesystem *fs, struct fat16_directory_entry *entry, int block, int index) { char dir_entry[32]; memcpy(dir_entry, entry, sizeof(struct fat16_directory_entry)); write_block(fs, dir_entry, block+index); }
原創文章,作者:EBAGZ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/370600.html