6 Stimmen

Qt wie eine Datei im aktuellen Verzeichnis zu öffnen? oder was ist falsch mit diesem?

Ich versuche, eine Xml-Datei am aktuellen Speicherort der ausführbaren Datei zu öffnen

        QString path = QDir::currentPath();
        path.append("/acc.xml");
        QFile file(path);

        if(!file.open(QIODevice::ReadOnly))
        {
            insertItem("IO ERR");
        }
  • Wenn ich es von Qt Creator aus ausführe, funktioniert alles. currentPath() gibt den Pfad zum Ordner der ausführbaren Datei zurück

  • Wenn ich zu project-build-desktop/ und versuchen Sie, es manuell auszuführen currentPath() gibt zurück. /home/user/Documents

エディテージ

auch mit dem gleichen Ergebnis versucht:

Qt::current().path();
Qt::current().absolutePath();

12voto

Johnny Punkte 1958

Versuchen Sie, QCoreApplication::applicationDirPath() anstelle von QDir::currentPath() zu verwenden.

Für weitere Informationen siehe http://doc.qt.io/qt-5/qcoreapplication.html#applicationDirPath

2voto

Donotalo Punkte 12360

Prüfen Sie den zurückgegebenen Wert von QDir::currentPath() . Ich denke, wenn Sie Qt Creator ausführen, wird der Pfad zurückgegeben, in dem sich die Projektdatei (*.pro) befindet. Wenn Sie es von außen ausführen, erhalten Sie den Pfad der Binärdatei.

bearbeiten

Ich habe nie mit Linux gearbeitet. Sie können jedoch andere Funktionen/Kombinationen aus QDir :

  • QDir::current().path()
  • QDir::current().absolutePfad()

usw.

2voto

Dat Chu Punkte 10292

Um eine Datei im aktuellen Verzeichnis zu öffnen, rufen Sie einfach den QFile-Konstruktor auf

Ich habe dies auf meinem Linux-Rechner getestet und es funktioniert

#include <QtCore>

int main(int argc, char** argv){
    QFile some_file("test.xml");
    if(!some_file.open(QIODevice::ReadOnly | QIODevice::Text)){
        qDebug() << "Unable to open file";
    } else {
        qDebug() << "File open successfully";
    }
    exit(-1);
}

Ich führe ./TestQFile aus, und wenn sich eine test.xml im aktuellen Verzeichnis befindet, funktioniert es.

UPDATE: Mir ist aufgefallen, dass der Wortlaut Ihrer Frage besagt, dass Sie die Datei im selben Verzeichnis wie die ausführbare Datei haben wollen. Dies kann wie folgt erreicht werden:

// Getting directory of the executable
QFileInfo exec_fileinfo(argv[0]);
qDebug() << "Executable is in" << exec_fileinfo.absolutePath();

UPDATE 2: Unter dem Projektfenster von QtCreator gibt es ein Feld für das Arbeitsverzeichnis. Dies ist das Verzeichnis, das von QDir::currentPath() zurückgegeben wird, wenn Sie es über QtCreator ausführen.

2voto

sakisk Punkte 1729

Ich habe diese Diskussion bei der Suche nach einer ähnlichen Lösung gefunden. Ich denke, dass der portabelste Weg, eine externe Datei zu öffnen, die einen festen Namen hat (und an der keine Dialoge und der Benutzer beteiligt sind), darin besteht, die Ressourcen-System .

In meinem Fall habe ich eine neue Ressourcendatei mit dem Präfix /config und fügte die Datei (namens settings.xml ). Innerhalb des Codes brauche ich überhaupt keine Pfadfunktionen zu verwenden. Ich verwende stattdessen das Ressourcensystem. Daher ist ein Aufruf wie QFile file(":/config/settings.xml") funktioniert gut. Ich verwende QT creator 2.0.1 und QT 4.7 unter Windows.

0voto

Med Okl Punkte 72

Mein Tipp ist folgender: Name der Datei + den absoluten Pfad zu dieser Datei bevor sie geöffnet wird. Dazu rufe ich die Methode applicationDirPath über unser QCoreApplication Objekt (das a Objekt in meinem Fall), das uns den Pfad zur ausführbaren Datei der Anwendung liefert. Es ist nicht nötig, durch die argv Array. Das war's und funktioniert

 int main(int argc, char *argv[]) {
   QCoreApplication a(argc, argv);
   const QString fileName = "someJsonFile.JSON";
   const QString currentExecDir = a.applicationDirPath();
   QFile myFile(currentExecDir + '/' + fileName);
   if (myFile.open(QIODevice::ReadOnly)) {
    qDebug()<< "The file "<< fileName<< " has been opened successfully";
   }
   else {
     qDebug()<< "Failed to open file "<< fileName<< " in "<< currentExecDir;
   }
   return a.exec();
}

ANMERKUNG Bitte lesen Sie die Qt-Dokumente für das applicationDirPath Methode, da sie davon ausgeht, dass das aktuelle Verzeichnis nicht von der Anwendung geändert wurde

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X