public static int GetNumDirectories(RandomAccessFileOrArray stream)
{
long pointer = stream.FilePointer; // Save stream pointer
stream.Seek(0L);
int endian = stream.ReadUnsignedShort();
if (!IsValidEndianTag(endian)) {
throw new ArgumentException("Bad endianness tag (not 0x4949 or 0x4d4d).");
}
bool isBigEndian = (endian == 0x4d4d);
int magic = ReadUnsignedShort(stream, isBigEndian);
if (magic != 42) {
throw new
ArgumentException("Bad magic number, should be 42.");
}
stream.Seek(4L);
long offset = ReadUnsignedInt(stream, isBigEndian);
int numDirectories = 0;
while (offset != 0L) {
++numDirectories;
// EOFException means IFD was probably not properly terminated.
try {
stream.Seek(offset);
int entries = ReadUnsignedShort(stream, isBigEndian);
stream.Skip(12*entries);
offset = ReadUnsignedInt(stream, isBigEndian);
} catch (EndOfStreamException) {
//numDirectories--;
break;
}
}
stream.Seek(pointer); // Reset stream pointer
return numDirectories;
}