PlotterHMI/datafile/zip/zipreader.cpp
2024-02-06 14:19:53 +08:00

90 lines
1.9 KiB
C++

#include "zipreader.h"
#include <QFile>
ZipReader::ZipReader(const QString &filePath) :
#ifdef UNICODE
m_reader(OpenZip(reinterpret_cast<const wchar_t*>(filePath.utf16()),nullptr))
#else
m_reader(OpenZip(filePath.toUtf8().constData(),nullptr))
#endif
{
init();
}
ZipReader::ZipReader(QIODevice *device)
{
QFile *file = dynamic_cast<QFile*>(device);
if(nullptr != file)
{
QString strFile = file->fileName();
file->close();
#ifdef UNICODE
m_reader = OpenZip(reinterpret_cast<const wchar_t*>(strFile.utf16()),nullptr);
#else
m_reader = OpenZip(strFile.toUtf8().constData(),nullptr);
#endif
}
else
{
m_reader = OpenZip(device->readAll().data(),device->size(),nullptr);
}
init();
}
ZipReader::~ZipReader()
{
CloseZip(m_reader);
}
void ZipReader::init()
{
ZIPENTRY entry;
GetZipItem(m_reader,-1,&entry);
int nItems = entry.index;
for(int zi=0; zi<nItems; zi++)
{
GetZipItem(m_reader,zi,&entry);
#ifdef UNICODE
m_filePaths.append(QString::fromWCharArray(entry.name));
#else
m_filePaths.append(QString::fromUtf8(entry.name));
#endif
}
}
bool ZipReader::exists() const
{
return IsZipHandleU(m_reader);
}
QStringList ZipReader::filePaths() const
{
return m_filePaths;
}
QByteArray ZipReader::fileData(const QString &fileName) const
{
ZIPENTRY entry;
int i=-1;
#ifdef UNICODE
std::wstring strFile = fileName.toStdWString();
FindZipItem(m_reader,strFile.c_str(),true,&i,&entry);
#else
FindZipItem(m_reader,fileName.toUtf8().constData(),true,&i,&entry);
#endif
if(entry.unc_size < 0 || i<0)
{
return QByteArray("");
}
char*pBuf = new char[entry.unc_size +1];
QByteArray byteArray;
UnzipItem(m_reader,i,pBuf,entry.unc_size);
byteArray.append(pBuf,entry.unc_size);
delete []pBuf;
return byteArray;
}