コード例 #1
0
ファイル: UpkExtra.cs プロジェクト: syjsu/LZMA-with-Unity3D
    public static void ExtraUPK(string upkfilepath, string outputpath, CodeProgress progress)
    {
        int totalsize = 0;

        FileStream upkFilestream = new FileStream(upkfilepath, FileMode.Open);

        upkFilestream.Seek(0, SeekOrigin.Begin);

        int offset = 0;

        //读取文件数量;
        byte[] totaliddata = new byte[4];
        upkFilestream.Read(totaliddata, 0, 4);
        int filecount = BitConverter.ToInt32(totaliddata, 0);

        offset += 4;
        Debug.Log("filecount=" + filecount);

        //读取所有文件信息;
        for (int index = 0; index < filecount; index++)
        {
            //读取id;
            byte[] iddata = new byte[4];
            upkFilestream.Seek(offset, SeekOrigin.Begin);
            upkFilestream.Read(iddata, 0, 4);
            int id = BitConverter.ToInt32(iddata, 0);
            offset += 4;

            //读取StartPos;
            byte[] startposdata = new byte[4];
            upkFilestream.Seek(offset, SeekOrigin.Begin);
            upkFilestream.Read(startposdata, 0, 4);
            int startpos = BitConverter.ToInt32(startposdata, 0);
            offset += 4;

            //读取size;
            byte[] sizedata = new byte[4];
            upkFilestream.Seek(offset, SeekOrigin.Begin);
            upkFilestream.Read(sizedata, 0, 4);
            int size = BitConverter.ToInt32(sizedata, 0);
            offset += 4;

            //读取pathLength;
            byte[] pathLengthdata = new byte[4];
            upkFilestream.Seek(offset, SeekOrigin.Begin);
            upkFilestream.Read(pathLengthdata, 0, 4);
            int pathLength = BitConverter.ToInt32(pathLengthdata, 0);
            offset += 4;

            //读取path;
            byte[] pathdata = new byte[pathLength];
            upkFilestream.Seek(offset, SeekOrigin.Begin);
            upkFilestream.Read(pathdata, 0, pathLength);
            string path = m_UTF8Encoding.GetString(pathdata);
            offset += pathLength;


            //添加到Dic;
            OneFileInfor info = new OneFileInfor();
            info.m_id         = id;
            info.m_Size       = size;
            info.m_PathLength = pathLength;
            info.m_Path       = path;
            info.m_StartPos   = startpos;
            m_allFileInfoDic.Add(id, info);

            totalsize += size;

            Debug.Log("id=" + id + " startPos=" + startpos + " size=" + size + " pathLength=" + pathLength + " path=" + path);
        }



        //释放文件;
        int totalprocesssize = 0;

        foreach (var infopair in m_allFileInfoDic)
        {
            OneFileInfor info = infopair.Value;

            int    startPos = info.m_StartPos;
            int    size     = info.m_Size;
            string path     = info.m_Path;

            //创建文件;
            string dirpath  = outputpath + path.Substring(0, path.LastIndexOf('/'));
            string filepath = outputpath + path;
            if (Directory.Exists(dirpath) == false)
            {
                Directory.CreateDirectory(dirpath);
            }
            if (File.Exists(filepath))
            {
                File.Delete(filepath);
            }

            FileStream fileStream = new FileStream(filepath, FileMode.Create);

            byte[] tmpfiledata;
            int    processSize = 0;
            while (processSize < size)
            {
                if (size - processSize < 1024)
                {
                    tmpfiledata = new byte[size - processSize];
                }
                else
                {
                    tmpfiledata = new byte[1024];
                }

                //读取;
                upkFilestream.Seek(startPos + processSize, SeekOrigin.Begin);
                upkFilestream.Read(tmpfiledata, 0, tmpfiledata.Length);

                //写入;
                fileStream.Write(tmpfiledata, 0, tmpfiledata.Length);

                processSize      += tmpfiledata.Length;
                totalprocesssize += tmpfiledata.Length;

                progress.SetProgressPercent((long)totalsize, (long)totalprocesssize);
            }
            fileStream.Flush();
            fileStream.Close();
        }
    }
コード例 #2
0
ファイル: MyPackRes.cs プロジェクト: syjsu/LZMA-with-Unity3D
    /**  打包一个文件夹  **/
    public static void PackFolder(string folderpath, string upkfilepath, CodeProgress progress)
    {
        TraverseFolder(folderpath);

        Debug.Log("文件数量 : " + m_id + "个");
        Debug.Log("文件总大小 : " + m_totalSize + "KB");

        /**  更新文件在UPK中的起始点  **/
        int firstfilestartpos = 0 + 4;

        for (int index = 0; index < m_allFileInfoDic.Count; index++)
        {
            firstfilestartpos += 4 + 4 + 4 + 4 + m_allFileInfoDic[index].m_PathLength;
        }

        int startpos = 0;

        for (int index = 0; index < m_allFileInfoDic.Count; index++)
        {
            if (index == 0)
            {
                startpos = firstfilestartpos;
            }
            else
            {
                startpos = m_allFileInfoDic[index - 1].m_StartPos + m_allFileInfoDic[index - 1].m_Size;                //上一个文件的开始+文件大小;
            }

            m_allFileInfoDic[index].m_StartPos = startpos;
        }

        /**  写文件  **/
        FileStream fileStream = new FileStream(upkfilepath, FileMode.Create);

        /**  文件总数量  **/
        byte[] totaliddata = System.BitConverter.GetBytes(m_id);
        fileStream.Write(totaliddata, 0, totaliddata.Length);

        for (int index = 0; index < m_allFileInfoDic.Count; index++)
        {
            /** 写入ID **/
            byte[] iddata = System.BitConverter.GetBytes(m_allFileInfoDic[index].m_id);
            fileStream.Write(iddata, 0, iddata.Length);

            /**  写入StartPos  **/
            byte[] startposdata = System.BitConverter.GetBytes(m_allFileInfoDic[index].m_StartPos);
            fileStream.Write(startposdata, 0, startposdata.Length);

            /**  写入size  **/
            byte[] sizedata = System.BitConverter.GetBytes(m_allFileInfoDic[index].m_Size);
            fileStream.Write(sizedata, 0, sizedata.Length);

            /**  写入pathLength  **/
            byte[] pathLengthdata = System.BitConverter.GetBytes(m_allFileInfoDic[index].m_PathLength);
            fileStream.Write(pathLengthdata, 0, pathLengthdata.Length);

            /**  写入path  **/
            byte[] mypathdata = new UTF8Encoding().GetBytes(m_allFileInfoDic[index].m_Path);

            fileStream.Write(mypathdata, 0, mypathdata.Length);
        }

        /**  写入文件数据  **/
//		for (int index = 0; index < m_allFileInfoDic.Count; index++)
//		{
//			fileStream.Write(m_allFileInfoDic[index].m_data, 0, m_allFileInfoDic[index].m_Size);
//		}
        int totalprocessSize = 0;

        foreach (var infopair in m_allFileInfoDic)
        {
            OneFileInfor info        = infopair.Value;
            int          size        = info.m_Size;
            byte[]       tmpdata     = null;
            int          processSize = 0;
            while (processSize < size)
            {
                if (size - processSize < 1024)
                {
                    tmpdata = new byte[size - processSize];
                }
                else
                {
                    tmpdata = new byte[1024];
                }
                fileStream.Write(info.m_data, processSize, tmpdata.Length);

                processSize      += tmpdata.Length;
                totalprocessSize += tmpdata.Length;

                progress.SetProgressPercent(m_totalSize, totalprocessSize);
            }
        }

        fileStream.Flush();
        fileStream.Close();


        /** 重置数据 **/
        m_id        = 0;
        m_totalSize = 0;
        m_allFileInfoDic.Clear();
    }