Esempio n. 1
0
        IEnumerator ExtraUPK()
        {
            int totalsize = 0;
            Dictionary <int, OneFileInfor> dir_file_info = new Dictionary <int, OneFileInfor>();
            string output_path = m_outputpath;

            FileStream upkFilestream = new FileStream(m_upkfilepath, FileMode.Open, FileAccess.Read, FileShare.Read);

            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 = new 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;
                dir_file_info.Add(id, info);

                totalsize += size;

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

//				yield return new WaitForEndOfFrame();
            }

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

//			foreach(OneFileInfor infopair in m_allFileInfoDic.Values)
            for (int i = 0; i < dir_file_info.Count; ++i)
            {
                OneFileInfor info = dir_file_info.ElementAt(i).Value;

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

                //创建文件;
                string dirpath = output_path;
                if (path.LastIndexOf('/') > 0)
                {
                    dirpath += path.Substring(0, path.LastIndexOf('/'));
                }
                string filepath = output_path + 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;

//				yield return new WaitForEndOfFrame();

                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;

                    if (m_progress != null)
                    {
                        m_progress.SetProgressPercent((long)totalsize, (long)totalprocesssize);
                    }
                }
                fileStream.Flush();
                fileStream.Close();
                yield return(new WaitForEndOfFrame());
            }

            /** 重置数据 **/
            m_id        = 0;
            m_totalSize = 0;
            m_allFileInfoDic.Clear();
            yield break;
        }
Esempio n. 2
0
        /**  打包一个文件夹  **/
        public void OnPackFolder(string folderpath, string upkfilepath, CodeProgress progress)
        {
            m_allFileInfoDic.Clear();
            TraverseFolder(folderpath);

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

            /**  更新文件在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;
                    if (progress != null)
                    {
                        progress.SetProgressPercent(m_totalSize, totalprocessSize);
                    }
                }
            }

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


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