Есть ли в C ++ эквивалент функции Python os.path.join
? По сути, я ищу что-то, что объединяет две (или более) части пути к файлу, чтобы вам не приходилось беспокоиться о том, чтобы эти две части идеально подходили друг к другу. Если бы это было в Qt, это тоже было бы круто.
Обычно я потратил час на отладку некоторого кода, и, по крайней мере, часть этого была вызвана root + filename
необходимостью root/ + filename
, и я стараюсь избежать этого в будущем.
complete
)Ответы:
Проверьте QDir для этого:
источник
Только в составе библиотеки Boost.Filesystem . Вот пример:
#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; }
Вот пример компиляции и запуска (зависит от платформы):
источник
Подобно ответу @ user405725 (но без использования boost) и упомянутому @ildjarn в комментарии, эта функция доступна как часть std :: filesystem . Следующий код компилируется с использованием Homebrew GCC 9.2.0_1 и с использованием флага
--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; }
источник
По крайней мере, в Unix / Linux всегда безопасно соединять части пути
/
, даже если некоторые части пути уже оканчиваются/
, т.root/path
Е. Эквивалентныroot//path
.В этом случае все, что вам действительно нужно, - это присоединиться к делу
/
. Тем не менее, я согласен с другими ответами, которыеboost::filesystem
являются хорошим выбором, если они доступны вам, поскольку они поддерживают несколько платформ.источник
Если вы хотите сделать это с помощью Qt, вы можете использовать
QFileInfo
конструктор:QFileInfo fi( QDir("/tmp"), "file" ); QString path = fi.absoluteFilePath();
источник
С C ++ 11 и Qt вы можете сделать это:
QString join(const QString& v) { return v; } template<typename... Args> QString join(const QString& first, Args... args) { return QDir(first).filePath(join(args...)); }
Применение:
QString path = join("/tmp", "dir", "file"); // /tmp/dir/file
источник
В Qt просто используйте
/
код при использовании Qt API (QFile
,QFileInfo
). Он будет работать правильно на всех платформах. Если вам нужно передать путь к функции, отличной от Qt, или вы хотите отформатировать ее для отображения пользователю, используйте,QDir:toNativeSeparators()
например:Он будет заменен
/
собственным эквивалентом (например,\
в Windows). Другое направление - черезQDir::fromNativeSeparators()
.источник