Reputation: 1291
How do I check whether a file exists in a given path or not in Qt?
My current code is below:
QFile Fout("/Users/Hans/Desktop/result.txt");
if(!Fout.exists())
{
eh.handleError(8);
}
else
{
// ......
}
But when I run the code it is not giving the error message specified in handleError
even though the file I mentioned in the path does not exist.
Upvotes: 88
Views: 103701
Reputation: 3143
(TL;DR at the bottom)
I would use the QFileInfo
class (docs) – this is exactly what it is made for:
The QFileInfo class provides system-independent file information.
QFileInfo provides information about a file's name and position (path) in the file system, its access rights and whether it is a directory or symbolic link, etc. The file's size and last modified/read times are also available. QFileInfo can also be used to obtain information about a Qt resource.
Here is a function which checks whether a file exists:
#include <QFileInfo>
(don't forget to add the corresponding #include
statement)
bool fileExists(QString path) {
QFileInfo check_file(path);
// check if file exists and if yes: Is it really a file and not a directory?
if (check_file.exists() && check_file.isFile()) {
return true;
} else {
return false;
}
}
Also consider: Do you only want to check if the path exists (exists()
) or do you want to also make sure that this is a file and not a directory (isFile()
)?
Be careful: The documentation of the exists()
function says:
Returns
true
if the file exists; otherwise returnsfalse
.Note: If file is a symlink that points to a non-existing file, false is returned.
This is not precise. It should be:
Returns
true
if the path (i.e. file or directory) exists; otherwise returnsfalse
.
TL;DR
(a shorter version of the function above, saving a few lines of code)
#include <QFileInfo>
bool fileExists(QString path) {
QFileInfo check_file(path);
// check if path exists and if yes: Is it really a file and not a directory?
return check_file.exists() && check_file.isFile();
}
TL;DR for Qt >=5.2
(using exists
as a static
which was introduce in Qt 5.2; the docs say the static function is faster, though I'm not sure this is still the case when also using the isFile()
method; at least this is a one-liner then)
#include <QFileInfo>
// check if path exists and if yes: Is it a file and not a directory?
bool fileExists = QFileInfo::exists(path) && QFileInfo(path).isFile();
Upvotes: 113
Reputation: 8892
You can use the QFileInfo::exists()
static method:
#include <QFileInfo>
if(QFileInfo::exists("C:\\exampleFile.txt")){
//The file exists
}
else{
//The file doesn't exist
}
If you want it to return true
only if the file exists and false
if the path exists but is a folder, you can combine it with QDir::exists()
:
#include <QFileInfo>
#include <QDir>
QString path = "C:\\exampleFile.txt";
if(QFileInfo::exists(path) && !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
}
Upvotes: 16
Reputation: 63
That's how I check if the database exists:
#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 !";
}
With SQLite
it's difficult to check if the database exists, because it automatically creates a new database if it doesn't exist.
Upvotes: 3
Reputation: 8788
The code you've posted is correct. Chances are that something else is wrong.
Try putting this:
qDebug() << "Function is being called.";
inside of your handleError function. If the above message prints, you know something else is the problem.
Upvotes: 8
Reputation: 490148
I would skip using anything from Qt at all, and just use the old standard access
:
if (0==access("/Users/Hans/Desktop/result.txt", 0))
// it exists
else
// it doesn't exist
Upvotes: 1