web-dev-qa-db-fra.com

Comment vérifier si le fichier existe dans Qt dans c ++

Comment vérifier si un fichier existe dans un chemin donné ou non dans Qt?

Mon code actuel est ci-dessous:

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

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

Mais lorsque j'exécute le code, le message d'erreur spécifié dans handleError ne s'affiche pas, même si le fichier mentionné dans le chemin n'existe pas.

70
user1322915

(TL; DR en bas)

J'utiliserais la classe QFileInfo--- (docs ) - c'est exactement ce pour quoi elle est faite:

La classe QFileInfo fournit des informations sur les fichiers indépendants du système.

QFileInfo fournit des informations sur le nom et la position (chemin d'accès) d'un fichier dans le système de fichiers, ses droits d'accès, qu'il s'agisse d'un répertoire ou d'un lien symbolique, etc. La taille du fichier et les dernières heures de lecture/modification sont également disponibles. QFileInfo peut également être utilisé pour obtenir des informations sur une ressource Qt.

C'est le code source pour vérifier si un fichier existe:

#include <QFileInfo>

(n'oubliez pas d'ajouter la déclaration #include correspondante)

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;
    }
}

Prenez également en compte: Voulez-vous uniquement vérifier si le chemin existe (exists()) ou voulez-vous également vérifier qu'il s'agit d'un fichier et non d'un répertoire (isFile())?

Attention : La documentation de la fonction exists()- dit:

Renvoie true si le fichier existe. sinon retourne faux.

Remarque: Si le fichier est un lien symbolique pointant vers un fichier non existant, la valeur false est renvoyée.

Ce n'est pas précis. Cela devrait être:

Renvoie true si le chemin (fichier ou répertoire) existe; sinon retourne faux.


TL; DR

(avec la version abrégée de la fonction ci-dessus, en enregistrant quelques lignes de code)

#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 pour Qt> = 5.2

(en utilisant exists comme static qui a été introduit dans Qt 5.2; la documentation dit que la fonction statique est plus rapide, bien que je ne sois pas sûr que ce soit toujours le cas lorsque vous utilisez également la méthode isFile(); du moins c'est un one-liner alors)

#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

Vous pouvez utiliser la méthode QFileInfo::exists():

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

Si vous voulez qu'il retourne true que si le fichier existe et false si le chemin existe mais est un dossier, vous pouvez le combiner avec QDir::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
}
11
Donald Duck

Le code que vous avez posté est correct. Les chances sont que quelque chose d'autre est faux.

Essayez de mettre ceci:

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

dans votre fonction handleError. Si le message ci-dessus s'imprime, vous savez que le problème est différent.

8
Anthony

Voilà comment je vérifie si la base de données existe:

#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 !";
}

Avec SQLite, il est difficile de vérifier si la base de données existe, car elle crée automatiquement une nouvelle base de données si elle n'existe pas.

4
Essetee

Je ne voudrais rien utiliser de Qt, mais juste l'ancien standard access:

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