14

パスセパレーターのプラットフォーム固有を気にせずにパスパーツを安全に結合するには、.NET と同様の方法が必要です。

QT4にそのようなクラスとメソッドはありますか?

何かのようなもの:

QPath::Combine
4

3 に答える 3

35

の代わりに使える関数はないPath.Combine()ので、自分で書く必要があります。

あなたは難しい方法でそれを行うかもしれません(自分ですべてを処理する)か、単に使用することができますQDir::cleanPath()

QString pathAppend(const QString& path1, const QString& path2)
{
    return QDir::cleanPath(path1 + QDir::separator() + path2);
}

私は使用しましたが、Qt で FS パスを構築するクロスプラットフォームの方法でQDir::separator()指摘されているように、実際には必要なく、単に. double (またはによるとdouble )を削除し、とを適切な値に解決します。PathAppend に相当する Qtも参照してください。QTの交換に関するコード。/QDir::cleanPath()/\QDir::separator()...PathAppend()

前述のように、PathAppend()ネイティブ機能を模倣していますが ( MSDNを参照)、これはの正確な置き換えではありません。クリーニングや正規化を実行しないPath.Combine()ためです(文字列を追加し、ディレクトリ セパレータを適切な方法で処理するだけです。MSDNを参照してください)。正確な交換が必要な場合は、次のものを使用できます。Path.Combine()

QString pathCombine(const QString& path1, const QString& path2)
{
    if (path2.startsWith(QDir::separator()))
        return path2;

    return trimEnd(path1, QDir::separator())
        + QDir::separator()
        + trim(path2, QDir::separator());
}

この関数は、 がディレクトリ名の場合、末尾のディレクトリ セパレータを追加path2しません (チェックを実行せず、パスがまったく存在しない場合もあります)。またpath2、サブパスである必要があることに注意してくださいpath1(より上の相対パスpath1はサポートされていません。必要な場合は、以前のバージョンを で使用する必要がありますQDir::cleanPath())。また、path2ルート化されている場合はpath2が返されます (この実装は非常に単純です。たとえば、ルート化されたパスとして検出 されません)。c:\directory

trim()およびtrimEnd()関数は末尾のディレクトリ区切り文字を削除します (可能性のある一般的な実装については、開始点としてQString から末尾の空白を削除するにはどうすればよいですか? を参照してください)。末尾のディレクトリセパレーターがあることを確認するアルゴリズムは、パスに末尾のディレクトリセパレーターがあることを確認する方法で説明されているものと同じです? (ここでは、常に 1 つのディレクトリ セパレーターが指定されているため、単純化されていますQDir::separator())。

于 2012-10-22T15:17:48.530 に答える
2

静的メソッドQDir::fromNativeSeparatorsを使用して、パスを操作するときにどこでもQDir::toNativeSeparators使用できます。/

于 2010-08-23T07:47:50.213 に答える
2

私はそのようなものを正確に知りませんが、次を使用して近づくことができますQDir::cd():

QDir path("base_path");
path.cd("subdir");

残念ながら、ファイルではなく、ディレクトリに対してのみ機能すると思います。ファイルの場合、次を使用できますQDir::filePath()

QDir path("base_path");
QString file_path = path.filePath("file.txt");
于 2010-08-23T18:29:26.517 に答える