2010-08-22 4 views
9

Ich brauche eine ähnliche .NET-Methode zum sicheren Kombinieren von Pfadteilen, ohne sich um plattformspezifische Besonderheiten des Pfadtrennzeichens kümmern zu müssen.Gibt es QPath :: Kombinieren in QT4?

Gibt es solche Klasse und Methode in QT4?

Etwas wie:

QPath::Combine 
+0

Bitte ändern Sie die akzeptierte Antwort (siehe Kommentar zu 'cd()' Ausführen einer Existenzprüfung) – Andy

Antwort

25

Es keine Funktion ist, die als direkter Ersatz verwendet werden kann für Path.Combine() so müssen Sie es von Ihrem eigenen schreiben.

Sie können es in der harten Art und Weise tun (Umgang mit alles selbst) oder verwenden Sie einfach QDir::cleanPath():

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

I QDir::separator() verwendet, aber wie in Cross-platform way of constructing a FS path with Qt Sie nicht wirklich brauchen sie wies darauf hin, und Sie können einfach verwenden die /. QDir::cleanPath() entfernt doppelte / (oder doppelte \, nach QDir::separator()) und löst . und .. zu den entsprechenden Werten. Siehe auch Qt equivalent of PathAppend? für Code über QT PathAppend() Ersatz.

Wie gesagt, es ahmt PathAppend() native Funktion (siehe MSDN), aber dies ist kein exakter Ersatz von Path.Combine() weil Path.Combine() keine Reinigung oder Normalisierung nicht durchführt (es nur Zeichenfolge anfügt, Verzeichnis-Separatoren in den richtigen Handhabung Weg, siehe MSDN). Wenn Sie einen genauen Ersatz Sie dies verwenden können ein:

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

Diese Funktion wird einen nachlauf Verzeichnisseparator nicht hinzufügen, wenn path2 ein Verzeichnisname ist (es führt keine Kontrolle und Pfad kann auch nicht existieren überhaupt). Beachten Sie außerdem, dass path2 ein Unterpfad von path1 sein muss (relative Pfade höher als path1 werden nicht unterstützt, wenn Sie sie benötigen, müssen Sie die vorherige Version mit QDir::cleanPath() verwenden), auch wenn path2 verwurzelt ist, wird zurückgegeben (diese Implementierung ist ziemlich naiv, zum Beispiel ist es nicht erkennenc:\directory als Root-Pfad).

trim() und trimEnd() Funktionen entfernen nachgestellten Verzeichnis Trennzeichen (für eine mögliche, generische, Implementierung siehe How do I remove trailing whitespace from a QString? als Startpunkt).Algorithmus um sicherzustellen, gibt es eine nachlaufende Verzeichnis Trennzeichen ist die gleiche in How to ensure there is trailing directory separator in paths? beschrieben (vereinfacht, weil hier immer ein Verzeichnis Trennzeichen durch QDir::separator() gegeben haben).

2

können Sie die statischen Methoden verwenden QDir::fromNativeSeparators und QDir::toNativeSeparators und dann / überall verwenden, wenn Sie den Pfad zu manipulieren.

+0

Dies kann den Trick tun, aber Path.Combine hat den Trick, auch sicherzustellen, dass Sie den abschließenden Pfadbegrenzer nicht vergessen haben, wenn kombiniert wird Path.Combine ("c: // test_folder", "Dateiname.txt") Gibt es solche sichere Pfadkombinationstechnik in QT? –

+0

Werfen Sie einen Blick auf 'QDir' und http://stackoverflow.com/questions/740423/qt-class-for-handling-file-paths. – Ivo

0

Ich weiß nicht genau, von so etwas, aber Sie können in der Nähe erhalten, indem QDir::cd() mit:

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

Leider denke ich, dass nur für Verzeichnisse arbeitet, keine Dateien. Für Dateien, könnten Sie QDir::filePath() verwenden:

QDir path("base_path"); 
QString file_path = path.filePath("file.txt"); 
+7

Beachten Sie, dass 'cd()' Pfadmanipulationen nicht wirklich durchführt: Es wird nur den cd-Vorgang ausführen, wenn das Quellverzeichnis existiert, also mischt es die Pfadkonstruktion mit der Existenzprüfung (was albern ist IMHO). –

+1

@LucTouraille total albern! es kompliziert meine Unit-Tests – Andy

Verwandte Themen