How to build a full path string (safely) from separate strings?

后端 未结 7 1291
失恋的感觉
失恋的感觉 2020-12-08 12:34

Does C++ have any equivalent to python\'s function os.path.join? Basically, I\'m looking for something that combines two (or more) parts of a file path so that

相关标签:
7条回答
  • 2020-12-08 13:02

    In Qt, just use / in code when using Qt API (QFile, QFileInfo). It will do the right thing on all platforms. If you have to pass a path to a non-Qt function, or want to format it for displaying it to the user, use QDir:toNativeSeparators() e.g.:

    QDir::toNativeSeparators( path );
    

    It will replace / by the native equivalent (i.e. \ on Windows). The other direction is done via QDir::fromNativeSeparators().

    0 讨论(0)
  • 2020-12-08 13:06

    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;
    }
    
    0 讨论(0)
  • 2020-12-08 13:09

    If you want to do this with Qt, you can use QFileInfo constructor:

    QFileInfo fi( QDir("/tmp"), "file" );
    QString path = fi.absoluteFilePath();
    
    0 讨论(0)
  • 2020-12-08 13:17

    Check out QDir for that:

    QString path = QDir(dirPath).filePath(fileName);
    
    0 讨论(0)
  • 2020-12-08 13:28

    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
    
    0 讨论(0)
  • 2020-12-08 13:28

    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.

    0 讨论(0)
提交回复
热议问题