82

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

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

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

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

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

4

5 に答える 5

106

(TL;DR は下部にあります)

私はQFileInfo-class ( docs ) を使用します - これはまさにそれが作成されたものです:

QFileInfo クラスは、システムに依存しないファイル情報を提供します。

QFileInfo は、ファイル システム内のファイルの名前と位置 (パス)、アクセス権、ディレクトリかシンボリック リンクかなどに関する情報を提供します。ファイルのサイズと最終変更/読み取り時間も利用できます。QFileInfo を使用して、Qt リソースに関する情報を取得することもできます。

これは、ファイルが存在するかどうかを確認するソース コードです。

#include <QFileInfo>

(対応するステートメントを追加することを忘れないでください#include)

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

Qt >=5.2 の TL;DR

( Qt 5.2 で導入されexistsた asを使用しstaticます。ドキュメントでは、静的関数の方が高速であると書かれていますが、メソッドを使用する場合もこれが当てはまるかどうかはわかりません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();
于 2014-11-18T09:51:58.043 に答える
15

QFileInfo::exists()次の方法を使用できます。

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

ファイルが存在し、パスが存在するがフォルダーであるtrue場合にのみ返す場合は、次のように組み合わせることができます。falseQDir::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
}
于 2016-10-23T13:05:43.193 に答える
8

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

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

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

あなたのhandleError関数の中に。上記のメッセージが出力された場合は、別の問題があることがわかります。

于 2012-04-23T03:39:40.467 に答える
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データベースが存在しない場合は自動的に新しいデータベースを作成するため、データベースが存在するかどうかを確認するのは困難です。

于 2016-07-28T09:48:51.023 に答える
1

私はQtから何かを使用することをまったくスキップし、古い標準を使用するだけaccessです:

if (0==access("/Users/Hans/Desktop/result.txt", 0))
    // it exists
else
    // it doesn't exist
于 2012-04-23T01:41:39.917 に答える