web-dev-qa-db-de.com

Wie erstelle ich eine vollständige Pfadzeichenfolge (sicher) aus separaten Zeichenfolgen?

Hat C++ eine Entsprechung zu Pythons Funktion os.path.join? Grundsätzlich bin ich auf der Suche nach etwas, das zwei (oder mehr) Teile eines Dateipfads kombiniert, sodass Sie sich keine Sorgen machen müssen, ob die beiden Teile perfekt zusammenpassen. Wenn es in Qt ist, wäre das auch cool.

Grundsätzlich habe ich eine Stunde damit verbracht, Code zu debuggen und zumindest einen Teil davon, weil root + filename musste sein root/ + filename, und ich versuche das in Zukunft zu vermeiden.

80
sas4740

Check out QDir dafür:

QString path = QDir(dirPath).filePath(fileName);
37
Stephen Chu

Nur als Teil der Boost.Filesystem Bibliothek. Hier ist ein Beispiel:

#include <iostream>
#include <boost/filesystem.hpp>

namespace fs = boost::filesystem;

int main ()
{
    fs::path dir ("/tmp");
    fs::path file ("foo.txt");
    fs::path full_path = dir / file;
    std::cout << full_path << std::endl;
    return 0;
}

Hier ist ein Beispiel für das Kompilieren und Ausführen (plattformspezifisch):

$ g++ ./test.cpp -o test -lboost_filesystem -lboost_system
$ ./test 
/tmp/foo.txt
94
user405725

Ähnlich wie die Antwort von @ user405725 (jedoch ohne Boost) und angegeben durch @ ildjarn In einem Kommentar ist diese Funktionalität als Teil von std :: experimental :: filesystem verfügbar. Der folgende Code wird mit Microsoft Visual Studio 2015 Community Edition kompiliert:

#include <iostream>
#include <filesystem>
namespace fs = std::experimental::filesystem;

int main() 
{
    fs::path dir ("/tmp");
    fs::path file ("foo.txt");
    fs::path full_path = dir / file;
    std::cout << full_path << std::endl;
    return 0;
}
19
Shawn Blakesley

Zumindest unter Unix/Linux ist es immer sicher, Teile eines Pfades mit / Zu verbinden, auch wenn einige Teile des Pfades bereits mit / Enden, dh root/path Ist äquivalent zu root//path.

In diesem Fall müssen Sie sich nur mit / Verbinden. Trotzdem stimme ich anderen Antworten zu, dass boost::filesystem Eine gute Wahl ist, wenn es für Sie verfügbar ist, da es mehrere Plattformen unterstützt.

8
frankc

Wenn Sie dies mit Qt tun möchten, können Sie den Konstruktor QFileInfo verwenden:

QFileInfo fi( QDir("/tmp"), "file" );
QString path = fi.absoluteFilePath();
6
LoSciamano

Verwenden Sie in Qt einfach / Im Code, wenn Sie die Qt-API verwenden (QFile, QFileInfo). Es wird auf allen Plattformen das Richtige tun. Wenn Sie einen Pfad zu einer Nicht-Qt-Funktion übergeben müssen oder ihn formatieren möchten, um ihn dem Benutzer anzuzeigen, verwenden Sie QDir:toNativeSeparators(), z.

QDir::toNativeSeparators( path );

Es wird / Durch das native Äquivalent (d. H. \ Unter Windows) ersetzt. Die andere Richtung erfolgt über QDir::fromNativeSeparators().

3
Frank Osterfeld

Mit C++ 11 und Qt können Sie dies tun:

QString join(const QString& v) {
    return v;
}

template<typename... Args>
QString join(const QString& first, Args... args) {
    return QDir(first).filePath(join(args...));
}

Verwendung:

QString path = join("/tmp", "dir", "file"); // /tmp/dir/file
3
kainjow