/// <summary> /// Not Well tested. /// </summary> /// <param name="path"></param> /// <returns></returns> public byte[] getFilebyPath(string path) { string[] tmp = path.Split('\\'); Pk2.pFolder folder; if (tmp[0] != "") { folder = pk2File.Folders.Find(t => t.name == tmp[0]); throw new Exception("F**K path too short"); } else { folder = pk2File.Folders.Find(t => t.name == tmp[1]); if (tmp.Length > 3) { for (int i = 2; i < tmp.Length - 1; i++) { folder = folder.subfolders.Find(t => t.name == tmp[i]); } Pk2.pFile file = folder.files.Find(t => t.name == tmp[tmp.Length - 1]); fileStream.Position = file.position; byte[] tmp_data = new byte[file.size]; fileStream.Read(tmp_data, 0, tmp_data.Length); return(tmp_data); } else { Pk2.pFile file = folder.files.Find(t => t.name == tmp[2]); fileStream.Position = file.position; byte[] tmp_data = new byte[file.size]; fileStream.Read(tmp_data, 0, tmp_data.Length); return(tmp_data); } } }
public bool FileExists(string name) { Pk2.pFile file = pk2File.Files.Find(item => item.name == name); if (file.position != 0) { return(true); } else { return(false); } }
public byte[] getFile(string name) { if (FileExists(name)) { BinaryReader reader = new BinaryReader(fileStream); Pk2.pFile file = pk2File.Files.Find(item => item.name == name); reader.BaseStream.Position = file.position; return(reader.ReadBytes((int)file.size)); } else { throw new Exception(string.Format("pk2Reader: File not found: {0}", name)); } }
void Read(long position) { BinaryReader reader = new BinaryReader(fileStream); reader.BaseStream.Position = position; List <Pk2.pFolder> folders = new List <Pk2.pFolder>(); Pk2.Pk2EntryBlock entryBlock = (Pk2.Pk2EntryBlock)BufferToStruct(blowfish.Decode(reader.ReadBytes(Marshal.SizeOf(typeof(Pk2.Pk2EntryBlock)))), typeof(Pk2.Pk2EntryBlock)); for (int i = 0; i < 20; i++) { Pk2.pk2Entry entry = entryBlock.entries[i]; //..... switch (entry.type) { case 0: //Null Entry break; case 1: //Folder if (entry.name != "." && entry.name != "..") { Pk2.pFolder folder = new Pk2.pFolder(); folder.name = entry.name; folder.position = BitConverter.ToInt64(entry.position, 0); folders.Add(folder); pk2File.Folders.Add(folder); currentFolder.subfolders.Add(folder); } break; case 2: //File Pk2.pFile file = new Pk2.pFile(); file.position = entry.Position; file.name = entry.name; file.size = entry.Size; file.parentFolder = currentFolder; pk2File.Files.Add(file); currentFolder.files.Add(file); break; } } if (entryBlock.entries[19].nChain != 0) { Read(entryBlock.entries[19].nChain); } foreach (Pk2.pFolder folder in folders) { currentFolder = folder; if (folder.files == null) { folder.files = new List <Pk2.pFile>(); } if (folder.subfolders == null) { folder.subfolders = new List <Pk2.pFolder>(); } Console.WriteLine(folder.name); Read(folder.position); } }
void Read(long position) { BinaryReader reader = new BinaryReader(fileStream); reader.BaseStream.Position = position; List<Pk2.pFolder> folders = new List<Pk2.pFolder>(); Pk2.Pk2EntryBlock entryBlock = (Pk2.Pk2EntryBlock)BufferToStruct(blowfish.Decode(reader.ReadBytes(Marshal.SizeOf(typeof(Pk2.Pk2EntryBlock)))), typeof(Pk2.Pk2EntryBlock)); for (int i = 0; i < 20; i++) { Pk2.pk2Entry entry = entryBlock.entries[i]; //..... switch (entry.type) { case 0: //Null Entry break; case 1: //Folder if (entry.name != "." && entry.name != "..") { Pk2.pFolder folder = new Pk2.pFolder(); folder.name = entry.name; folder.position = BitConverter.ToInt64(entry.position, 0); folders.Add(folder); pk2File.Folders.Add(folder); currentFolder.subfolders.Add(folder); } break; case 2: //File Pk2.pFile file = new Pk2.pFile(); file.position = entry.Position; file.name = entry.name; file.size = entry.Size; file.parentFolder = currentFolder; pk2File.Files.Add(file); currentFolder.files.Add(file); break; } } if (entryBlock.entries[19].nChain != 0) { Read(entryBlock.entries[19].nChain); } foreach (Pk2.pFolder folder in folders) { currentFolder = folder; if (folder.files == null) { folder.files = new List<Pk2.pFile>(); } if (folder.subfolders == null) { folder.subfolders = new List<Pk2.pFolder>(); } Console.WriteLine(folder.name); Read(folder.position); } }