2012-04-23 3 views
57

Как проверить, существует ли файл в указанном пути или нет в Qt?Как проверить, существует ли файл в Qt в C++

Мой текущий код ниже:

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

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

Но когда я запускаю код это не дает сообщение об ошибке, указанное в handleError, даже если файл я уже в пути не существует.

+1

Я думаю @mozzbozz ниже, может иметь свой ответ - Не забудьте принять/дать очки :) – Rachael

ответ

1

я пропускала использовать что-нибудь из Qt вообще, а просто использовать старый стандарт access:

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

@ Styne666: Каждый компилятор из которых я в Windows поддерживается «доступ» - конечно, MS и порты gcc. Intel использует библиотеку MS, которая ее поддерживает, а Comeau использует библиотеку внутреннего компилятора. –

+0

Спасибо, что заставляете меня делать мои исследования. Я согласен, что это может работать, но с учетом [комментариев к этому ответу] (http://stackoverflow.com/a/230068/594137). Я все еще думаю, что придерживаться вариантов Qt (если у вас есть проект Qt) лучшее решение. –

+2

@ Styne666: Я совсем не уверен, что Qt предоставляет все, чтобы исправить проблему для программ setuid/setgid, которая, кажется, касается единственной, которая имеет значение. Они рассуждали о значении «кросс-платформы» и о том, какие стандарты следует заботиться, но если мы заботимся только о платформах, поддерживаемых Qt, это в основном спорные вопросы. –

8

код Вы разместили правильно. Скорее всего, что-то еще не так.

Попробуйте положить это:

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

внутри вашей функции HandleError. Если вышеприведенное сообщение печатается, вы знаете, что еще проблема.

63

Я хотел бы использовать QFileInfo -класса (docs) - это именно то, что это сделано для:

Класс QFileInfo предоставляет информацию от файловой системы.

QFileInfo содержит информацию об имени и позиции к файлу, (путь) в файловой системе, его права доступа и является ли он каталогом или символической ссылки, и т.д. размера файла и последним изменением/время чтения является также доступный. QFileInfo также может использоваться для получения информации о ресурсе Qt.

Это исходный код, чтобы проверить, существует ли файл:

#include <QFileInfo> 

(не забудьте добавить соответствующий #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; 
    } 
} 

Также рассмотреть следующие вопросы: Есть ли у Вас только хотите проверить, существует ли путь (exists()), или вы также хотите убедиться, что это файл, а не каталог (isFile())?


TL; DR(с более короткой версии функции выше, экономя несколько строк кода)

#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

Просто предложение, код в функции 'bool fileExists (const QString & path)' может быть дополнительно упрощен для: 'return checkFile.exists() && checkFile.isFile(); '@mozzbozz – Dreamer

+0

@Dreamer Спасибо за ваш комментарий. Конечно, вы правы, хотя это тоже вопрос вкуса. Я также добавил вашу версию (я оставлю более длинную версию здесь, так как для начинающих может быть проще следовать). – mozzbozz

+1

Спасибо за код! Вам нужно удалить закрывающую скобку после «isFile()». – Alex

4

Вот как я могу проверить, существует ли база данных:

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

С SQLite сложно проверить, существует ли база данных, поскольку она автоматически создает новой базы данных, если она не существует.

2

Вы можете использовать QFileInfo::exists() метод:

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