如何在C ++中检查文件在Qt中是否存在


78

如何检查Qt中给定路径中是​​否存在文件?

我当前的代码如下:

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

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

但是,当我运行代码时,handleError即使我在路径中提到的文件不存在,也不会给出指定的错误消息。


1
我认为下面的@mozzbozz可能会回答您-别忘了接受/提出要点:)
Rachael

Answers:


102

(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

(使用existsstatic是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();

4
只是一个建议,函数中的代码bool fileExists(const QString &path)可以进一步简化为:return checkFile.exists() && checkFile.isFile(); @mozzbozz
Dreamer

@Dreamer感谢您的评论。您当然是对的,尽管这也取决于品味。我也添加了您的版本(我将在此处保留较长的版本,因为对于初学者而言可能更容易理解)。
mozzbozz

1
@kayleeFrye_onDeck请注意,您的编辑并不正确。没错,文档说静态功能更快。但是,文档对于该功能的实际作用非常不精确。存在函数(是否静态)仅检查路径是否存在,而不检查是否存在文件。因此,如果存在具有给定路径的目录,那么您的建议也将返回true!(刚刚在我的系统上使用Qt 5.10进行了测试)
mozzbozz

1
@kayleeFrye_onDeck确保(在Windows下使用Qt 5.6测试):gist.github.com/mozzbozz/2e83d7e3452a07fa817980403c42eade- >是的,我认为这是一种误解。我的意思是,如果给定路径是目录,则该exists函数(是否static返回)返回true。但是,问题是“如何检查文件是否存在”(而不是目录)。看一下链接的代码片段,希望它能解释我的意思。
mozzbozz

1
但是,等等,情况变得更糟哈哈:i.imgur.com/5Hds4kA.png “文件” 叹气
kayleeFrye_onDeck

13

您可以使用以下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要求检查文件,而不是路径。
mozzbozz

1
@mozzbozz如果希望它false在路径存在但为文件夹的情况下返回,则可以执行QFileInfo(path).exists() && !QDir(path).exists()。我已经编辑了答案以添加该答案。
唐老鸭

8

您发布的代码是正确的。可能还有其他问题。

尝试把这个:

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

在handleError函数内部。如果显示以上消息,则说明问题出在其他方面。


3

这就是我检查数据库是否存在的方式:

#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很难检查数据库是否存在,因为它会自动创建一个新的数据库,如果它不存在。


3
这与问题有什么关系?
VK

1

我将完全跳过使用Qt中的任何内容,而仅使用旧标准access

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

@ Styne666:我在Windows上知道的每个编译器都支持access-当然是MS和gcc端口。英特尔使用支持它的MS库,而Comeau使用后端编译器的库。
杰里·科芬

谢谢您让我进行研究。我接受这似乎可行,但是考虑到对此答案的评论,我仍然认为坚持使用Qt的选项(如果您有Qt项目)是更好的解决方案。
塞缪尔·哈默

2
@ Styne666:我完全不确定Qt是否提供任何解决setuid / setgid程序问题的方法,这似乎是唯一重要的问题。他们争论了“跨平台”的含义以及要关注的标准,但是如果我们只关心Qt支持的平台,那么这些多数都是有争议的。
杰里·科芬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.