Programing

별도의 문자열에서 전체 경로 문자열을 (안전하게) 만드는 방법은 무엇입니까?

lottogame 2020. 10. 5. 07:30
반응형

별도의 문자열에서 전체 경로 문자열을 (안전하게) 만드는 방법은 무엇입니까?


C ++에는 파이썬의 기능과 동등한 것이 os.path.join있습니까? 기본적으로 파일 경로의 두 부분 (또는 그 이상)을 결합하는 것을 찾고 있으므로 두 부분이 완벽하게 맞 물리는 것에 대해 걱정할 필요가 없습니다. Qt에 있다면 그것도 멋질 것입니다.

기본적으로 나는 몇 가지 코드를 디버깅 시간을 소비하기 때문에 그것의 적어도 일부에 있었다 root + filename있어야했다 root/ + filename, 나는 미래에 있음을 피하기 위해 찾고 있어요.


이에 대한 QDir확인하십시오 .

QString path = QDir(dirPath).filePath(fileName);

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;
}

다음은 컴파일 및 실행의 예입니다 (플랫폼 별) :

$ g++ ./test.cpp -o test -lboost_filesystem -lboost_system
$ ./test 
/tmp/foo.txt

유사 @ user405725 의 대답 (그러나 부스트를 사용하지 않음)에 의해 언급 @ildjarn 코멘트에서,이 기능의 일부로 볼 수 있습니다 표준 : 실험 :: 파일 시스템 . 다음 코드는 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;
}

유닉스 / 리눅스에서 적어도, 그것은에 의해 경로의 일부를 가입하는 것이 안전 /경로의 일부가 이미 종료하더라도 /, 즉 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().

참고 URL : https://stackoverflow.com/questions/6297738/how-to-build-a-full-path-string-safely-from-separate-strings

반응형