Seite 1 von 1

Problem mit Quazip

Verfasst: 22. Oktober 2010 10:34
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?

Verfasst: 22. Oktober 2010 12:10
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);
     }

Verfasst: 25. Oktober 2010 12:08
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!!!

Verfasst: 25. Oktober 2010 14:14
von padreigh
:arrow: [gelöst]