void UnPacker::UnPack(const std::string &aFileIn, const std::string &aDir) { FILE *fOut, *fIn; if (fopen_s(&fIn, aFileIn.c_str(), "rb") || !fIn) { throw Error("Failed to open file " + aFileIn); } unsigned char cAlg; if (!fscanf_s(fIn, "%c", &cAlg)) { throw Error("Error reading file"); } ProxyUnPacker *unP; switch (cAlg) { case 0: unP = new UnPackerRLE(bufSize); break; case 1: unP = new UnPackerHuffman(bufSize); break; default: throw Error("Unknown type of compression"); } unsigned int fileCount = unP->ReadInt(fIn); for (unsigned int i = 0; i < fileCount; ++i) { unsigned char fNameLen; unP->_SetNext(fIn, &fNameLen); std::string fName; unsigned char ch; for (unsigned int j = 0; j < fNameLen; ++j) { unP->_SetNext(fIn, &ch); fName.push_back(ch); } fName = aDir + fName; //************************** //fName = "_" + fName; //************************** if (fopen_s(&fOut, fName.c_str(), "wb") || !fOut) { throw Error("Failed to create file " + fName); } Printer pr; pr.PrintText("Decompression " + fName + ": 0%"); unP->_UnPack(fIn, fOut, pr); pr.PrintPercent(100); pr.PrintText("\n"); fclose(fOut); } delete unP; fclose(fIn); }
void Packer::Pack(const LstFile &aLstFileIn, const std::string &aFileOut) { FILE *fIn, *fOut; if (fopen_s(&fOut, aFileOut.c_str(), "wb") || !fOut) { throw Error("Failed to create file " + aFileOut); } fprintf(fOut, "%c", (unsigned char)alg); //записываем в выходной файл вид алгоритма, на основании которого идет архивация WriteInt(fOut, aLstFileIn.size()); //записываем в выходной файл количество файлов для архивации for (LstFile::const_iterator it = aLstFileIn.begin(); it != aLstFileIn.end(); ++it) { time_t tBegin = time(0); if (fopen_s(&fIn, (*it).c_str(), "rb") || !fIn) { throw Error("Failed to open file " + *it); } std::string shortFName = GetShortFileName(*it); fprintf(fOut, "%c", (unsigned char)shortFName.size()); //записываем в выходной файл размер имени архивируемого файла for (unsigned int i = 0; i < shortFName.size(); ++i) //записываем в выходной файл имя архивируемого файла { fprintf(fOut, "%c", shortFName[i]); } //Определяем размер файла fseek(fIn, 0, SEEK_END); unsigned int fSize = ftell(fIn); fseek(fIn, 0, SEEK_SET); Printer pr; pr.PrintText("Compression " + *it + ": 0%"); _Pack(fIn, fOut, fSize, pr); pr.PrintPercent(100); pr.PrintText("\n"); fclose(fIn); } fclose(fOut); }