public void LoadDirectories(FileStream isoStream)
        {
            byte[] rootDirectoryBytes;
            NintendoWiiOpticalDiscDirectoryRecord    rootDirectoryRecord;
            NintendoWiiOpticalDiscDirectoryStructure rootDirectory;

            // Get name table offset
            rootDirectoryBytes = DiscReader.GetBytes(isoStream, this.VolumeBaseOffset,
                                                     this.DataOffset, this.RootDirectoryOffset, 0xC, this.PartitionKey);
            rootDirectoryRecord  = new NintendoWiiOpticalDiscDirectoryRecord(rootDirectoryBytes);
            this.NameTableOffset = this.RootDirectoryOffset + ((long)rootDirectoryRecord.FileSize * 0xC);

            rootDirectory = new NintendoWiiOpticalDiscDirectoryStructure(isoStream,
                                                                         isoStream.Name, rootDirectoryRecord, this.ImageCreationTime,
                                                                         this.VolumeBaseOffset, this.DataOffset, this.RootDirectoryOffset,
                                                                         this.RootDirectoryOffset, this.NameTableOffset,
                                                                         String.Empty, String.Empty, this.DiscReader, this.PartitionKey);

            this.DirectoryStructureArray.Add(rootDirectory);
        }
        public void Initialize(FileStream isoStream, long offset, bool isRawDump)
        {
            byte[] volumeIdentifierBytes;
            byte[] imageDateBytes;
            string imageDateString;

            this.IsRawDump = isRawDump;
            this.DirectoryStructureArray = new ArrayList();

            this.FormatDescription = NintendoWiiOpticalDisc.FORMAT_DESCRIPTION_STRING;
            this.VolumeType        = VolumeDataType.Data;

            // get identifier
            volumeIdentifierBytes = DiscReader.GetBytes(isoStream, this.VolumeBaseOffset,
                                                        this.DataOffset, 0x20, 64, this.PartitionKey);
            volumeIdentifierBytes = FileUtil.ReplaceNullByteWithSpace(volumeIdentifierBytes);
            this.VolumeIdentifier = ByteConversion.GetEncodedText(volumeIdentifierBytes, ByteConversion.GetPredictedCodePageForTags(volumeIdentifierBytes)).Trim();;

            // get date
            imageDateBytes = DiscReader.GetBytes(isoStream, this.VolumeBaseOffset,
                                                 this.DataOffset, 0x2440, 0xA, this.PartitionKey);
            imageDateString = ByteConversion.GetAsciiText(imageDateBytes);

            try
            {
                this.ImageCreationTime = new DateTime(int.Parse(imageDateString.Substring(0, 4)),
                                                      int.Parse(imageDateString.Substring(5, 2)),
                                                      int.Parse(imageDateString.Substring(8, 2)));
            }
            catch (Exception)
            {
                this.ImageCreationTime = new DateTime();
            }

            // get offset of file table
            this.RootDirectoryOffset = (long)ByteConversion.GetUInt32BigEndian(DiscReader.GetBytes(isoStream, this.VolumeBaseOffset,
                                                                                                   this.DataOffset, 0x424, 4, this.PartitionKey));
            this.RootDirectoryOffset <<= 2;

            this.LoadDirectories(isoStream);
        }