C ++にはpythonの関数と同等のものはありos.path.join
ますか?基本的に、ファイルパスの2つ(またはそれ以上)の部分を組み合わせて、2つの部分が完全に一致することを確認する必要がないようにするものを探しています。それがQtにあれば、それもクールです。
基本的に、コードのデバッグに1時間を費やしましたが、少なくともその一部はで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のコメントで、この機能はの一部として利用可能であるのstd ::ファイルシステム。次のコードは、Homebrew GCC 9.2.0_1とフラグを使用してコンパイルします--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;
}
少なくともUnix / Linuxでは、パスの/
一部がすでにで終わっている/
、つまりroot/path
と等しい場合でも、パスの一部をで結合しても安全root//path
です。
この場合、本当に必要なのはに参加することだけ/
です。とは言っても、boost::filesystem
複数のプラットフォームをサポートしているので、それが利用可能な場合は良い選択である他の回答にも同意します。
Qtでは、/
Qt API(QFile
、QFileInfo
)を使用するときにコードで使用するだけです。すべてのプラットフォームで正しく動作します。Qt以外の関数にパスを渡す必要がある場合、またはユーザーに表示するためにパスをフォーマットする場合は、QDir:toNativeSeparators()
たとえば次のように使用します。
QDir::toNativeSeparators( path );
これは/
、ネイティブの同等のもの(\
Windowsの場合など)に置き換えられます。他の方向はを介して行われQDir::fromNativeSeparators()
ます。
complete
)