+3 disks are actually CP/M disks. Disk organization details are stored in the XDPB table, which is generated by the firmware from the data found at the beginning of the disk. This can be read on part 27 of the +3 manual:
The PCW range disk format (used by the +3) is, in fact, a family of
formats the precise member of which is defined in the 'disk
specification' which is recorded on bytes 0...15 of sector 1, track 0
side 0. The format used on the +3 is the same as disk type 0 below.
The sector holding this specification is also that used for a
bootstrap program.
This paragraph also mentions the bootstrap program. On part 26, this can be read:
bootstart: ; ;The bootstrap sector contains the 16 bytes disk
specification at the start. ;The following values are for a AMSTRAD
PCW range CF2/Spectrum +3 format disk. ;
db 0 ;+3 format
db 0 ;single sided
db 40 ;40 tracks per side
db 9 ;9 sectors per track
db 2 ;log2(512)-7 = sector size
db 1 ;1 reserved track
db 3 ;blocks
db 2 ;2 directory blocks
db 02Ah ;gap length (r/w)
db 052h ;page length (format)
ds 5,0 ;5 reserved bytes
cksum: db 0 ;checksum must = 3 mod 256 for the sector
A non bootable disk will have 0 reserved tracks and hence, the directory area is what will come first.
By default, a standard data disk (non system, non bootable) have 64 directory entries, and these begin at track 0, sector 1 (sector numbers begin at 1), so the directory area lies in the first 2KB of the disk.
A directory entry is 32 bytes within the directory area, but unlike FAT, there can be multiple directory entries per file. Each entry is called a "extent".
A extent is made from several records. A record is 128 bytes long. A extent may use all its records or only a fraction of them.
If a extent uses all its records, this may mean that you need to search if there is another extent for this file. A record is used completely and there is no length field in the directory entry, so you must assume that all filled records belong to the file, or in other words, that a file length is always a multiple of 128.
A file is read by scanning the directory area for extents that belong to the same filename. Each extent has an extent counter so you can read them in asceding order.
Details can be read from the +3 manual (part 27): http://www.worldofspectrum.org/ZXSpectrum128+3Manual/chapter8pt27.html and here: https://www.seasip.info/Cpm/format22.html .
About 10 years ago I wrote a piece of software that can handle CP/M disks (IDEDOS partitions, which are actually (very) big CP/M disks). It's called "3e", and you can check the source: http://www.zxprojects.com/images/stories/3e_card_manager/3e.zip