wake-up-neo.com

So prüfen Sie, ob eine Datei in Qt in c ++ vorhanden ist

Wie überprüfe ich, ob eine Datei in einem bestimmten Pfad in Qt existiert oder nicht?

Mein aktueller Code ist unten:

QFile Fout("/Users/Hans/Desktop/result.txt");

if(!Fout.exists()) 
{       
  eh.handleError(8);
}  
else
{
  // ......
}

Wenn ich den Code ausführe, wird die in handleError angegebene Fehlermeldung nicht angezeigt, obwohl die im Pfad angegebene Datei nicht vorhanden ist.

70
user1322915

(TL; DR unten)

Ich würde die QFileInfo- Klasse ( docs ) verwenden - genau dafür ist sie gemacht:

Die QFileInfo-Klasse stellt systemunabhängige Dateiinformationen bereit.

QFileInfo liefert Informationen über den Namen und die Position (Pfad) einer Datei im Dateisystem, ihre Zugriffsrechte und ob es sich um ein Verzeichnis oder eine symbolische Verknüpfung handelt usw. Die Dateigröße und die letzten Änderungs-/Lesezeiten sind ebenfalls verfügbar. Mit QFileInfo können auch Informationen zu einer Qt-Ressource abgerufen werden.

Dies ist der Quellcode, um zu überprüfen, ob eine Datei existiert:

#include <QFileInfo>

(vergessen Sie nicht, die entsprechende #include - Anweisung hinzuzufügen)

bool fileExists(QString path) {
    QFileInfo check_file(path);
    // check if file exists and if yes: Is it really a file and no directory?
    if (check_file.exists() && check_file.isFile()) {
        return true;
    } else {
        return false;
    }
}

Beachten Sie auch: Wollen Sie nur überprüfen, ob der Pfad existiert (exists()) oder wollen Sie auch sicherstellen, dass dies eine Datei und kein Verzeichnis ist (isFile())?

Seien Sie vorsichtig : In der Dokumentation der exists()- -Funktion heißt es:

Gibt true zurück, wenn die Datei existiert. Andernfalls wird false zurückgegeben.

Hinweis: Wenn es sich bei der Datei um einen Symlink handelt, der auf eine nicht vorhandene Datei verweist, wird false zurückgegeben.

Dies ist nicht genau. Es sollte sein:

Gibt true zurück, wenn der Pfad (d. H. Datei oder Verzeichnis) vorhanden ist. Andernfalls wird false zurückgegeben.


TL; DR

(mit einer kürzeren Version der obigen Funktion, die einige Codezeilen spart)

#include <QFileInfo>

bool fileExists(QString path) {
    QFileInfo check_file(path);
    // check if path exists and if yes: Is it really a file and no directory?
    return check_file.exists() && check_file.isFile();
}

TL; DR für Qt> = 5.2

(mit exists als static, das in Qt 5.2 eingeführt wurde; die Dokumentation besagt, dass die statische Funktion schneller ist, obwohl ich nicht sicher bin, ob dies auch bei Verwendung immer noch der Fall ist die isFile() -Methode; zumindest ist dies dann ein Einzeiler)

#include <QFileInfo>

// check if path exists and if yes: Is it a file and no directory?
bool fileExists = QFileInfo::exists(path) && QFileInfo(path).isFile();
91
mozzbozz

Sie können die Methode QFileInfo::exists() verwenden:

#include <QFileInfo>
if(QFileInfo("C:\\exampleFile.txt").exists()){
    //The file exists
}
else{
    //The file doesn't exist
}

Wenn Sie möchten, dass true nur zurückgegeben wird, wenn file vorhanden ist, und false, wenn der Pfad vorhanden ist, aber ein Ordner ist, können Sie ihn mit QDir::exists() kombinieren. :

#include <QFileInfo>
#include <QDir>
QString path = "C:\\exampleFile.txt";
if(QFileInfo(path).exists() && !QDir(path).exists()){
    //The file exists and is not a folder
}
else{
    //The file doesn't exist, either the path doesn't exist or is the path of a folder
}
11
Donald Duck

Der von Ihnen eingegebene Code ist korrekt. Möglicherweise stimmt etwas anderes nicht.

Versuchen Sie Folgendes:

qDebug() << "Function is being called.";

innerhalb Ihrer handleError-Funktion. Wenn die obige Meldung gedruckt wird, wissen Sie, dass etwas anderes das Problem ist.

8
Anthony

So überprüfe ich, ob die Datenbank existiert:

#include <QtSql>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QFileInfo>

QString db_path = "/home/serge/Projects/sqlite/users_admin.db";

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(db_path);

if (QFileInfo::exists(db_path))
{
    bool ok = db.open();
    if(ok)
    {
        qDebug() << "Connected to the Database !";
        db.close();
    }
}
else
{
    qDebug() << "Database doesn't exists !";
}

Mit SQLite ist es schwierig zu überprüfen, ob die Datenbank existiert, da automatisch eine neue Datenbank erstellt wird, wenn sie nicht existiert.

4
Essetee

Ich würde alles von Qt auslassen und einfach den alten Standard access verwenden:

if (0==access("/Users/Hans/Desktop/result.txt", 0))
    // it exists
else
    // it doesn't exist
1
Jerry Coffin