2

動機付けの例:

前のセッションで、アプリケーションはユーザーが選択したパスを保存しました。その間に、そのパスが削除、移動、名前変更、またはドライブのアンマウントされた可能性があります。アプリケーションは、ユーザーが を介してパスを参照できるようにしたいと考えていQFileDialogます。ユーザーの利便性のために、以前のパスがファイル ダイアログの開始ディレクトリとして渡されます。これは、おそらく新しいパスが古いパスの近くにある可能性が高いためです。残念ながら、 QFileDialog存在しない開始パスが指定された場合、デフォルトで現在の作業ディレクトリになります。これは通常、アプリケーションのインストール ディレクトリであるため、ユーザーにとって役立つ可能性はほとんどありません。

そのため、パスを に渡す前に、実際に存在するディレクトリを指すように古いパスを前処理したいと考えていQFileDialogます。古いパスが存在しない場合は、存在する最も近いディレクトリに置き換えます。

では、ファイル パス (存在する場合も存在しない場合もあります) を取得し、ファイル システムに実際に存在するものが見つかるまで、そのパスを「上方向」に検索するにはどうすればよいでしょうか。

4

2 に答える 2

2

これらは私がこれまでに思いついた 2 つのアプローチですが、改善のための提案をいただければ幸いです。

パスが存在するまで上方検索:

QString GetNearestExistingAncestorOfPath(const QString & path)
{
    if(QFileInfo::exists(path)) return path;

    QDir dir(path);
    if(!dir.makeAbsolute()) return {};
    do
    {
        dir.setPath(QDir::cleanPath(dir.filePath(QStringLiteral(".."))));
    }
    while(!dir.exists() && !dir.isRoot());

    return dir.exists() ? dir.path() : QString{};
}

パスが存在しなくなるまで下方向に検索:

QString GetNearestExistingAncestorOfPath(const QString & path)
{
    if(QFileInfo::exists(path)) return path;

    auto segments = QDir::cleanPath(path).split('/');
    QDir dir(segments.takeFirst() + '/');
    if(!dir.exists()) return {};
    for(const auto & segment : qAsConst(segments))
    {
        if(!dir.cd(segment)) break;
    }
    return dir.path();
}
于 2018-10-11T17:03:56.863 に答える