Как построить полную строку пути (безопасно) из отдельных строк?



имеет ли C++ какой-либо эквивалент функции python os.path.join? В принципе, я ищу что-то, что объединяет две (или более) части пути к файлу, так что вам не нужно беспокоиться о том, чтобы две части идеально сочетались друг с другом. Если это в Qt, это тоже было бы круто.



в основном я потратил час отладки кода и по крайней мере часть ее, потому что root + filename должен быть root/ + filename, и я ищу, чтобы избежать этого в будущем.

623   7  

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

    Ничего не найдено.