QT 4.0.1 : datei öffnen nach download



  • Hallo zusammen
    ich hoffe, hier werde ich geholfen.. hab schon in nem anderen forum gefragt, aber da waren halt keine spezialisten ^^

    also, mein problem:
    ich hab in einem programm einen download von nem file. dieses file werte ich danach aus. der download funktioniert (habe das file-downloadbeispiel von qt als basis dafür genommen) und das file ist dann auch da. blöderweise wird es nicht ausgewertet, erst wenn ich die anweisung nochmal starte (also nochmal auf den button klick) tuts die datei auswerten.
    ich dachte erst, das könnte daran liegen, dass das betriebssystem ein wenig zeit braucht, um die datei abzuschliessen, aber auch eine pause wie die folgende funktionierte nicht:

    time_t stamp;
        time_t test;
        stamp =  clock()/CLOCKS_PER_SEC; // zeit, solange das prog schon läuft in sekunden
        do
        {
                test =  clock()/CLOCKS_PER_SEC;
        } while (test != (stamp+4)); // 4 sekunden warten
    

    (hab C dafür genommen, da die sleepfunktionen bei C++ plattformabhängig zu sein scheinen (usleep(int) bei linux, msleep(int) bei windows) und präprozessorspielereien find ich unschön)

    ich kopier mal den code der stellen rein

    datei downloaden:
    im ctor:

    http = new QHttp(this);
    	connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(httpRequestFinished(int, bool)));
        connect(http, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
        connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)), this, SLOT(readResponseHeader(const QHttpResponseHeader &)));
    
        progressDialog = new QProgressDialog(this);
    

    die funktionen für den download:

    void DA::getFilePerHttp() {
    	qsUrl = new QString("http://");
    	qsUrl->append(leName->text());
    	qsUrl->append(".deviantart.com/friends/index.php");
    
    	QUrl url(*qsUrl);
    	QFileInfo fileInfo(url.path());
    	QString fileName = fileInfo.fileName();
    
    	file = new QFile(fileName);
    	if (!file->open(QIODevice::WriteOnly)) {
    		QMessageBox::information(this, tr("dALM"), tr("Unable to save the Namelist: %1.").arg(file->errorString()));
    		delete file;
    		file = 0;
    		return;
    	}
    
    	http->setHost(url.host(), 80);
    	if (!url.userName().isEmpty()) http->setUser(url.userName(), url.password());
    
        httpRequestAborted = false;
        httpGetId = http->get(url.path(), file);
    
        progressDialog->setWindowTitle(tr("HTTP"));
        progressDialog->setLabelText(tr("Downloading %1.").arg(fileName));
    }
    
    void DA::httpRequestFinished(int requestId, bool error)
    {
        if (httpRequestAborted) {
            if (file) {
                file->close();
                file->remove();
                delete file;
                file = 0;
            }
    
            progressDialog->hide();
            return;
        }
    
        if (requestId != httpGetId)
            return;
    
        progressDialog->hide();
        file->close();
    
        if (error) {
            file->remove();
            QMessageBox::information(this, tr("dALM"),
                                     tr("Downloading of namelist failed: %1.")
                                     .arg(http->errorString()));
        }
        delete file;
        file = 0;
        getPureNamesFromHtmlInput(); // hier rufe ich die funktion auf, die die datei bearbeitet
    }
    
    void DA::readResponseHeader(const QHttpResponseHeader &responseHeader)
    {
        if (responseHeader.statusCode() != 200) {
            QMessageBox::information(this, tr("dALM"),
                                     tr("Downloading of namelist failed: %1.")
                                     .arg(responseHeader.reasonPhrase()));
            httpRequestAborted = true;
            progressDialog->hide();
            http->abort();
            return;
        }
    }
    
    void DA::updateDataReadProgress(int bytesRead, int totalBytes)
    {
        if (httpRequestAborted) return;
    
        progressDialog->setMaximum(totalBytes);
        progressDialog->setValue(bytesRead);
    }
    

    und nun noch die funktion zum bearbeiten (bzw. auslesen) der datei:

    void DA::getPureNamesFromHtmlInput() {
    	time_t stamp;
        time_t test;
    
        stamp =  clock()/CLOCKS_PER_SEC;
    
        do
        {
                test =  clock()/CLOCKS_PER_SEC;
        } while (test != (stamp+4));
    	//read input file
    	ifstream inpFil;
    	inpFil.open("./index.php");
    	if (!inpFil.is_open()) {
    		QMessageBox::information(this, tr("dALM"), tr("error opening index.php"));
    	} else {
    		char cTemp[1000];
    		QString sTemp;
    		bool bStart = false;
    		int iPosition = 0;
    		QString sName = "";
    		while(inpFil){
    			inpFil.getline(cTemp, 1000);
    			if (inpFil){
    				sTemp = cTemp;
    				if (!bStart) {
    					if (sTemp.indexOf("first odd", 0) != -1) bStart = true;
    				} else {
    					if (sTemp.indexOf(".deviantart.com", 0) != -1) {
    						QString sUppCase = "</a>";
    						if (sTemp.indexOf("</a>", 0) == -1) sUppCase = "</A>";
    						iPosition = sTemp.indexOf(".deviantart.com/", 0) + 18;
    						for (int i = iPosition; i < sTemp.indexOf(sUppCase, 0); ++i) {
                                sName.append(sTemp[i]);
    						}
    						vNames.push_back(sName.toLower());
    						sName = "";
    					} // if (sTemp.indexOf(".deviantart.com", 0) != -1)
    				} // if - else (!bStart)
    			} // if (inpFil)
    		} // while (inpFil)
    	} // if - else (!inpFil.is_open())
    } // getPureNamesFromHtmlInput()
    

    das textfeld, indem ich später die vNames ausgeb, bleibt aber leer..

    könnt ihr mir vieleicht helfen? langsam verlier ich die hoffnung..
    danke schon im voraus, auch an alle, die bis jetzt gelesen haben.

    den gesamten quellcode, die qt4-dll's um zu starten, das kompilierte programm sowie die MinGW-makefiles (wobei das debug-makefile bei mir ned gehen will, nur make release funktioniert) hab ich mal -> hier <- hochgeladen, falls das was bringt.
    die übrigen funktionen hab ich ziemlich exzessiv kommentiert (mehr als ich normalerweise würde). die anderen funktionen gehen alle. falls ihr das programm selbst starten wollt, nehmt zuoberst den 2. radiobutton und gebt für ne rel. kleine datei "klaue" ins textfeld, für ne eher grosse "jark" (falls ihr mitglied bei deviantart seid, könnt ihr auch euren eigenen probieren) und danach auf generate klicken. im unteren textfeld sollte dann eigentlich was erscheinen..

    ps: die funktion zum dateiauslesen hab ich seperat getestet (bzw. die datei manuell in den ordner getan) und das funktionierte. auch der download funktioniert, nach durchlauf hab ich eine datei (index.php) mit dem richtigen inhalt und -grösse in demselben ordner. nur das zusammenspiel funktioniert nicht ganz..

    //Codetags fixed



  • sorry, hab den code-tag verhauen und das erst zu spät bemerkt. hier nochmal schöner formatiert:

    (und nun noch die funktion zum bearbeiten (bzw. auslesen) der datei:)

    void DA::getPureNamesFromHtmlInput() {
    	time_t stamp;
        time_t test;
    
        stamp =  clock()/CLOCKS_PER_SEC;
    
        do
        {
                test =  clock()/CLOCKS_PER_SEC;
        } while (test != (stamp+4));
    	//read input file
    	ifstream inpFil;
    	inpFil.open("./index.php");
    	if (!inpFil.is_open()) {
    		QMessageBox::information(this, tr("dALM"), tr("error opening index.php"));
    	} else {
    		char cTemp[1000];
    		QString sTemp;
    		bool bStart = false;
    		int iPosition = 0;
    		QString sName = "";
    		while(inpFil){
    			inpFil.getline(cTemp, 1000);
    			if (inpFil){
    				sTemp = cTemp;
    				if (!bStart) {
    					if (sTemp.indexOf("first odd", 0) != -1) bStart = true;
    				} else {
    					if (sTemp.indexOf(".deviantart.com", 0) != -1) {
    						QString sUppCase = "</a>";
    						if (sTemp.indexOf("</a>", 0) == -1) sUppCase = "</A>";
    						iPosition = sTemp.indexOf(".deviantart.com/", 0) + 18;
    						for (int i = iPosition; i < sTemp.indexOf(sUppCase, 0); ++i) {
                                sName.append(sTemp[i]);
    						}
    						vNames.push_back(sName.toLower());
    						sName = "";
    					} // if (sTemp.indexOf(".deviantart.com", 0) != -1)
    				} // if - else (!bStart)
    			} // if (inpFil)
    		} // while (inpFil)
    	} // if - else (!inpFil.is_open())
    } // getPureNamesFromHtmlInput()
    

    //Edit: cpp tags


Anmelden zum Antworten