Louis Kuang
Louis Kuang

Reputation: 797

How to detect end of directory in the data area of FAT32?

I am working with the disk file directly. since the size of a directory is 0 in the directory structure, I wonder how do I detect the end of a directory file on the disk.

DIR_Name[0] == 0x00

The above way to detect end of directory doesn't seem reliable. I found on wiki that the size of the root directory in FAT32 is fixed to 512 entries, but what about other subdirectories. I might need to traverse down directories using the FAT and the cluster number.

Upvotes: 7

Views: 2659

Answers (2)

Paul Ogilvie
Paul Ogilvie

Reputation: 25286

A non-root directory is just a file.

The root directory starts in a fixed place on the disk (following the FAT). An entry in the root directory contains a cluster number. That cluster contains the data of the file or directory. The entry of that cluster number in the FAT, i.e. FAT[cluster_number] contains the number of the next cluster that belongs to the file or directory. That cluster contains more data of the file or directory and the FAT entry contains the number of the next cluster of the file or directory, etcetera, until you encounter the end-of-cluste mark, a value equal to or greater than 0xFFFFFFF8.

Upvotes: 3

keithmo
keithmo

Reputation: 4943

From the first Google search result for "fat32 on disk format", page 24:

When a directory is created, a file with the ATTR_DIRECTORY bit set in its DIR_Attr field, you set its DIR_FileSize to 0. DIR_FileSize is not used and is always 0 on a file with the ATTR_DIRECTORY attribute (directories are sized by simply following their cluster chains to the EOC mark).

Also: The FAT32 root directory size is not fixed at 512 entries; its size is determined in exactly the same way as any other directory.

From another reliable source:

Reading Directories

The first step in reading directories is finding and reading the root directory. On a FAT 12 or FAT 16 volumes the root directory is at a fixed position immediately after the File Allocation Tables:

first_root_dir_sector = first_data_sector - root_dir_sectors;

In FAT32, root directory appears in data area on given cluster and can be a cluster chain.

root_cluster_32 = extBS_32->root_cluster;

Emphasis added.

Upvotes: 4

Related Questions