2010-03-07 19 views
29

Tengo un determinado boost::filesystem::path en mano y me gustaría adjuntar una cadena (o ruta) a la misma.Adjuntar para impulsar :: sistema de archivos :: ruta

boost::filesystem::path p("c:\\dir"); 
p.append(".foo"); // should result in p pointing to c:\dir.foo 

La única sobrecarga boost::filesystem::path tiene de append quiere dos InputIterator s.

Mi solución hasta ahora es hacer lo siguiente:

boost::filesystem::path p2(std::string(p.string()).append(".foo")); 

Me estoy perdiendo algo?

Respuesta

28
#include <iostream> 
#include <string> 
#include <boost/filesystem.hpp> 


int main() { 
    boost::filesystem::path p (__FILE__); 

    std::string new_filename = p.leaf() + ".foo"; 
    p.remove_leaf() /= new_filename; 
    std::cout << p << '\n'; 

    return 0; 
} 

Probado con 1,37, pero hoja y remove_leaf también se documentan en 1.35. Deberá probar si el último componente de p es primero un nombre de archivo, en caso de que no lo sea.

+2

No estoy seguro de si esto es mejor que lo que hago actualmente, pero lo aceptaré de todos modos. – Zack

+0

@Zack: es muy parecido a lo que tienes. Comencé con la API 1.42, noté sus comentarios en la otra respuesta acerca de 1.35 y trabajé hacia atrás para obtener esto. Sin embargo, esto es más fácil de verificar, p. si p.leaf() == "." (porque p == "/ some/dir /"). –

50

Si no deja de ser la extensión del nombre de archivo que desea cambiar entonces usted está probablemente mejor de la escritura:

p.replace_extension(".foo"); 

para la mayoría de otras operaciones de trazado de archivos se pueden utilizar los operadores /= y / que permite concatenar partes de un nombre. Por ejemplo

boost::filesystem::path p("c:\\dir"); 
p /= "subdir"; 

se referirá a c:\dir\subdir.

+2

estoy trabajando con Boost 1.35, así que no tengo replace_extension todavía.Pero aun así no puedo ver cómo crees que resuelve mi problema. Quiero ** agregar ** una "extensión", no cambiarla. Lo ilustré en la pregunta, supongamos que 'path p (" c: \\ dir ")', ahora viene algo que agregará 'abc' a' p', lo que debería dar como resultado 'p' apuntando a' c: \ dirabc '. El operador '/' tampoco puede ayudar con mi problema. – Zack

+1

Deberías haber mencionado que usas Boost V1.35. Ahí tienes una función global replace_extension (path) haciendo lo mismo que describí anteriormente. Además, replace_extension simplemente agrega una extensión si ya no está presente. Si desea modificar partes de su ruta (por ejemplo, una parte de directorio, digamos c: \\ dir \\ bla a c: \\ dirfoo \\ bla) necesita separar la ruta, modificar las partes de la ruta ruta (que son solo cadenas) con cualquier función de cadena que prefiera y ponerlos juntos después. No hay forma de evitar esto ... – hkaiser

+3

No agrega una extensión si no hay una (al menos no en 1.35). Y si hay uno, lo reemplazará por mí, que es ** no ** lo que quería. Simplemente quiero ** anexar **. Sigue mi código sugerido sobre cómo lo estoy resolviendo ahora para ver lo que quiero. – Zack

4
path p; 
std::string st = "yoo"; 
p /= st + ".foo"; 
9

con la versión 3 de la biblioteca de sistema de archivos (Boost 1.55.0) Es tan fácil como

boost::filesystem::path p("one_path"); 
p += "_and_another_one"; 

resultando en p = "one_path_and_another_one".

+6

Pero todavía no 'operator + (std :: string)' o 'operator + (const char *)'. No sé por qué tienen que hacerlo tan difícil. –

+0

¿Alguna idea de en qué versión exacta se agregó esto? http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/release_history.html no es de ninguna ayuda y las versiones más nuevas no parecen existir ... – Ela782

+2

Lo encontré, es 1.50 .0: http://www.boost.org/doc/libs/1_58_0/libs/filesystem/doc/release_history.html – Ela782

0

Puede definir el operador + usted mismo de modo que pueda agregar dos variables boost::filesystem::path.

inline boost::filesystem::path operator+(boost::filesystem::path left, boost::filesystem::path right){return boost::filesystem::path(left)+=right;} 

después, se puede agregar una variable std::string (conversión implícita). Esto es similar a la definición de la operator/ de

include/impulso/sistema de archivos/path.hpp:

inline path operator/(const path& lhs, const path& rhs) { return path(lhs) /= rhs; } 

Aquí es un ejemplo de trabajo:

main.cpp:

#include <iostream> 
#include <string> 
#include <boost/filesystem.hpp> 

using namespace boost::filesystem; 
inline path operator+(path left, path right){return path(left)+=right;} 

int main() { 
    path p1 = "/base/path"; 
    path p2 = "/add/this"; 
    std::string extension=".ext"; 
    std::cout << p1+p2+extension << '\n'; 
    return 0; 
} 

compilado con

g++ main.cpp -lboost_system -lboost_filesystem 

produce la salida:

$ ./a.out 
"/base/path/add/this.ext" 
Cuestiones relacionadas