Czy C ++ ma odpowiednik funkcji Pythona os.path.join
? Zasadniczo szukam czegoś, co łączy dwie (lub więcej) części ścieżki pliku, abyś nie musiał się martwić, że te dwie części idealnie do siebie pasują. Jeśli jest w Qt, to też byłoby fajne.
Zasadniczo spędziłem godzinę na debugowaniu jakiegoś kodu, a przynajmniej część z tego była root + filename
taka root/ + filename
, ponieważ musiała , i chcę tego uniknąć w przyszłości.
complete
)Odpowiedzi:
Sprawdź QDir dla tego:
źródło
Tylko jako część biblioteki Boost.Filesystem . Oto przykład:
#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; }
Oto przykład kompilacji i uruchomienia (zależnie od platformy):
źródło
Podobnie jak odpowiedź @ user405725 (ale nie używająca boost) i wspomniana przez @ildjarn w komentarzu, ta funkcjonalność jest dostępna jako część systemu plików std :: . Poniższy kod kompiluje się przy użyciu Homebrew GCC 9.2.0_1 i przy użyciu flagi
--std=c++17
:#include <iostream> #include <filesystem> namespace fs = std::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; }
źródło
Przynajmniej w systemie Unix / Linux zawsze można bezpiecznie łączyć części ścieżki
/
, nawet jeśli niektóre części ścieżki już się kończą/
, tj.root/path
Są równoważneroot//path
.W takim przypadku wszystko, czego naprawdę potrzebujesz, to dołączyć do rzeczy
/
. To powiedziawszy, zgadzam się z innymi odpowiedziami, któreboost::filesystem
są dobrym wyborem, jeśli są dostępne, ponieważ obsługują wiele platform.źródło
Jeśli chcesz to zrobić z Qt, możesz użyć
QFileInfo
konstruktora:QFileInfo fi( QDir("/tmp"), "file" ); QString path = fi.absoluteFilePath();
źródło
Z C ++ 11 i Qt możesz to zrobić:
QString join(const QString& v) { return v; } template<typename... Args> QString join(const QString& first, Args... args) { return QDir(first).filePath(join(args...)); }
Stosowanie:
QString path = join("/tmp", "dir", "file"); // /tmp/dir/file
źródło
W Qt po prostu użyj
/
w kodzie, gdy używasz Qt API (QFile
,QFileInfo
). Będzie działać dobrze na wszystkich platformach. Jeśli musisz podać ścieżkę do funkcji innej niż Qt lub chcesz ją sformatować w celu wyświetlenia jej użytkownikowi, użyjQDir:toNativeSeparators()
np .:Zastąpi
/
natywny odpowiednik (np. W\
systemie Windows). Drugi kierunek odbywa się za pośrednictwemQDir::fromNativeSeparators()
.źródło