예제 #1
0
        /// <summary>
        /// Parse the file table.
        /// </summary>
        /// <returns>Number of files found.</returns>
        public override int ParseFileTable()
        {
            // Set correct position for data section
            this.dataCluster = this.tableCluster +
                               ((this.numFiles * 16) / this.clusterSize);
            if ((this.numFiles * 16) % this.clusterSize != 0)
            {
                this.dataCluster++;
            }

            long offset = this.clusterSize * this.tableCluster;

            this.fileTable = new List <FileItem>();

            string fileNameBase;

            { // Get file name base
                int fileNameStart = this.container.Name.LastIndexOf('\\') + 1;
                int fileNameEnd   = this.container.Name.LastIndexOf('.');
                if (fileNameEnd == -1)
                {
                    fileNameEnd = this.container.Name.Length;
                }
                fileNameBase = this.container.Name.Substring(fileNameStart, fileNameEnd - fileNameStart);
            }

            while (true)
            {
                Uni2FileItem item = new Uni2FileItem();
                item.fileId        = StreamUtility.ReadUIntFromStream(this.container, offset);
                item.startCluster  = StreamUtility.ReadUIntFromStream(this.container, offset + 4);
                item.lengthCluster = StreamUtility.ReadUIntFromStream(this.container, offset + 8);
                item.lengthByte    = StreamUtility.ReadUIntFromStream(this.container, offset + 12);
                offset            += 16;

                if (item.isValid())
                {
                    FileItem FileItem       = ConvertUni2ToGeneral(item, fileNameBase + "-" + Convert.ToSingle(item.fileId));
                    uint     fileIdentifier = StreamUtility.ReadUIntFromStream(this.container, FileItem.FileOffset);
                    string   fileExt        = StreamUtility.GetFileExtension(fileIdentifier);
                    FileItem.FileName += "." + fileExt;
                    fileTable.Add(FileItem);
                }
                else
                {
                    break;
                }
            }

            if (fileTable.Count != this.numFiles)
            {
                throw new FormatException(this.container.Name + ": The real number of files doesn't match the header value!" + System.Environment.NewLine +
                                          "The header indicated: " + Convert.ToString(this.numFiles) + System.Environment.NewLine +
                                          "The real number of files: " + Convert.ToString(fileTable.Count));
            }

            return(fileTable.Count);
        }
예제 #2
0
        private FileItem ConvertUni2ToGeneral(Uni2FileItem item, string fileName)
        {
            FileItem FileItem = new FileItem(this.container);

            FileItem.FileName   = fileName;
            FileItem.FileOffset = (item.startCluster + this.dataCluster) * this.clusterSize;
            FileItem.FileSize   = item.lengthByte;
            return(FileItem);
        }
예제 #3
0
        private Uni2FileItem ConvertGeneralToUni2(FileItem item, uint fileId)
        {
            Uni2FileItem FileItem = new Uni2FileItem();

            FileItem.fileId        = fileId;
            FileItem.startCluster  = (uint)(item.FileOffset / this.clusterSize - this.dataCluster);
            FileItem.lengthCluster = item.FileSize / this.clusterSize;
            if (item.FileSize % this.clusterSize != 0)
            {
                FileItem.lengthCluster++;
            }
            FileItem.lengthByte = item.FileSize;
            return(FileItem);
        }