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