How to build a full path string (safely) from separate strings?
Solution 1:
Only as part of Boost.Filesystem library. Here is an example:
#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;
}
Here is an example of compiling and running (platform specific):
$ g++ ./test.cpp -o test -lboost_filesystem -lboost_system
$ ./test
/tmp/foo.txt
Solution 2:
Check out QDir for that:
QString path = QDir(dirPath).filePath(fileName);
Solution 3:
Similar to @user405725's answer (but not using boost), and mentioned by @ildjarn in a comment, this functionality is available as part of std::filesystem. The following code compiles using Homebrew GCC 9.2.0_1 and using the flag --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;
}
Solution 4:
At least in Unix / Linux, it's always safe to join parts of a path by /
, even if some parts of the path already end in /
, i.e. root/path
is equivalent to root//path
.
In this case, all you really need is to join things on /
. That said, I agree with other answers that boost::filesystem
is a good choice if it is available to you because it supports multiple platforms.