Comment vérifier si le fichier existe dans Qt en 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 quand je lance le code, il ne donne pas le message d’erreur spécifié dans handleError même si le fichier que j’ai mentionné dans le chemin n’existe pas.

(TL; DR en bas)

J’utiliserais la classe QFileInfo ( docs ) – c’est exactement ce pour quoi:

La classe QFileInfo fournit des informations de fichier indépendantes du système.

QFileInfo fournit des informations sur le nom et la position d’un fichier (chemin d’access) dans le système de fichiers, ses droits d’access, son répertoire, son lien symbolique, etc. La taille du fichier et les derniers temps modifiés / lus sont également disponibles. QFileInfo peut également être utilisé pour obtenir des informations sur une ressource Qt.

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

 #include  

(n’oubliez pas d’append le #include correspondant)

 bool fileExists(QSsortingng 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; } } 

Considérez également: Voulez-vous seulement vérifier si le chemin existe ( exists() ) ou voulez-vous également vous assurer qu’il s’agit d’un fichier et non d’un répertoire ( isFile() )?

Attention : la documentation de la fonction exist exists() dit:

Renvoie true si le fichier existe; sinon retourne faux.

Remarque: Si le fichier est un lien symbolique qui pointe vers un fichier non existant, false est renvoyé.

Ce n’est pas précis. CA devrait etre:

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


TL; DR

(avec une version plus courte de la fonction ci-dessus, en enregistrant quelques lignes de code)

 #include  bool fileExists(QSsortingng 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

(utiliser exists tant que static qui a été introduit dans Qt 5.2; les documents disent que la fonction statique est plus rapide, bien que je ne suis pas sûr que ce soit toujours le cas lorsque la méthode isFile() utilisée. puis)

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

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."; 

à l'intérieur de votre fonction handleError. Si le message ci-dessus s'imprime, vous savez que le problème est autre chose.

Vous pouvez utiliser la QFileInfo::exists() :

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

Si vous voulez qu’il ne 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  #include  QSsortingng 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 } 

C’est comme ça que je vérifie si la firebase database existe:

 #include  #include  #include  #include  #include  QSsortingng 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 firebase database existe, car elle crée automatiquement une nouvelle firebase database si elle n'existe pas.

Je ne voudrais absolument rien utiliser de Qt, et il suffit d’utiliser l’ancien access standard:

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