예제 #1
0
 /// <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);
         }
     }
 }
예제 #2
0
 public bool FileExists(string name)
 {
     Pk2.pFile file = pk2File.Files.Find(item => item.name == name);
     if (file.position != 0)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
예제 #3
0
 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));
     }
 }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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);
            }
        }