public CUnzipFile(string direc, string fileName, long unzipSize) { m_direc = direc; m_fileName = fileName; m_unzipState = EnumUnzipStatus.EUS_NONE; m_rate = 0; m_cancell = false; m_totalSize = unzipSize; }
public void BeginUnzip() { m_cancell = false; m_unzipState = EnumUnzipStatus.EUS_NONE; try { if (!File.Exists(m_fileName)) { m_unzipState = EnumUnzipStatus.EUS_FileNotFound; return; } //这里不需要先读一遍了 这个size 取自CDownloadFile中下载下来的长度 //FileStream tempMemory = new FileStream(m_fileName, FileMode.Open); //ZipInputStream zipS = new ZipInputStream(tempMemory); // m_totalSize = 0; //ZipEntry zipItem = zipS.GetNextEntry(); //while(zipItem != null) //{ // m_totalSize += zipItem.Size; // zipItem = zipS.GetNextEntry(); //} //zipS.Close(); //tempMemory.Close(); FileStream tempMemory = new FileStream(m_fileName, FileMode.Open); ZipInputStream zipS = new ZipInputStream(tempMemory); ZipEntry zipItem = zipS.GetNextEntry(); int unzipSize = 0; while (zipItem != null && !m_cancell) { byte[] temp = new byte[1024 * 1024]; int len = 0; DirectoryInfo dir = new DirectoryInfo(m_direc); if (!dir.Exists) { dir.Create(); } //现在分目录了 新加创建目录 int findIndex = zipItem.Name.LastIndexOf("/"); if (findIndex != -1) { string newDirName = m_direc + "/" + zipItem.Name.Substring(0, findIndex); dir = new DirectoryInfo(newDirName); if (!dir.Exists) { dir.Create(); } } if (zipItem.IsFile) { FileStream save = new FileStream(m_direc + "/" + zipItem.Name, FileMode.Create); while ((len = zipS.Read(temp, 0, temp.Length)) > 0 && !m_cancell) { save.Write(temp, 0, len); unzipSize += len; m_rate = unzipSize * 1f / m_totalSize; if (m_rate >= 1) { m_rate = 1; } } ; m_unpackFileList.Add(m_direc + "/" + zipItem.Name); save.Flush(); save.Close(); } else if (zipItem.IsDirectory) { DirectoryInfo childdir = new DirectoryInfo(m_direc + "/" + zipItem.Name); if (!childdir.Exists) { childdir.Create(); } } zipItem = zipS.GetNextEntry(); } zipS.Close(); tempMemory.Close(); if (m_cancell) { m_unzipState = EnumUnzipStatus.EUS_CANCELL; } else { m_unzipState = EnumUnzipStatus.EUS_SUCCESS; File.Delete(m_fileName); } } catch (Exception e) { Debug.LogError("unzip save file:" + e.ToString()); m_unzipState = EnumUnzipStatus.EUS_ERROR; } }