Example #1
0
        public static byte[] OpenResource(string fileName, string resName)
        {
            try {
                PAK    pak = (PAK)CollectionUtils.Get(pakRes, fileName);
                Stream ins = Resources.OpenStream(fileName);

                ArrayByte result = null;

                if (CACHE)
                {
                    if (cacheRes == null)
                    {
                        cacheRes = new System.Collections.Generic.Dictionary <string, ArrayByte>(
                            CollectionUtils.INITIAL_CAPACITY);
                    }
                    result = (ArrayByte)CollectionUtils.Get(cacheRes, fileName);
                    if (result == null)
                    {
                        result = new ArrayByte(ins, ArrayByte.LITTLE_ENDIAN);
                        CollectionUtils.Put(cacheRes, fileName, result);
                    }
                    else
                    {
                        result.Reset(ArrayByte.LITTLE_ENDIAN);
                    }
                }
                else
                {
                    result = new ArrayByte(ins, ArrayByte.LITTLE_ENDIAN);
                }

                if (pak == null)
                {
                    pak = new PAK();
                    LPKHeader header = ReadHeader(result);
                    pak.tables    = ReadLPKTable(result, (int)header.GetTables());
                    pak.head_size = (int)(LPKHeader.Size() + header.GetTables()
                                          * LPKTable.Size());
                    pak.skip   = result.Position();
                    pak.length = result.Length();
                    CollectionUtils.Put(pakRes, fileName, pak);
                }
                else
                {
                    result.SetPosition(pak.skip);
                }

                bool       find      = false;
                int        fileIndex = 0;
                string     innerName = null;
                LPKTable[] tables_0  = pak.tables;
                int        size      = tables_0.Length;

                for (int i = 0; i < size; i++)
                {
                    innerName = tables_0[i].GetFileName();
                    if (resName.Equals(innerName, System.StringComparison.InvariantCultureIgnoreCase))
                    {
                        find      = true;
                        fileIndex = i;
                        break;
                    }
                }

                if (!find)
                {
                    throw new Exception("File not found. ( " + fileName
                                        + " )");
                }
                else
                {
                    return(ReadFileFromPak(result, pak.head_size, tables_0[fileIndex]));
                }
            } catch (Exception) {
                throw new Exception("File not found. ( " + fileName + " )");
            }
        }
Example #2
0
 /// <summary>
 /// 获得指定头文件的偏移长度
 /// </summary>
 ///
 /// <param name="header"></param>
 /// <returns></returns>
 public static long OutputOffset(LPKHeader header)
 {
     return(LPKHeader.Size() + header.GetTables() * LPKTable.Size());
 }