Apakah C ++ memiliki fungsi yang setara dengan python os.path.join
? Pada dasarnya, saya mencari sesuatu yang menggabungkan dua (atau lebih) bagian dari jalur file sehingga Anda tidak perlu khawatir tentang memastikan kedua bagian cocok satu sama lain. Kalau di Qt, itu keren juga.
Pada dasarnya saya menghabiskan satu jam men-debug beberapa kode dan setidaknya sebagian karena root + filename
harus root/ + filename
, dan saya ingin menghindarinya di masa depan.
complete
)Jawaban:
Lihat QDir untuk itu:
sumber
Hanya sebagai bagian dari pustaka Boost.Filesystem . Berikut ini contohnya:
#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; }
Berikut adalah contoh kompilasi dan pengoperasian (khusus platform):
sumber
Mirip dengan jawaban @ user405725 (tetapi tidak menggunakan boost), dan disebutkan oleh @ildjarn dalam komentar, fungsionalitas ini tersedia sebagai bagian dari std :: filesystem . Kode berikut dikompilasi menggunakan Homebrew GCC 9.2.0_1 dan menggunakan bendera
--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; }
sumber
Setidaknya di Unix / Linux, itu selalu aman untuk bergabung dengan bagian dari sebuah jalur dengan
/
, bahkan jika beberapa bagian dari jalur tersebut sudah diakhiri/
, yaituroot/path
setara denganroot//path
.Dalam hal ini, yang benar-benar Anda butuhkan hanyalah menggabungkan berbagai hal
/
. Karena itu, saya setuju dengan jawaban lain yangboost::filesystem
merupakan pilihan yang baik jika tersedia untuk Anda karena mendukung banyak platform.sumber
Jika Anda ingin melakukan ini dengan Qt, Anda dapat menggunakan
QFileInfo
konstruktor:QFileInfo fi( QDir("/tmp"), "file" ); QString path = fi.absoluteFilePath();
sumber
Dengan C ++ 11 dan Qt Anda dapat melakukan ini:
QString join(const QString& v) { return v; } template<typename... Args> QString join(const QString& first, Args... args) { return QDir(first).filePath(join(args...)); }
Pemakaian:
QString path = join("/tmp", "dir", "file"); // /tmp/dir/file
sumber
Di Qt, cukup gunakan
/
dalam kode saat menggunakan Qt API (QFile
,QFileInfo
). Itu akan melakukan hal yang benar di semua platform. Jika Anda harus meneruskan jalur ke fungsi non-Qt, atau ingin memformatnya untuk ditampilkan kepada pengguna, gunakanQDir:toNativeSeparators()
misalnya:Ini akan diganti
/
dengan padanan asli (yaitu\
pada Windows). Arah lain dilakukan melaluiQDir::fromNativeSeparators()
.sumber