Wie überprüfe ich, ob eine Datei in einem bestimmten Pfad in Qt vorhanden ist 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 jedoch nicht die angegebene Fehlermeldung ausgegeben handleError
, obwohl die im Pfad erwähnte Datei nicht vorhanden ist.
c++
qt
file-exists
user1322915
quelle
quelle
Antworten:
(TL; DR unten)
Ich würde die
QFileInfo
-class ( docs ) verwenden - genau dafür ist es gemacht:Dies ist der Quellcode, um zu überprüfen, ob eine Datei vorhanden ist:
#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: Möchten Sie nur überprüfen, ob der Pfad vorhanden ist (
exists()
), oder möchten Sie auch sicherstellen, dass dies eine Datei und kein Verzeichnis ist (isFile()
)?Seien Sie vorsichtig : Die Dokumentation der Funktion
exists()
lautet:Das ist nicht genau. Es sollte sein:
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
(Verwenden
exists
als als,static
was in Qt 5.2 eingeführt wurde; die Dokumente sagen, dass die statische Funktion schneller ist, obwohl ich nicht sicher bin, ob dies immer noch der Fall ist, wenn auch dieisFile()
Methode verwendet wird; 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();
quelle
bool fileExists(const QString &path)
könnte weiter vereinfacht werden zu:return checkFile.exists() && checkFile.isFile();
@mozzbozztrue
! (habe es gerade auf meinem System mit Qt 5.10 getestet)exists
Funktion (static
oder nicht) gibt zurück,true
wenn der angegebene Pfad ein Verzeichnis ist. Die Frage lautete jedoch "Wie überprüfe ich, ob eine Datei vorhanden ist" (und nicht das Verzeichnis ). Schauen Sie sich das verknüpfte Code-Snippet an. Ich hoffe, das erklärt, was ich meine.Sie können die
QFileInfo::exists()
Methode verwenden:#include <QFileInfo> if(QFileInfo("C:\\exampleFile.txt").exists()){ //The file exists } else{ //The file doesn't exist }
Wenn Sie möchten, dass es
true
nur zurückgegeben wird, wenn die Datei vorhanden ist undfalse
der Pfad vorhanden ist, aber ein Ordner ist, können Sie ihn kombinieren mitQDir::exists()
:#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 }
quelle
true
, obwohl es sich "nur" um eine Datei handelt. Das OP bat darum, nach einer Datei zu suchen, nicht nach einem Pfad.false
wenn der Pfad vorhanden ist, aber ein Ordner ist, können Sie dies tunQFileInfo(path).exists() && !QDir(path).exists()
. Ich habe meine Antwort bearbeitet, um das hinzuzufügen.Der von Ihnen gepostete Code ist korrekt. Wahrscheinlich 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.
quelle
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
es schwierig ist , zu überprüfen , ob die Datenbank vorhanden ist , weil es automatisch eine neue Datenbank erstellt , wenn sie noch nicht existiert.quelle
Ich würde alles von Qt überspringen und einfach den alten Standard verwenden
access
:if (0==access("/Users/Hans/Desktop/result.txt", 0)) // it exists else // it doesn't exist
quelle
access
- sicherlich MS und die gcc-Ports. Intel verwendet die MS-Bibliothek, die dies unterstützt, und Comeau verwendet die Bibliothek des Back-End-Compilers.