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