¿C ++ tiene algún equivalente a la función de Python os.path.join
? Básicamente, estoy buscando algo que combine dos (o más) partes de la ruta de un archivo para que no tenga que preocuparse por asegurarse de que las dos partes encajen perfectamente. Si está en Qt, también sería genial.
Básicamente, pasé una hora depurando algo de código y al menos parte de eso fue porque root + filename
tenía que ser así root/ + filename
, y estoy buscando evitar eso en el futuro.
complete
)Respuestas:
Echa un vistazo a QDir para eso:
fuente
Solo como parte de la biblioteca Boost.Filesystem . Aquí hay un ejemplo:
#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; }
Aquí hay un ejemplo de compilación y ejecución (específico de la plataforma):
fuente
Similar a la respuesta de @ user405725 (pero sin usar boost), y mencionada por @ildjarn en un comentario, esta funcionalidad está disponible como parte de std :: filesystem . El siguiente código se compila usando Homebrew GCC 9.2.0_1 y usando la bandera
--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; }
fuente
Al menos en Unix / Linux, siempre es seguro unir partes de una ruta por
/
, incluso si algunas partes de la ruta ya terminan en/
,root/path
es decir, es equivalente aroot//path
.En este caso, todo lo que realmente necesita es unir cosas
/
. Dicho esto, estoy de acuerdo con otras respuestas queboost::filesystem
es una buena opción si está disponible para usted porque es compatible con múltiples plataformas.fuente
Si desea hacer esto con Qt, puede usar el
QFileInfo
constructor:QFileInfo fi( QDir("/tmp"), "file" ); QString path = fi.absoluteFilePath();
fuente
Con C ++ 11 y Qt puede hacer esto:
QString join(const QString& v) { return v; } template<typename... Args> QString join(const QString& first, Args... args) { return QDir(first).filePath(join(args...)); }
Uso:
QString path = join("/tmp", "dir", "file"); // /tmp/dir/file
fuente
En Qt, solo utilícelo
/
en el código cuando use Qt API (QFile
,QFileInfo
). Hará lo correcto en todas las plataformas. Si tiene que pasar una ruta a una función que no es de Qt, o desea formatearla para mostrarla al usuario, use,QDir:toNativeSeparators()
por ejemplo:Reemplazará
/
por el equivalente nativo (es decir,\
en Windows). La otra dirección se hace víaQDir::fromNativeSeparators()
.fuente