如何检查Qt中给定路径中是否存在文件?
我当前的代码如下:
QFile Fout("/Users/Hans/Desktop/result.txt");
if(!Fout.exists())
{
eh.handleError(8);
}
else
{
// ......
}
但是,当我运行代码时,handleError
即使我在路径中提到的文件不存在,也不会给出指定的错误消息。
Answers:
(TL; DR在底部)
我将使用QFileInfo
-class(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()
)?
注意:exists()
-function的文档说:
如果文件存在,则返回true;否则,返回false。否则返回false。
注意:如果file是指向不存在文件的符号链接,则返回false。
这不准确。它应该是:
如果路径(即文件或目录)存在,则返回true;否则,返回true。否则返回false。
TL; DR
(使用上面函数的较短版本,节省了几行代码)
#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();
}
Qt> = 5.2的TL; DR
(使用exists
的static
是Qt 5.2中引入的;文档说静态函数更快,尽管我不确定同时使用该isFile()
方法时情况仍然如此;至少这是一种方法)
#include <QFileInfo>
// check if path exists and if yes: Is it a file and no directory?
bool fileExists = QFileInfo::exists(path) && QFileInfo(path).isFile();
bool fileExists(const QString &path)
可以进一步简化为:return checkFile.exists() && checkFile.isFile();
@mozzbozz
true
!(刚刚在我的系统上使用Qt 5.10进行了测试)
exists
函数(是否static
返回)返回true
。但是,问题是“如何检查文件是否存在”(而不是目录)。看一下链接的代码片段,希望它能解释我的意思。
您可以使用以下QFileInfo::exists()
方法:
#include <QFileInfo>
if(QFileInfo("C:\\exampleFile.txt").exists()){
//The file exists
}
else{
//The file doesn't exist
}
如果希望true
仅在文件存在且false
路径存在但仅是文件夹的情况下返回它,则可以将其与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
}
true
,即使“只是”文件,您的源代码也会返回。OP要求检查文件,而不是路径。
false
在路径存在但为文件夹的情况下返回,则可以执行QFileInfo(path).exists() && !QDir(path).exists()
。我已经编辑了答案以添加该答案。
这就是我检查数据库是否存在的方式:
#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
很难检查数据库是否存在,因为它会自动创建一个新的数据库,如果它不存在。
我将完全跳过使用Qt中的任何内容,而仅使用旧标准access
:
if (0==access("/Users/Hans/Desktop/result.txt", 0))
// it exists
else
// it doesn't exist
access
-当然是MS和gcc端口。英特尔使用支持它的MS库,而Comeau使用后端编译器的库。