我目前有一个用Java创建文件系统的任务。我试图将它实现为类似FAT。我担心的是我没有有效地存储或阅读每个FCB。每个文件都有一个FCB,我目前拥有:
___________________
| |
| size of file name |
|___________________|
| |
| file name |
|___________________|
| |
| # of data pointers|
|___________________|
| data pointer #1 |
|-------------------|
| bytes to read |
|-------------------|
| data pointer #2 |
|-------------------|
| bytes to read |
|-------------------|
| ... |
|-------------------|
| data pointer n |
|-------------------|
| bytes to read |
|___________________|
当我想阅读FCB时,我会执行以下操作:
1. Get the first four bytes
2. Convert to int -> bytes in file name
3. Read that many bytes for file name
4. Read next four bytes
5. Convert to int -> number of pointers
6. Read 4 * number of pointers
6a. Read address from pointer #1
6b. Read number of bytes, starting from address
最后,我的文件系统将存储为
___________________
| number of pointers|
|-------------------|
| FCB#1 |
|-------------------|
| ... |
|-------------------|
| FCB N |
|-------------------|
| Data |
| |
| |
|___________________|
我担心存储FCB时我的开销会太贵。这是我应该怎么做的,但对于FAT,还是我完全误解了它?
答案 0 :(得分:1)
我怀疑您可能稍微误解了一些事情,或者只是需要一些指导来更好地构建数据。我检测到几种不同类型的数据混合在一起,并且从经验中可以看出这可能导致混淆。
我在我的时间里实现了一些文件系统,我发现尽可能将数据类型分成以下内容非常方便:
1. File data : the file's data.
2. File meta-data : tells you about the file data (where it is found, permissions, ...)
3. File system meta-data : tells you what's free to use and what is not
根据文件系统的不同,可能会有一些重叠。例如,在基于FAT的FS(例如DosFS使用的FS)中,磁盘基本上分为两部分 - 文件分配表(FAT)和数据空间。 FAT只是一个条目表,用于标识数据空间中的哪些集群(磁盘块)已分配。然而,为了帮助节省记忆,它利用了一些技巧......
1. Each cluster in the data space maps to a unique entry in the FAT.
2. The FAT entry contents identify the NEXT cluster that contains data (it's a linked list).
3. Special FAT entry values are used to mark a free entry, and the end of the chain.
4. Each cluster is the same size.
目录,可以被视为遵循特殊规则的特殊文件。根据FS,目录条目可以是固定大小或可变大小。对于使用经典8.3命名约定的基于FAT的DosFS,每个条目的大小相同。目录条目必须为您提供发现文件名的方法,从何处开始查找其数据以及在何处查找其属性数据(例如文件大小和权限)。有些人会将所有这些信息直接存储为条目的一部分,其他人会告诉你从哪里开始找到它。
我希望这会有所帮助。