2012-04-23 21 views
57

Come si verifica se un file esiste in un determinato percorso o non in Qt?Come verificare se il file esiste in Qt in C++

mio codice attuale è al di sotto:

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

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

Ma quando ho eseguito il codice che non sta dando il messaggio di errore specificato nella handleError anche se il file che ho citato nel percorso non esiste.

+1

Penso @mozzbozz di seguito può avere la risposta - non dimenticate di accettare/dare punti :) – Rachael

risposta

1

vorrei saltare utilizzando qualsiasi cosa, da Qt a tutti, e basta usare il vecchio standard access:

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

@ Styne666: Ogni compilatore di cui sono consapevole su Windows supporta 'access' - certamente MS e le porte gcc. Intel utilizza la libreria MS, che la supporta e Comeau utilizza la libreria del compilatore back-end. –

+0

Grazie per avermi fatto fare la mia ricerca. Accetto che questo possa sembrare funzionare, ma considerando [i commenti su questa risposta] (http://stackoverflow.com/a/230068/594137) continuo a pensare che attenersi alle opzioni di Qt (se hai un progetto Qt) è una soluzione migliore. –

+2

@ Styne666: Non sono affatto sicuro che Qt fornisce qualcosa per risolvere il problema per i programmi setuid/setgid, che sembra essere l'unico che conta. Hanno discusso sul significato di "cross platform" e su quali standard preoccuparsi, ma se ci interessano solo le piattaforme supportate da Qt, questi sono per lo più punti controversi. –

8

Il codice che hai postato è corretta. È probabile che qualcos'altro sia sbagliato.

provare a mettere questo:

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

all'interno della vostra funzione handleError. Se il messaggio sopra viene stampato, sai qualcos'altro è il problema.

63

Vorrei utilizzare il QFileInfo di classe (docs) - questo è esattamente ciò che è fatto per:

La classe QFileInfo fornisce informazioni sul file system-indipendente.

QFileInfo fornisce informazioni sul nome e la posizione di un file (percorso) nel file system, i suoi diritti di accesso, e se si tratta di una directory o link simbolico, ecc dimensione del file e di ultima modifica/leggere gli orari sono anche a disposizione. QFileInfo può anche essere utilizzato per ottenere informazioni su una risorsa Qt.

Questo è il codice sorgente per verificare se esiste un file:

#include <QFileInfo> 

(non dimenticate di aggiungere il corrispondente #include -affermazione)

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

Considera anche: Do you voglio solo controllare se il percorso esiste (exists()) o vuoi anche assicurarti che questo sia un file e non una directory (isFile())?


TL; DR(con la versione più corta della funzione di cui sopra, risparmiando un paio di righe di codice)

#include <QFileInfo> 

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

Solo un suggerimento, il codice nella funzione 'bool fileExists (const QString & path)' potrebbe essere ulteriormente semplificato in: 'return checkFile.exists() && checkFile.isFile(); '@mozzbozz – Dreamer

+0

@Dreamer Grazie per il tuo commento. Certo che hai ragione, anche se è anche questione di gusti. Ho aggiunto anche la tua versione (lascerò qui la versione più lunga in quanto potrebbe essere più semplice da seguire per i principianti). – mozzbozz

+1

Grazie per il codice! È necessario rimuovere una parentesi chiusa dopo "isFile()". – Alex

4

Ecco come ho verificare se il database esiste:

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

Con SQLite è difficile controllare se il database esiste, perché crea automaticamente un nuovo database se non esiste.

2

È possibile utilizzare il metodo QFileInfo::exists():

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