Además de estas dificultades, que plagan nuestro código de #ifdef win32 #elseif.... , otros problemas que muchas veces nos hace acabar recurriendo al socorrido system(cmd). Con boost tenemos un codigo unificado que no desordea nuestro codigo y que nos permite interactuar con el sistema de ficheros. Podemos añadirlo con la cabecera:
#include "boost/filesystem.hpp"
Lo primero que tenemos que conocer es la clase path. La declaramos asi:
boost::filesystem::path ruta("myDir");
Otra cosa importante es que el operator/ esta sobrecargado y hace la concatenacion de directorios. Junto con la ruta declarada antes, podriamos hacer:
boost::filesystem::path ruta("myDir"); boost::filesystem::path root("myRootDir"); boost::filesystem::path completeRoot = root / ruta; // podriamos hacer lo mismo pero ahorrando una variable con root /= ruta
Dentro de la libreria podemos encontrar algunas funciones muy útiles para borrar y crear directorios y archivos:
boost::filesystem::create_directory("dir"); boost::filesystem::remove_all("file");
E incluso para saber si existe un archivo, conocer si es un directorio, un archivo o un link
boost::filesystem::exists("file"); if(boost::filesystem::is_directory("file")) {}
Para acabar, los iteradores nos permiten recorrer los contenidos de un determinado directorio:
boost::filesystem::directory_iterator end_iter; boost::filesystem::directory_iterator dir_iter(directory); for(dir_iter; dir_iter != end_iter; ++dir_iter) { }
En zeleste2D, esta es la funcion para crear recursivamente una ruta que no existe:
//TODO: Would this method be more general and live outside this class?? bool pathCreator( boost::filesystem::path& path_to_create ) { if (!fs::exists(path_to_create)) { pathCreator(path_to_create.parent_path()); } //if not create the directory fs::create_directory(path_to_create); return true;