これで完璧!Qt QFileInfo::filePath()を使ったファイル操作プログラミング例

2025-05-31

もう少し詳しく説明します。

QFileInfo クラスとは?

QFileInfo クラスは、Qt においてファイルシステム上のファイルやディレクトリに関する情報(名前、パス、サイズ、最終更新日時、パーミッション、種類など)を取得するために使用されます。ファイルが存在するかどうか、ディレクトリであるか、シンボリックリンクであるかなども確認できます。

QFileInfo::filePath() の役割

filePath() メソッドは、QFileInfo オブジェクトが参照しているファイルまたはディレクトリのパスを、そのファイル名を含めて返します。このパスは、絶対パスの場合もあれば、相対パスの場合もあります。


  • 相対パスの例
    documents/report.txt または ../data/image.png
  • 絶対パスの例
    /home/user/documents/report.txt または C:/Users/User/Documents/report.txt

filePath() と類似の関数との違い

QFileInfo には、パスに関連するいくつかの類似した関数があります。それぞれの違いを理解すると、より適切に使い分けることができます。

  • fileName():

    • パスを含まず、ファイルまたはディレクトリの名前のみを返します。
  • path():

    • ファイル名を含まない、ディレクトリのパスのみを返します。
    • filePath() と同様に、相対パスであれば相対パスを、絶対パスであれば絶対パスを返します。
  • absoluteFilePath():

    • ファイル名を含む、常に絶対パスを返します。
    • もし QFileInfo オブジェクトが相対パスで初期化されていた場合でも、現在の作業ディレクトリを基準として絶対パスに変換して返します。
    • この変換のために、ファイルシステムへのアクセスを伴う場合があります。
  • filePath():

    • ファイル名を含む、QFileInfo オブジェクトが保持しているそのままのパスを返します。
    • 相対パスであれば相対パスを、絶対パスであれば絶対パスを返します。
    • ファイルシステムへのアクセスを伴わないため、高速です。
#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 存在するファイルのQFileInfoオブジェクトを作成
    QFileInfo fileInfo("/path/to/your/file.txt"); // 実際のファイルパスに置き換えてください

    // filePath() を使用して完全なパスを取得
    QString fullPath = fileInfo.filePath();
    qDebug() << "filePath(): " << fullPath;

    // absoluteFilePath() を使用して絶対パスを取得
    QString absolutePath = fileInfo.absoluteFilePath();
    qDebug() << "absoluteFilePath(): " << absolutePath;

    // path() を使用してディレクトリパスのみを取得
    QString dirPath = fileInfo.path();
    qDebug() << "path(): " << dirPath;

    // fileName() を使用してファイル名のみを取得
    QString fileName = fileInfo.fileName();
    qDebug() << "fileName(): " << fileName;

    // 相対パスの例
    QFileInfo relativeFileInfo("my_data/image.jpg");
    qDebug() << "relativeFileInfo.filePath(): " << relativeFileInfo.filePath();
    qDebug() << "relativeFileInfo.absoluteFilePath(): " << relativeFileInfo.absoluteFilePath(); // 現在の作業ディレクトリに依存

    return a.exec();
}


パスの解決(相対パスと絶対パス)に関する誤解

問題
filePath()QFileInfo オブジェクトが初期化された際のパスをそのまま返します。これは、相対パスで初期化された場合は相対パスを、絶対パスで初期化された場合は絶対パスを意味します。しかし、開発者が常に絶対パスが返されると誤解している場合があります。


// アプリケーションが /home/user/app/ で実行されているとする
QFileInfo fileInfo("data/config.txt"); // 相対パス
qDebug() << fileInfo.filePath(); // 出力: "data/config.txt" (絶対パスではない)

この data/config.txt が実際にどのファイルを参照しているかは、アプリケーションの現在の作業ディレクトリに依存します。

トラブルシューティング

  • 現在の作業ディレクトリを意識する
    QDir::currentPath()QDir::setCurrent() を使用して、アプリケーションの現在の作業ディレクトリを把握し、必要に応じて変更します。
  • 常に絶対パスが必要な場合
    QFileInfo::absoluteFilePath() を使用します。これは、QFileInfo が相対パスで初期化された場合でも、現在の作業ディレクトリを基準とした絶対パスを返します。
    QFileInfo fileInfo("data/config.txt");
    qDebug() << fileInfo.absoluteFilePath(); // 出力: "/home/user/app/data/config.txt" (現在の作業ディレクトリによる)
    

ファイルまたはディレクトリの存在チェックの不足

問題
filePath() は単にパス文字列を返すだけであり、そのパスが示すファイルやディレクトリが実際に存在するかどうかは確認しません。存在しないパスに対して QFile などで操作を行おうとすると、エラーや予期しない動作が発生します。


QFileInfo fileInfo("non_existent_file.txt");
qDebug() << fileInfo.filePath(); // "non_existent_file.txt" は返される
// しかし、このファイルは存在しない可能性がある
QFile file(fileInfo.filePath());
if (!file.open(QIODevice::ReadOnly)) {
    qWarning() << "ファイルを開けませんでした: " << file.errorString(); // エラーになる可能性
}

トラブルシューティング

  • QFile::exists() も利用可能
    QFile::exists(const QString &fileName) 静的メソッドも、ファイルが存在するかどうかをチェックするのに使えます。
  • QFileInfo::exists() を使用する
    filePath() を使用してパスを取得した後、QFileInfo::exists() を呼び出して、そのパスが存在するかどうかを確認します。
    QFileInfo fileInfo("non_existent_file.txt");
    if (fileInfo.exists()) {
        qDebug() << "ファイルは存在します: " << fileInfo.filePath();
    } else {
        qWarning() << "ファイルは存在しません: " << fileInfo.filePath();
    }
    

パス区切り文字の問題 (Windows と Unix系OS)

問題
Windows では \ (バックスラッシュ) が、Unix 系 OS (Linux, macOS) では / (スラッシュ) がパス区切り文字として使われます。filePath() 自体は Qt が内部的にOSに合わせたパスを返すため、直接的な問題にはなりにくいですが、パス文字列を結合する際に手動で区切り文字を追加する場合に問題が発生しやすいです。


// Windows で QDir::currentPath() が "C:\Users\user" を返すと仮定
QString basePath = QDir::currentPath();
QString fileName = "my_document.txt";
QString fullPath = basePath + "\\" + fileName; // Windows以外では問題
qDebug() << fullPath; // "C:\Users\user\my_document.txt" (Windows)
                     // "C:/Users/user\my_document.txt" (Unix系で実行すると混在)

トラブルシューティング

  • QDir::toNativeSeparators()
    ユーザーインターフェースに表示するために、ネイティブなパス区切り文字が必要な場合は QDir::toNativeSeparators() を使用します。
  • QDir::filePath() や QDir::absoluteFilePath() を利用する
    QDir クラスのこれらのメソッドを使うと、パスの結合を安全に行えます。
    QDir dir = QDir::current(); // 現在のディレクトリを表すQDirオブジェクト
    QString fullPath = dir.filePath("my_document.txt"); // 自動的に正しいパス区切り文字で結合
    qDebug() << fullPath;
    
  • 常に / を使用する
    Qt は内部的に / をユニバーサルなパス区切り文字として扱い、必要に応じてOSネイティブの形式に変換します。コード内でパスを構築する際は、常に / を使用するのが最善です。
    QString basePath = QDir::currentPath();
    QString fileName = "my_document.txt";
    QString fullPath = basePath + "/" + fileName; // 常に / を使用
    qDebug() << fullPath; // Windowsでは "C:/Users/user/my_document.txt" として扱われる
                         // ファイルシステム操作時に自動的に "C:\Users\user\my_document.txt" に変換される
    

特殊文字や空白を含むパス

問題
ファイル名やディレクトリ名にスペース、カッコ、記号などの特殊文字が含まれている場合、特に外部コマンドを実行したり、古いAPIを使用したりする際に問題が発生することがあります。QFileInfo::filePath() 自体はこれらの文字を正しく扱いますが、それをシェルコマンドの引数として渡す場合などに引用符で囲むなどの処理が必要になることがあります。


QFileInfo fileInfo("My Document (Final).txt");
QString path = fileInfo.filePath(); // "My Document (Final).txt"
// これを直接 QProcess::start() の引数に渡すと、スペースで区切られて複数の引数と解釈される可能性
// QProcess process;
// process.start("some_tool", QStringList() << path); // これだと問題ないことが多い
// process.start("some_tool " + path); // これは問題を起こしやすい

トラブルシューティング

  • 外部プログラムにパスを渡す場合
    • QProcess::start()QProcess::execute()QStringList arguments オーバーロードを使用し、パスを個別の引数として渡します。Qt が自動的に適切な引用符処理を行います。
    • どうしても単一の文字列として渡す必要がある場合は、OSに応じた引用符(Windowsでは "、Unix系では " または ')でパス全体を囲む処理を実装します。ただし、これは複雑になりがちなので推奨されません。
  • Qt のファイルシステムクラスを最大限に利用する
    QFile, QDir, QFileInfo など、Qt が提供するファイルシステム操作用のクラスを使用することで、パスの特殊文字に関する問題を回避できます。これらのクラスは、OS固有のパス処理を内部で適切に扱います。

問題
QFileInfo::filePath() は、QFileInfo オブジェクトがシンボリックリンクを参照している場合でも、そのシンボリックリンク自体のパスを返します。シンボリックリンクの指す実体のパスが必要な場合は、別の関数を使用する必要があります。

  • QFileInfo::canonicalFilePath() を使用する
    シンボリックリンクを解決した、実体のパス(正規化されたパス)が必要な場合は、canonicalFilePath() を使用します。
    // /path/to/symlink が /path/to/actual_file.txt を指しているとする
    QFileInfo symlinkInfo("/path/to/symlink");
    qDebug() << "filePath(): " << symlinkInfo.filePath();         // /path/to/symlink
    qDebug() << "canonicalFilePath(): " << symlinkInfo.canonicalFilePath(); // /path/to/actual_file.txt
    


すべての例を実行するには、Qt プロジェクトに以下のヘッダーを追加してください。

#include <QCoreApplication>
#include <QFileInfo>
#include <QDir>
#include <QDebug> // デバッグ出力用
#include <QFile> // ファイル操作用

例 1: filePath() の基本的な使用法

この例では、QFileInfo オブジェクトを作成し、filePath() を使ってその完全なパスを取得します。

#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 既存のファイルを指すQFileInfoオブジェクトを作成
    // ※ 実際のファイルパスに置き換えてください
    QString existingFilePath = "/home/user/documents/report.txt"; // Unix/Linux/macOSの場合
    // QString existingFilePath = "C:/Users/User/Documents/report.txt"; // Windowsの場合

    QFileInfo fileInfo(existingFilePath);

    // filePath() を使用して完全なパスを取得
    QString fullPath = fileInfo.filePath();
    qDebug() << "QFileInfo::filePath() で取得したパス: " << fullPath;

    // ファイルが存在するか確認(おまけ)
    if (fileInfo.exists()) {
        qDebug() << "ファイルは存在します。";
    } else {
        qDebug() << "ファイルは存在しません。";
    }

    // 存在しないファイルを指すQFileInfoオブジェクトでもパスは取得できる
    QFileInfo nonExistentFileInfo("non_existent_file.txt");
    qDebug() << "存在しないファイルの filePath(): " << nonExistentFileInfo.filePath();
    qDebug() << "存在しないファイルの exists(): " << nonExistentFileInfo.exists(); // false が返る

    return 0; // QCoreApplicationのexec()は不要(GUIなしのため)
}

解説

  • exists() メソッドは、ファイルやディレクトリが実際にファイルシステム上に存在するかどうかをチェックします。
  • filePath() は、QFileInfo オブジェクトが保持するパス文字列をそのまま返します。ファイルが存在するかどうかは関係ありません。

例 2: filePath() と他のパス関連関数の比較

QFileInfo には filePath() 以外にもパスを取得する関数がいくつかあります。それぞれの違いを理解するのに役立ちます。

#include <QCoreApplication>
#include <QFileInfo>
#include <QDir>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 現在の実行ディレクトリに "data" というディレクトリがあると仮定し、
    // その中に "image.png" があると仮定します。
    // ※ この例をテストするために、実際にそのようなファイルとディレクトリを作成してください。
    // 例: your_app_dir/data/image.png
    QString relativePath = "data/image.png";
    QFileInfo fileInfo(relativePath);

    qDebug() << "--- パス関連関数の比較 ---";
    qDebug() << "相対パスで初期化: " << relativePath;
    qDebug() << "QDir::currentPath(): " << QDir::currentPath(); // 現在の作業ディレクトリ

    qDebug() << "filePath(): " << fileInfo.filePath();
    qDebug() << "absoluteFilePath(): " << fileInfo.absoluteFilePath(); // 絶対パスに解決
    qDebug() << "path(): " << fileInfo.path(); // ファイル名を含まないディレクトリパス
    qDebug() << "fileName(): " << fileInfo.fileName(); // ファイル名のみ
    qDebug() << "baseName(): " << fileInfo.baseName(); // 拡張子なしのファイル名
    qDebug() << "completeSuffix(): " << fileInfo.completeSuffix(); // 完全な拡張子(例: "tar.gz")
    qDebug() << "suffix(): " << fileInfo.suffix(); // 最後の拡張子(例: "gz")

    // 絶対パスで初期化したQFileInfo
    QString absolutePathExample = QDir::currentPath() + "/another_file.txt";
    QFileInfo absFileInfo(absolutePathExample);
    qDebug() << "\n--- 絶対パスで初期化されたQFileInfo ---";
    qDebug() << "filePath(): " << absFileInfo.filePath();
    qDebug() << "absoluteFilePath(): " << absFileInfo.absoluteFilePath(); // 同じパスが返される
    qDebug() << "path(): " << absFileInfo.path();

    return 0;
}

解説

  • fileName(): ファイル名のみを返します。
  • path(): ファイル名を除いたディレクトリ部分のパスを返します。
  • absoluteFilePath(): 常に絶対パスを返します。相対パスが指定された場合でも、現在の作業ディレクトリを基準にして絶対パスに変換されます。
  • filePath(): QFileInfo に設定された通りのパス(相対パスなら相対パス、絶対パスなら絶対パス)を返します。

例 3: filePath()QFile を使ったファイル操作

filePath() で取得したパスを QFile コンストラクタに渡し、ファイル操作を行う一般的なパターンです。

#include <QCoreApplication>
#include <QFileInfo>
#include <QFile>
#include <QTextStream>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString filePath = "my_log.txt"; // 現在のディレクトリに作成されます
    QFileInfo fileInfo(filePath);

    // QFileInfo::filePath() で取得したパスを使ってファイルを開く
    QFile file(fileInfo.filePath());

    // 書き込みモードで開く(ファイルが存在しない場合は作成される)
    if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        QTextStream out(&file);
        out << "これはテストログです。\n";
        out << "現在の時刻: " << QDateTime::currentDateTime().toString() << "\n";
        file.close();
        qDebug() << fileInfo.filePath() << " に書き込みました。";
    } else {
        qWarning() << "ファイルを開けませんでした: " << file.errorString();
    }

    // 読み込みモードで開く
    if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QTextStream in(&file);
        qDebug() << "\n--- ファイルの内容 ---";
        while (!in.atEnd()) {
            qDebug() << in.readLine();
        }
        file.close();
    } else {
        qWarning() << "ファイルを読み込めませんでした: " << file.errorString();
    }

    return 0;
}

解説

  • file.open() の結果をチェックすることは非常に重要です。エラーが発生した場合は file.errorString() で詳細を確認できます。
  • QFileInfo でパスを管理し、そのパスを QFile に渡して実際にファイル操作を行います。

シンボリックリンク(ショートカット、エイリアス)がある場合の filePath()canonicalFilePath() の違いを示します。

#include <QCoreApplication>
#include <QFileInfo>
#include <QDir>
#include <QDebug>
#include <QFile> // シンボリックリンク作成用

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 1. 実際のファイルを作成
    QString actualFileName = "actual_data.txt";
    QFile actualFile(actualFileName);
    if (actualFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
        QTextStream out(&actualFile);
        out << "これは実際のファイルの内容です。\n";
        actualFile.close();
        qDebug() << "作成された実際のファイル: " << actualFileName;
    } else {
        qWarning() << "実際のファイルを作成できませんでした: " << actualFile.errorString();
        return 1;
    }

    // 2. シンボリックリンクを作成
    QString symlinkName = "data_link.txt";
    QFile::remove(symlinkName); // 以前に存在する場合は削除
    if (QFile::link(actualFileName, symlinkName)) {
        qDebug() << "作成されたシンボリックリンク: " << symlinkName << " -> " << actualFileName;
    } else {
        qWarning() << "シンボリックリンクを作成できませんでした。OSが対応しているか確認してください。";
        // Windowsでは通常、管理者権限が必要
        return 1;
    }

    // 3. QFileInfo で情報を取得
    QFileInfo symlinkInfo(symlinkName);

    qDebug() << "\n--- シンボリックリンクの情報 ---";
    qDebug() << "元のパス (filePath()): " << symlinkInfo.filePath();
    qDebug() << "実体のパス (canonicalFilePath()): " << symlinkInfo.canonicalFilePath();
    qDebug() << "これがシンボリックリンクか?: " << symlinkInfo.isSymLink();
    qDebug() << "これがファイルか?: " << symlinkInfo.isFile(); // シンボリックリンクのタイプによる

    // 4. クリーンアップ
    QFile::remove(actualFileName);
    QFile::remove(symlinkName);
    qDebug() << "\nファイルをクリーンアップしました。";

    return 0;
}
  • isSymLink() は、そのパスがシンボリックリンクであるかどうかを真偽値で返します。
  • canonicalFilePath() は、シンボリックリンクを解決し、それが指している実際のファイル(またはディレクトリ)の絶対パスを返します。
  • filePath() は、QFileInfo オブジェクトが初期化された際のパス、つまりシンボリックリンク自体のパスを返します。


QFileInfo::absoluteFilePath()

これは filePath() の最も直接的な代替であり、かつ非常に重要な違いがあります。

  • 欠点
    相対パスの「元の形式」を保持したい場合には向きません。また、絶対パスへの解決のためにファイルシステムへのアクセスを伴う場合があります。
  • 利点
    プログラムの実行場所(現在の作業ディレクトリ)に依存せず、常に絶対パスでファイルにアクセスしたい場合に安全です。
  • filePath() との違い
    • filePath() は、QFileInfo オブジェクトが構築された際のパス(相対パスなら相対パス、絶対パスなら絶対パス)をそのまま返します。
    • absoluteFilePath() は、QFileInfo オブジェクトが相対パスで初期化された場合でも、現在の作業ディレクトリを基準として絶対パスに変換して返します。これにより、ファイルシステム上の位置を明確に特定できます。
  • 用途
    常にファイルの絶対パスを取得したい場合。

コード例

#include <QCoreApplication>
#include <QFileInfo>
#include <QDir>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 現在の作業ディレクトリが /home/user/my_app/ だと仮定
    QDir::setCurrent("/tmp"); // テストのために作業ディレクトリを変更
    qDebug() << "現在の作業ディレクトリ: " << QDir::currentPath();

    // 相対パスでQFileInfoを初期化
    QFileInfo fileInfo("data/config.txt");

    qDebug() << "filePath():        " << fileInfo.filePath();         // "data/config.txt"
    qDebug() << "absoluteFilePath():" << fileInfo.absoluteFilePath(); // "/tmp/data/config.txt"

    QDir::setCurrent("/home/user/my_app"); // 作業ディレクトリを元に戻す(実際のアプリケーションでは通常行わない)

    return 0;
}

QFileInfo::canonicalFilePath()

  • 欠点
    ファイルシステム上の解決を伴うため、パフォーマンスに影響を与える可能性があります。また、リンク先が存在しない場合は空の文字列を返します。
  • 利点
    シンボリックリンクを透過的に扱い、常にファイルシステム上の「本当の場所」にアクセスしたい場合に便利です。例えば、ファイルの重複を避けるためにリンクをたどりたい場合など。
  • filePath() との違い
    filePath() はシンボリックリンク自体へのパスを返しますが、canonicalFilePath() はシンボリックリンクの指す先の実際のファイルのパスを返します。
  • 用途
    シンボリックリンクを解決し、その実体ファイル(またはディレクトリ)の正規化された絶対パスを取得したい場合。

コード例

#include <QCoreApplication>
#include <QFileInfo>
#include <QDir>
#include <QFile> // シンボリックリンク作成用
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 1. 実際のファイルを作成
    QString actualFileName = "my_actual_file.txt";
    QFile actualFile(actualFileName);
    if (!actualFile.open(QIODevice::WriteOnly)) {
        qWarning() << "実際のファイルを作成できませんでした。";
        return 1;
    }
    actualFile.close();

    // 2. シンボリックリンクを作成 (Windowsでは管理者権限が必要な場合がある)
    QString symlinkName = "my_symlink.txt";
    QFile::remove(symlinkName); // 以前に存在する場合は削除
    if (!QFile::link(actualFileName, symlinkName)) {
        qWarning() << "シンボリックリンクを作成できませんでした。";
        qWarning() << "Windowsでは管理者権限で実行するか、開発者モードを有効にしてください。";
        // ファイルをクリーンアップして終了
        QFile::remove(actualFileName);
        return 1;
    }

    QFileInfo symlinkInfo(symlinkName);

    qDebug() << "filePath():         " << symlinkInfo.filePath();          // "my_symlink.txt"
    qDebug() << "canonicalFilePath():" << symlinkInfo.canonicalFilePath(); // "/path/to/my_actual_file.txt" (絶対パス)

    QFile::remove(actualFileName);
    QFile::remove(symlinkName);

    return 0;
}

QDir::filePath() / QDir::absoluteFilePath() (パスの結合)

  • 欠点
    既に QFileInfo オブジェクトがある場合は冗長になる可能性があります。
  • 利点
    OS間のパス区切り文字 (/ vs \) の違いを吸収し、常に正しい形式でパスを結合できます。手動で文字列結合を行うよりも堅牢です。
  • QFileInfo::filePath() との違い
    QFileInfo::filePath() は既存のパスから情報を取得しますが、QDir::filePath() は新しいパスを構築します。
  • 用途
    ディレクトリパスとファイル名を安全に結合して、完全なパスを構築したい場合。

コード例

#include <QCoreApplication>
#include <QFileInfo>
#include <QDir>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString directoryPath = "/usr/local/data"; // または "C:/Program Files/MyApp/data"
    QString fileName = "settings.ini";

    // QDirオブジェクトを作成
    QDir dataDir(directoryPath);

    // QDir::filePath() でパスを結合
    QString fullPath = dataDir.filePath(fileName);
    qDebug() << "QDir::filePath():        " << fullPath; // "/usr/local/data/settings.ini"

    // QDir::absoluteFilePath() で絶対パスを結合(もしdataDirが相対パスで初期化された場合でも)
    QDir relativeDir("my_app_data");
    QString relativeFullPath = relativeDir.absoluteFilePath("log.txt");
    qDebug() << "QDir::absoluteFilePath():" << relativeFullPath; // 現在の作業ディレクトリ + "/my_app_data/log.txt"

    // QFileInfoでパスを取得するのと比較
    QFileInfo fileInfo(fullPath);
    qDebug() << "QFileInfo::filePath() for combined path: " << fileInfo.filePath();

    return 0;
}
  • 欠点
    特定のファイル名までを解決する機能はありません。得られたパスにファイル名を結合するには、上記 QDir::filePath() などを使う必要があります。
  • 利点
    アプリケーションがクロスプラットフォームで動作し、ユーザーのファイルシステムに適切に統合されることを保証します。ハードコーディングされたパスを避けることができます。
  • QFileInfo::filePath() との違い
    特定のファイルやディレクトリのパスではなく、OSが定義する「カテゴリ別」のパスを提供します。
  • 用途
    オペレーティングシステムが推奨する、アプリケーション固有のデータの保存場所(ドキュメント、設定、キャッシュなど)のパスを取得したい場合。

コード例

#include <QCoreApplication>
#include <QStandardPaths>
#include <QDir>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // ユーザーのドキュメントディレクトリのパスを取得
    QString documentsPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
    qDebug() << "ドキュメントディレクトリ: " << documentsPath;

    // アプリケーションの設定ディレクトリのパスを取得
    QString configPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
    qDebug() << "アプリケーション設定ディレクトリ: " << configPath;

    // configPath を使って、設定ファイルの完全なパスを構築
    QDir configDir(configPath);
    QString settingsFilePath = configDir.filePath("my_app_settings.json");
    qDebug() << "設定ファイルのパス: " << settingsFilePath;

    // settingsFilePath をQFileInfoで利用
    QFileInfo settingsFileInfo(settingsFilePath);
    qDebug() << "QFileInfo::filePath() for settings: " << settingsFileInfo.filePath();

    return 0;
}

QFileInfo::filePath() は、QFileInfo オブジェクトが参照するパスをそのまま取得する最も基本的な方法です。しかし、アプリケーションの要件によっては、以下のような代替方法や組み合わせがより適切です。

  • OS推奨の特殊なディレクトリパスが必要な場合
    QStandardPaths
  • パスの安全な結合が必要な場合
    QDir::filePath()QDir::absoluteFilePath()
  • シンボリックリンクの解決が必要な場合
    QFileInfo::canonicalFilePath()
  • 絶対パスが必要な場合
    QFileInfo::absoluteFilePath()