web-dev-qa-db-ja.com

C ++でQtにファイルが存在するかどうかを確認する方法

Qtで特定のパスにファイルが存在するかどうかを確認するにはどうすればよいですか?

私の現在のコードは以下の通りです:

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

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

しかし、コードを実行すると、パスで言及したファイルが存在しなくても、handleErrorで指定されたエラーメッセージが表示されません。

70
user1322915

(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を返します。

注:fileが存在しないファイルを指すシンボリックリンクの場合、falseが返されます。

これは正確ではありません。

パス(ファイルまたはディレクトリ)が存在する場合は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();
}
_

TL; QtのDR> = 5.2

(Qt 5.2で導入されたexistsとしてstaticを使用します。ドキュメントでは、静的関数の方が高速であると述べていますが、これはまだ当てはまりません。 isFile()メソッドも使用する場合、少なくともこれは1ライナーです)

_#include <QFileInfo>

// check if path exists and if yes: Is it a file and no directory?
bool fileExists = QFileInfo::exists(path) && QFileInfo(path).isFile();
_
91
mozzbozz

QFileInfo::exists()メソッドを使用できます。

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

fileが存在する場合にのみ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
}
11
Donald Duck

投稿したコードは正しいです。他の何かが間違っている可能性があります。

これを入れてみてください:

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

handleError関数の内部。上記のメッセージが出力される場合、他の何かが問題であることがわかります。

8
Anthony

それがデータベースが存在するかどうかを確認する方法です:

#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を使用すると、新しいデータベースが存在しない場合に自動的に作成されるため、データベースが存在するかどうかを確認することは困難です。

4
Essetee

私はQtの何も使用せずに、古い標準のaccessを使用します。

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