2012-04-23 17 views
57

Jak sprawdzić, czy plik istnieje w podanej ścieżce, czy nie w Qt?Jak sprawdzić, czy plik istnieje w Qt w języku C++

Mój obecny kod jest poniżej:

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

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

Ale kiedy uruchomić kod to nie daje komunikat o błędzie określone w handleError chociaż plik wspominałem w ścieżce nie istnieje.

+1

myślę @mozzbozz poniżej może mieć swoją odpowiedź - Nie zapomnij, aby zaakceptować/dać punkty :) – Rachael

Odpowiedz

1

chciałbym pominąć niczego z użyciem Qt w ogóle i po prostu używać starej normy access:

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

@ Styne666: Każdy kompilatora których jestem świadomy w Windows obsługuje 'dostęp' - na pewno MS i porty gcc. Intel korzysta z biblioteki MS, która ją obsługuje, a Comeau korzysta z biblioteki kompilatora zaplecza. –

+0

Dziękuję za zrobienie mi moich badań. Akceptuję, że może się wydawać, że działa, ale biorąc pod uwagę [komentarze na temat tej odpowiedzi] (http://stackoverflow.com/a/230068/594137) nadal uważam, że trzymanie się opcji Qt (jeśli masz projekt Qt) jest lepsze rozwiązanie. –

+2

@ Styne666: Nie jestem wcale pewien, że Qt zapewnia wszystko, aby rozwiązać problem programów setuid/setgid, który wydaje się być jedynym, który ma znaczenie. Argumentowali oni o znaczeniu "platformy wieloplatformowej" i na jakich standardach dbać, ale jeśli zależy nam tylko na platformach obsługiwanych przez Qt, są to głównie punkty sporne. –

8

Kod pan pisał jest poprawna. Możliwe, że coś jeszcze jest nie tak.

spróbuj umieścić to:

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

wewnątrz swojej funkcji HandleError. Jeśli powyższy komunikat zostanie wydrukowany, wiesz, że jest inny problem.

63

chciałbym użyć QFileInfo -class (docs) - to jest dokładnie to, co jest dla:

Klasa QFileInfo informuje plik systemowy niezależny.

QFileInfo dostarcza informacji o pliku jest i nazwisko oraz stanowisko (path) w systemie plików, jego prawa dostępu i czy jest to katalog lub link symboliczny itp rozmiaru pliku i ostatnia modyfikacja/czytaj czasy także dostępny. QFileInfo może również służyć do uzyskiwania informacji na temat zasobu Qt .

Jest to kod źródłowy, aby sprawdzić, czy plik istnieje:

#include <QFileInfo> 

(nie zapomnij dodać odpowiedni #include -statement)

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

rozważyć także: Czy chcesz tylko sprawdzić, czy ścieżka istnieje (exists()) czy chcesz się upewnić, że jest to plik, a nie katalog (isFile())?


TL; DR(z krótszej wersji funkcji powyżej, oszczędzając kilka linii kodu)

#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

Po prostu sugestia, kod w funkcji 'bool fileExists (const QString & path)' może być dodatkowo uproszczony do: 'return checkFile.exists() && checkFile.isFile(); '@mozzbozz – Dreamer

+0

@Dreamer Dzięki za komentarz. Oczywiście masz rację, chociaż jest to również kwestia gustu. Dodałem też twoją wersję (zostawię tutaj dłuższą wersję, ponieważ łatwiej jest ją śledzić dla początkujących). – mozzbozz

+1

Dzięki za kod! Musisz usunąć nawias zamykający po "isFile()". – Alex

4

ten sposób sprawdzić, czy baza danych istnieje:

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

Z SQLite trudno jest sprawdzić, czy baza danych istnieje, ponieważ automatycznie tworzy nowa baza danych, jeśli nie istnieje.

2

Można użyć metody QFileInfo::exists():

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