Как построить полную строку пути (безопасно) из отдельных строк?
имеет ли C++ какой-либо эквивалент функции python os.path.join? В принципе, я ищу что-то, что объединяет две (или более) части пути к файлу, так что вам не нужно беспокоиться о том, чтобы две части идеально сочетались друг с другом. Если это в Qt, это тоже было бы круто.
в основном я потратил час отладки кода и по крайней мере часть ее, потому что root + filename должен быть root/ + filename, и я ищу, чтобы избежать этого в будущем.
7 ответов:
проверить QDir для этого:
QString path = QDir(dirPath).filePath(fileName);
только как часть импульс.Файловая система библиотека. Вот пример:
#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; }вот пример компиляции и запуска (для конкретной платформы):
$ g++ ./test.cpp -o test -lboost_filesystem -lboost_system $ ./test /tmp/foo.txt
аналогично @user405725ответ (но не с помощью boost), и упоминается @ildjarn в комментарии, эта функция доступна как часть std:: experimental:: filesystem. Следующий код компилируется с помощью Microsoft Visual Studio 2015 Community Edition:
#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; }
по крайней мере, в 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()например:QDir::toNativeSeparators( path );заменит
/по собственному эквиваленту (т. е.\в Windows). Другое направление делается черезQDir::fromNativeSeparators().
Comments