Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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);
            }
        }