private void WriteFolderEntries(BinaryWriterEx bw, FolderEntry folder) { var allChilds = folder.GetEntryHierarchy().ToList(); var folderEntry = new LIFFFolderEntry() { EntryType = 1, Filename = folder.IsRootDirectory ? null : folder.Name, EntryCount = folder.Entries.Count, Reserved1 = folder.IsRootDirectory ? 0 : 7, BlockSize = 20 }; bw.WriteStruct(folderEntry); foreach (var entry in folder.Entries.OrderBy(x => x.Name)) { if (entry is FileEntry file) { var fileEntry = new LIFFFileEntry() { EntryType = 2, Filename = file.Name, FileSize = (int)file.FileSize + LIFFBLOCK_SIZE, Reserved1 = 7, Created = file.CreatedDate.ToFileTime(), Modified = file.ModifiedDate.ToFileTime(), Accessed = file.AccessedDate.ToFileTime() }; bw.WriteStruct(fileEntry); } else { WriteFolderEntries(bw, (FolderEntry)entry); } } }
private static void PopulateFolderFileHierarchy(BinaryReaderEx br, FolderEntry parentFolder, BlockHierarchy hierarchy, LIFFFolderEntry folderEntry) { if (hierarchy.ChildCount != folderEntry.EntryCount) { throw new IOException("The file is not a valid LIF. Entry count mismatch."); } for (int i = 0; i < folderEntry.EntryCount; i++) { var expectedBlock = hierarchy.Childs[i]; short entryType = br.ReadInt16(); br.BaseStream.Skip(-2); LifEntry entry; if (entryType == 1) { var folderInfo = br.ReadStruct <LIFFFolderEntry>(); entry = new FolderEntry(folderInfo.Filename); PopulateFolderFileHierarchy(br, (FolderEntry)entry, expectedBlock, folderInfo); } else if (entryType == 2) { var fileInfo = br.ReadStruct <LIFFFileEntry>(); var dataStream = new StreamPortion(br.BaseStream, expectedBlock.PositionInStream + LIFFBLOCK_SIZE, fileInfo.FileSize - LIFFBLOCK_SIZE); entry = new FileEntry(dataStream, fileInfo.Filename); ((FileEntry)entry).SetFileAttributes( DateTime.FromFileTime(fileInfo.Created), DateTime.FromFileTime(fileInfo.Modified), DateTime.FromFileTime(fileInfo.Accessed)); } else { throw new IOException("The file is not a valid LIF."); } parentFolder.Entries.Add(entry); } }