Problem mit Quazip

Alles rund um die Programmierung mit Qt
Antworten
Scary Hallo

Problem mit Quazip

Beitrag von Scary Hallo »

Hallo,

ich versuche mit Quazip aus einem Ziparchiv ein Textfile zu lesen und die einzelnen Linien in ein QStringList zu schreiben. Das klappt auch einigermaßen bis auf eins. Die Funktion readLine ( char * data, qint64 maxSize ) sollte -1 zurückgeben, wenn keine Linie mehr da ist, zum Lesen. Macht sie aber bei mir nicht.
Hier der Code:

Code: Alles auswählen

bool ZipHelper::ReadZip(QString archivePath, QString zipFile, QStringList* pText)
{
    QuaZip zip(archivePath);

    if(!zip.open(QuaZip::mdUnzip)) {
        qWarning("testRead(): zip.open(): %d", zip.getZipError());
        return false;
    }

//   zip.setFileNameCodec("IBM866");

    qDebug("%d entries\n", zip.getEntriesCount());

    QuaZipFileInfo info;
    zip.goToFirstFile();
    zip.getCurrentFileInfo(&info);

    QuaZipFile file(&zip);

    if(!zip.setCurrentFile(zipFile))
    {
        //QFile out;
        qDebug() << "Error in Zipfile: " << zipFile;
        return false;
    }


    qDebug() << "ZipFileName: " << file.getActualFileName();

    if(!file.open(QIODevice::ReadOnly)) {
                qWarning("testRead(): file.open(): %d", file.getZipError());
                return false;
    }

    char buf[512];

    qint64 x = 1;
    qint16 i = 0;
 

    do{
            x = file.readLine(buf, 512);
            qDebug() << "x." << i << " = " << x;

            pText->append(buf);

            i++;
        }while(i < 1000 );

    file.close();

    return true;

}
Hat jemand ne Idee?
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Hab das noch nie Benutzt aber grad mal in die Api geschaut:

http://quazip.sourceforge.net/classQuaZipFile.html
This is the most interesting class. Not only it provides C++ interface to the ZIP/UNZIP package, but also integrates it with Qt by subclassing QIODevice. This makes possible to access files inside ZIP archive using QTextStream or QDataStream, for example. Actually, this is the main purpose of the whole QuaZIP library.
Also warum das rumgebuffere ... nimm nen QTextStream dafür ;) Ein Beispiel für Zeilenweises einlesen für ein QFile ist in dessen Doku zu finden:

Code: Alles auswählen

 QFile file("in.txt");
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
         return;

     QTextStream in(&file);
     while (!in.atEnd()) {
         QString line = in.readLine();
         process_line(line);
     }
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Scary Hallo

Beitrag von Scary Hallo »

Vielen Dank,

das war genau das was ich will. Ich liebe das 'rumgebuffere' auch nicht. Für jeden der genauso auf der Leitung steht wie ich; hier meine Lösung:

Code: Alles auswählen

bool ZipHelper::ReadZip(QString archivePath, QString zipFile, QStringList* pText)
{
    QuaZip zip(archivePath);

    if(!zip.open(QuaZip::mdUnzip)) {
        qWarning("testRead(): zip.open(): %d", zip.getZipError());
        return false;
    }

    QuaZipFile file(&zip);

    if(!zip.setCurrentFile(zipFile))
    {
        qDebug() << "Error in Zipfile: " << zipFile;
        return false;
    }

    if(!file.open(QIODevice::ReadOnly)) {
                qWarning("testRead(): file.open(): %d", file.getZipError());
                return false;
    }
    QTextStream inStream(&file);
    while(!inStream.atEnd())
    {
        pText->append(inStream.readLine());
    }
    file.close();
    return true;
}
Vielen Dank für die Hilfe!!!
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

:arrow: [gelöst]
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Antworten