c++ - seguro - medir largo cadena bicicleta
¿Cómo construir una cadena de ruta completa(de forma segura) desde cadenas separadas? (7)
Al menos en Unix / Linux, siempre es seguro unir partes de una ruta en /
, incluso si algunas partes de la ruta ya terminan en /
, es decir, la root/path
es equivalente a root//path
.
En este caso, todo lo que realmente necesitas es unir cosas en /
. Dicho esto, estoy de acuerdo con otras respuestas que boost::filesystem
es una buena opción si está disponible para usted, ya que admite múltiples plataformas.
¿Tiene C ++ algún equivalente de la función de python os.path.join
? Básicamente, estoy buscando algo que combine dos (o más) partes de una ruta de archivo para que no tenga que preocuparse por asegurarse de que las dos partes encajen perfectamente. Si está en Qt, eso sería genial también.
Básicamente, pasé una hora depurando algunos códigos y al menos una parte se debía a que root + filename
tenía que ser root/ + filename
, y estoy buscando evitar eso en el futuro.
Con C ++ 11 y Qt puedes 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
De forma similar a la respuesta de @ user405725 (pero sin utilizar boost), y mencionado por @ildjarn en un comentario, esta funcionalidad está disponible como parte de std::experimental::filesystem . El siguiente código se compila utilizando 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;
}
Echa un vistazo a QDir por eso:
QString path = QDir(dirPath).filePath(fileName);
En Qt, solo use /
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 Qt o desea formatearla para mostrarla al usuario, use QDir:toNativeSeparators()
por ejemplo:
QDir::toNativeSeparators( path );
Reemplazará /
por el equivalente nativo (es decir, /
en Windows). La otra dirección se realiza a través de QDir::fromNativeSeparators()
.
Si desea hacer esto con Qt, puede usar el constructor de QFileInfo
:
QFileInfo fi( QDir("/tmp"), "file" );
QString path = fi.absoluteFilePath();
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):
$ g++ ./test.cpp -o test -lboost_filesystem -lboost_system
$ ./test
/tmp/foo.txt