bool decompressDir(const QString& inFile, const QString& targetDir, bool isUtf8) { QString path = targetDir; if (!path.endsWith("/") && !path.endsWith("\\")) path += "/"; QDir dir(path); if (!dir.exists()) dir.mkpath(targetDir); //set gbk default if (!isUtf8) QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); QuaZip archive(inFile); //archive.setFileNameCodec("GBK"); if (!archive.open(QuaZip::mdUnzip)) { QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); return false; } for (bool f = archive.goToFirstFile(); f; f = archive.goToNextFile()) { QString filePath = archive.getCurrentFileName(); QuaZipFile zFile(archive.getZipName(), filePath); zFile.open(QIODevice::ReadOnly); QByteArray ba = zFile.readAll(); zFile.close(); if (filePath.endsWith("/")) { dir.mkpath(filePath); } else { QString utf8FileName = path + filePath; QFile dstFile(utf8FileName); if (!dstFile.open(QIODevice::WriteOnly)) { QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); return false; } dstFile.write(ba); dstFile.close(); } } //restore QTextCodec QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); return true; }
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QuaZip archive("Desktop.zip"); if (!archive.open(QuaZip::mdUnzip)) return false; QString out_dir = "./zip"; QString path = out_dir; if (!path.endsWith("/") && !out_dir.endsWith("\\")) path += "/"; QDir dir(out_dir); if (!dir.exists()) dir.mkpath("."); for( bool f = archive.goToFirstFile(); f; f = archive.goToNextFile() ) { QString filePath = archive.getCurrentFileName(); QuaZipFile zFile(archive.getZipName(), filePath); zFile.open(QIODevice::ReadOnly ); QByteArray ba = zFile.readAll(); qDebug() << ba.size()/1024 <<"Byte\t" << "--------\t" << filePath; zFile.close(); if (filePath.endsWith("/")) { dir.mkpath(filePath); } else { QFile dstFile(path + filePath); if (!dstFile.open(QIODevice::WriteOnly)) return false; dstFile.write(ba); dstFile.close(); } } if(archive.getZipError()==UNZ_OK) { // ok, there was no error qDebug() << "ok"; } return a.exec(); }
bool VertexElementCallBack::saveFile(const std::string & fileName, const std::string &) const { #ifdef QT_CORE_LIB QuaZip zip(QString::fromLocal8Bit(fileName.data())); if (zip.open(QuaZip::Mode::mdCreate)==false) { return false; } { QuaZipFile zFile( &zip ); QuaZipNewInfo info("info.txt" ); if ( zFile.open(QIODevice::WriteOnly,info) ) { QByteArray all_info(R"(<root> <vertexFile>vertex</vertexFile> <vertexIndex>index</vertexIndex> <vertexSize>)"); all_info += QString("%1").arg(points.size()) ; all_info += "</vertexSize>\n"; all_info += "<indexSize>"; all_info += QString("%1").arg(triangles.size()*3); all_info += "</indexSize>\n"; all_info += "<xMax>"; all_info += QString("%1").arg(xMax); all_info += "</xMax>\n"; all_info += "<yMax>"; all_info += QString("%1").arg(yMax); all_info += "</yMax>\n"; all_info += "<zMax>"; all_info += QString("%1").arg(zMax); all_info += "</zMax>\n"; all_info += "<yMin>"; all_info += QString("%1").arg(yMin); all_info += "</yMin>\n"; all_info += "<zMin>"; all_info += QString("%1").arg(zMin); all_info += "</zMin>\n"; all_info += "<xMin>"; all_info += QString("%1").arg(xMin); all_info += "</xMin>\n"; all_info += "</root>"; zFile.write( all_info ); } else { return false; } } { QuaZipFile zFile(&zip); QuaZipNewInfo info("vertex"); if (zFile.open(QIODevice::WriteOnly, info)) { QDataStream dStream( &zFile ); dStream.setVersion(QDataStream::Version::Qt_5_5); for ( const auto & i:points ) { dStream << i.x; dStream << i.y; dStream << i.z; } } else { return false; } } { QuaZipFile zFile(&zip); QuaZipNewInfo info("index"); if (zFile.open(QIODevice::WriteOnly, info)) { QDataStream dStream(&zFile); dStream.setVersion(QDataStream::Version::Qt_5_5); auto ri = triangles.begin(); auto re = triangles.end(); for (;ri!=re;++ri) { dStream << ri->first; dStream << ri->second; dStream << ri->third; } } else { return false; } } return true; #else return false; #endif }/*saveFile**********************************/
bool VertexElementCallBack::loadFile(const std::string & fileName) { //QXmlStreamReader #ifdef QT_CORE_LIB QuaZip zip( QString::fromLocal8Bit(fileName.data()) ); if (zip.open(QuaZip::Mode::mdUnzip) == false) { return false; } std::map<QString, QString> infoFile; { if (zip.setCurrentFile("info.txt")==false) { return false; } QuaZipFile zFile(&zip); if (zFile.open( QIODevice::ReadOnly | QFile::Text)==false) { return false; } QXmlStreamReader reader( &zFile ); bool has__error = reader.hasError(); bool at__end = reader.atEnd(); while ( (!has__error)&&(!at__end) ){ const auto item_type = reader.readNext(); if(item_type== QXmlStreamReader::StartElement){ const QString name__ = reader.name().toString() ; if (name__ == "root") { continue; } const QString value__ = reader.readElementText(); infoFile[name__] = value__; } has__error = reader.hasError(); at__end = reader.atEnd(); }//~while } const auto & file_info = infoFile; const auto end_info = file_info.end(); {//顶点索引空间准备 auto i = file_info.find("indexSize"); if (i == end_info) { return false; } auto index__size = i->second.toULong(); this->triangles.clear(); this->triangles.reserve( index__size/3 ); } {//顶点空间准备 auto i = file_info.find("vertexSize"); if (i == end_info) { return false; } auto vertex__size = i->second.toULong(); this->points.clear(); this->points.reserve(vertex__size); } { auto i = file_info.find("zMax"); if (i == end_info) { return false; } zMax = i->second.toFloat(); } { auto i = file_info.find("zMin"); if (i == end_info) { return false; } zMin = i->second.toFloat(); } { auto i = file_info.find("xMax"); if (i == end_info) { return false; } xMax = i->second.toFloat(); } { auto i = file_info.find("xMin"); if (i == end_info) { return false; } xMin = i->second.toFloat(); } { auto i = file_info.find("yMax"); if (i == end_info) { return false; } yMax = i->second.toFloat(); } { auto i = file_info.find("yMin"); if (i == end_info) { return false; } yMin = i->second.toFloat(); } {//读取索引 auto i = file_info.find("vertexIndex"); if (i == end_info) { return false; } if (zip.setCurrentFile(i->second) == false) { return false; } QuaZipFile zFile(&zip); if (zFile.open(QIODevice::ReadOnly ) == false) { return false; } QDataStream dStream(&zFile); dStream.setVersion(QDataStream::Version::Qt_5_5); Face face; while ( !dStream.atEnd() ){ dStream >> face.first; dStream >> face.second; dStream >> face.third; triangles.push_back(face); } } {//读顶点 auto i = file_info.find("vertexFile"); if (i == end_info) { return false; } if (zip.setCurrentFile(i->second) == false) { return false; } QuaZipFile zFile(&zip); if (zFile.open(QIODevice::ReadOnly) == false) { return false; } QDataStream dStream(&zFile); dStream.setVersion(QDataStream::Version::Qt_5_5); gl::Point3 point; while (!dStream.atEnd()) { dStream >> point.x; dStream >> point.y; dStream >> point.z; points.push_back(point); } } return true; #else return false; #endif }//loadFile//