private int Ext1File(FileStream fs, FileTableInf fti, string tgtDir) { //Print("生成:"+fti.archNm+"/"+System.IO.Path.GetDirectoryName(fti.fileNm)); if (!Directory.Exists(tgtDir + "/" + fti.archNm + "/" + Path.GetDirectoryName(fti.fileNm))) { Directory.CreateDirectory(tgtDir + "/" + fti.archNm + "/" + Path.GetDirectoryName(fti.fileNm)); } using (FileStream fw = File.Create(tgtDir + "/" + fti.archNm + "/" + fti.fileNm)) { byte[] tmpBuf = new byte[fti.compLen]; ReadFile(fs, tmpBuf, fti.dataPos, fti.compLen); if (fti.compLen == fti.deplLen) { nonCompExtnt.Add(Path.GetExtension(fti.fileNm)); fw.Write(tmpBuf, 0, fti.compLen); return(0); } IpfCrypt ic = new IpfCrypt(); //DumpBuf(tmpBuf, 32); ic.DecryptBuf(tmpBuf); //DumpBuf(tmpBuf, 32); using (Stream memStrm = new MemoryStream(tmpBuf)) { using (var deflStrm = new DeflateStream(memStrm, CompressionMode.Decompress)) { byte[] readBuf = new byte[4096]; int readSize = 0; for (int readPos = 0; ; readPos += readSize) { readSize = deflStrm.Read(readBuf, 0, readBuf.Length); if (readSize == 0) { break; } fw.Write(readBuf, 0, readSize); } } } } return(0); }
public int Packing() { Print("ファイル構成開始"); string fileName = string.IsNullOrEmpty(ipfTgtName) ? "_p" + DateTime.Now.ToString("yyMMddhhmmss") : ipfTgtName; using (FileStream fw = new FileStream(Directory.GetCurrentDirectory() + "/" + fileName + ".ipf", FileMode.Create, FileAccess.ReadWrite)) { foreach (var fti in lstFileTab) { using (FileStream fr = new FileStream(fti.filePath, FileMode.Open, FileAccess.Read)) { IpfCrypt ic = new IpfCrypt(); fti.dataPos = (int)fw.Position; fti.deplLen = (int)fr.Length; string ext = Path.GetExtension(fti.filePath.ToLower()); if ((ext == ".jpg") || (ext == ".fsb") || (ext == ".mp3")) { byte[] readBuf = new byte[4096]; for (int readSize = 0; ;) { readSize = fr.Read(readBuf, 0, readBuf.Length); if (readSize == 0) { break; } fw.Write(readBuf, 0, readSize); } } else { using (var memStrm = new MemoryStream()) { using (var deflStrm = new DeflateStream(memStrm, CompressionMode.Compress, true)) { byte[] readBuf = new byte[4096]; for (int readSize = 0, readPos = 0; ; readPos += readSize) { Array.Resize(ref readBuf, readPos + 4096); readSize = fr.Read(readBuf, readPos, 4096); if (readSize == 0) { Array.Resize(ref readBuf, readPos); break; } } deflStrm.Write(readBuf, 0, readBuf.Length); } var tmpBuf = memStrm.ToArray(); //DumpBuf(tmpBuf, 32); ic.EncryptBuf(tmpBuf); //DumpBuf(tmpBuf, 32); fw.Write(tmpBuf, 0, tmpBuf.Length); } } fti.compLen = (int)fw.Position - fti.dataPos; fr.Seek(0, SeekOrigin.Begin); fti.fileCrc = ic.ComputeHash(fr); } } ipfFileCnt = lstFileTab.Count; ipfFileTblPos = (int)fw.Position; int lastDataPos = 0; foreach (var fti in lstFileTab) { byte[] archNmB = Encoding.UTF8.GetBytes(fti.archNm); byte[] fileNmB = Encoding.UTF8.GetBytes(fti.fileNm); byte[] tmpBuf = new byte[20]; tmpBuf[0] = (byte)(fileNmB.Length); tmpBuf[1] = (byte)(fileNmB.Length >> 8); tmpBuf[18] = (byte)(archNmB.Length); tmpBuf[19] = (byte)(archNmB.Length >> 8); tmpBuf[2] = (byte)(fti.fileCrc); tmpBuf[3] = (byte)(fti.fileCrc >> 8); tmpBuf[4] = (byte)(fti.fileCrc >> 16); tmpBuf[5] = (byte)(fti.fileCrc >> 24); tmpBuf[6] = (byte)(fti.compLen); tmpBuf[7] = (byte)(fti.compLen >> 8); tmpBuf[8] = (byte)(fti.compLen >> 16); tmpBuf[9] = (byte)(fti.compLen >> 24); tmpBuf[10] = (byte)(fti.deplLen); tmpBuf[11] = (byte)(fti.deplLen >> 8); tmpBuf[12] = (byte)(fti.deplLen >> 16); tmpBuf[13] = (byte)(fti.deplLen >> 24); tmpBuf[14] = (byte)(fti.dataPos); tmpBuf[15] = (byte)(fti.dataPos >> 8); tmpBuf[16] = (byte)(fti.dataPos >> 16); tmpBuf[17] = (byte)(fti.dataPos >> 24); lastDataPos = fti.dataPos; fw.Write(tmpBuf, 0, tmpBuf.Length); fw.Write(archNmB, 0, archNmB.Length); fw.Write(fileNmB, 0, fileNmB.Length); } ipfFileFtrPos = (int)lastDataPos; { byte[] tmpBuf = new byte[24]; tmpBuf[0] = (byte)(ipfFileCnt); tmpBuf[1] = (byte)(ipfFileCnt >> 8); tmpBuf[2] = (byte)(ipfFileTblPos); tmpBuf[3] = (byte)(ipfFileTblPos >> 8); tmpBuf[4] = (byte)(ipfFileTblPos >> 16); tmpBuf[5] = (byte)(ipfFileTblPos >> 24); tmpBuf[8] = (byte)(ipfFileFtrPos); tmpBuf[9] = (byte)(ipfFileFtrPos >> 8); tmpBuf[10] = (byte)(ipfFileFtrPos >> 16); tmpBuf[11] = (byte)(ipfFileFtrPos >> 24); tmpBuf[12] = 0x50; tmpBuf[13] = 0x4B; tmpBuf[14] = 0x05; tmpBuf[15] = 0x06; tmpBuf[16] = (byte)(ipfTgtVer); tmpBuf[17] = (byte)(ipfTgtVer >> 8); tmpBuf[18] = (byte)(ipfTgtVer >> 16); tmpBuf[19] = (byte)(ipfTgtVer >> 24); tmpBuf[20] = (byte)(ipfPkgVer); tmpBuf[21] = (byte)(ipfPkgVer >> 8); tmpBuf[22] = (byte)(ipfPkgVer >> 16); tmpBuf[23] = (byte)(ipfPkgVer >> 24); fw.Write(tmpBuf, 0, tmpBuf.Length); } } Print("ファイル構成完了"); Print("----"); return(0); }