Пример #1
0
        private FileItem ConvertAfsToGeneral(AfsFileItem item, string fileName)
        {
            FileItem FileItem = new FileItem(this.container);

            FileItem.FileName   = fileName;
            FileItem.FileOffset = item.startOffset;
            FileItem.FileSize   = item.length;
            return(FileItem);
        }
Пример #2
0
        private AfsFileItem ConvertGeneralToAfs(FileItem item, uint fileId)
        {
            AfsFileItem FileItem = new AfsFileItem();

            FileItem.fileId      = fileId;
            FileItem.startOffset = (uint)(item.FileOffset - this.dataOffset);
            FileItem.length      = item.FileSize;
            return(FileItem);
        }
Пример #3
0
        /// <summary>
        /// Parse the file table.
        /// </summary>
        /// <returns>Number of files found.</returns>
        public override int ParseFileTable()
        {
            long offset = 8;
            uint fid    = 0;

            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)
            {
                AfsFileItem item = new AfsFileItem();
                item.fileId      = fid;
                item.startOffset = StreamUtility.ReadUIntFromStream(this.container, offset, false);
                offset          += 4;
                item.length      = StreamUtility.ReadUIntFromStream(this.container, offset, false);
                offset          += 4;

                if (item.isValid())
                {
                    FileItem fileItem       = ConvertAfsToGeneral(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;
                }

                fid++;
            }

            if (fileTable.Count == this.numFiles + 1)
            {
                // The last one is the file property table.
                FileItem fileItem = fileTable[fileTable.Count - 1];
                offset = fileItem.FileOffset;
                // Retrieve file names
                for (int i = 0; i < this.numFiles; i++)
                {
                    fileTable[i].FileName = StreamUtility.ReadStringFromStream(this.container, offset, -1);
                    offset += 0x30;
                }
                // Remove the file property table
                fileTable.RemoveAt(fileTable.Count - 1);
            }

            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);
        }