我试图了解FAT文件系统如何从更高(更合乎逻辑)的级别工作。 FAT文件系统具有文件分配表,磁盘中的每个可用分配单元(群集)具有1个条目。此数据结构用于将文件映射到文件出现在磁盘上的第一个群集的地址(文件几乎肯定占用多于1个群集,并且这些群集以链接列表样式连接在一起)。到现在为止还挺好。但是文件分配表中的关键是什么?文件名是否为完整路径?
例如,假设我需要访问文件C:\ folder1 \ myFile.txt,I / O管理器在文件分配表中搜索文件名(包括路径),直到找到一个条目,如果所以,它返回第一个集群的地址。它是如何工作的? 我在网上阅读了很多关于这个主题的文档,但不知何故对文件分配表的访问仍然模糊不清。提前感谢您的帮助。
[编辑]
我在线阅读的越多,我就越困惑。我将尝试这个简单的例子,希望它能澄清我的问题。 假设我的C盘中只有2个文件:
C:\ MYFILE.TXT
C:\ folder1中\ MYFILE.TXT
文件分配表(以非常抽象的方式)将有3个条目:
| Filename | Extension | First Cluster |
|----------|-----------|---------------|
1 | MYFILE | TXT | 150 |
2 | FOLDER1 | | 300 |
3 | MYFILE | TXT | 900 |
假设到目前为止我是正确的,让我们说我想访问C:\ folder1中的myFile.txt:我不能使用文件名(MYFILE.TXT)本身作为我的密钥,因为我有2个条目相同的名字(我不知道选择哪个条目)。
此时我想我必须从文件夹开始,所以我扫描FAT以找到FOLDER1:我得到条目#2(集群300)。下一步是什么?我如何继续扫描表以查找“MYFILE.TXT”所需的目录条目,以便我可以访问指定集群的硬盘驱动器?
也许我从错误的角度看待这个,我不知道。 谢谢大家的帮助。
答案 0 :(得分:0)
看看这段代码,它是一个不知何故的dir命令,它从磁盘D打印根目录中的目录和文件的所有名称:\
#include<dos.h>
#include<stdio.h>
#include<iostream.h>
struct Boot {
char ignore1[11];
int Byte_Per_Sector;
char Serctors_Per_Cluster;
int Number_Of_Reserved_sectors;
char Number_of_FATS;
int Maximum_Number_of_root_dir;
int Total_Sector_count;
char Ignore2;
int Sectors_per_fat;
int Sectors_per_trach;
int Number_of_heads;
char ignore3[4];
char Total_sector_count_for_fat[4];
int ignore4;
char boot_signature;
char Volume_id[4];
char Volume_lable[11];
char File_system_type[8];
char Rest_of_boot_sector[450];
};
struct FCB {
char file_name[8];
char extension[3];
char attribute;
int reserved;
int creation_time;
int creation_date;
int last_access_date;
int ignore_in_fat;
int last_write_time;
int last_write_date;
int first_logic_cluster;
char file_size[4];
};
void main(){
FCB root[16]; //to read all the Root directory
if(absread(3,1,217,&root) ==0) { // start read from disk number 3 , 1 sector and the first sector number is 217 (from the hard disk)
cout<<"Read of Root Directory started:"<<endl;
for(int j=1;j<15;j++){
if(root[j].file_name[0]==0x00){//0x00 represents Unused file
break;
}
if(root[j].attribute!=0x0F) //0x0f mean this directory entry is part of a long file name
if(root[j].file_name[0]!='?')
for(int i=0;i<7;i++){
printf("%c",root[j].file_name[i]); // print the name of all files and directories
}
cout<<endl<<root[j].first_logic_cluster; to locate where is the first cluster contains the data on HD
cout<<endl;
}
cout<<"end of dirs in this cluster"<<endl;
}
else {
cout<<"error"<<endl;
}
cout<<"===================="<<endl;
char buffer[512];
//here to read what a file contains after calculating the physical address of that file
if(absread(3,1,283,&buffer) ==0) {
for(int i=0;i<512;i++ ){
cout<<buffer[i];
}
}
}
需要注意的事项
1 - 第一个结构是FAT中最重要的结构,因为所有信息都存储在这里
2- FCB包含有关根目录中文件和目录的信息
3-此代码可以在Windows 3.11上运行,(Turbo c ++)是代码编译的程序
4-代码表示FAT12,Integer是2字节
如果您有任何问题,我希望我可以帮助您