martes, 27 de septiembre de 2011

Boost filesystem

Una de las librerias que siempre vienen bien conocer en boost es la filesystem. Parece una tonteria pero se pueden llegar a gastar unas cuantas horas programando y debuggando un sistema de ficheros. Si ademas es multiplataforma todavía más. Por que a los separadores de ficheros, que segun el sistema puede ser "/" o "\", se suma que en sistemas windows existen las "unidades" (C: E: D:),  que en linux existen los enlaces soft y hard...

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;

No hay comentarios:

Publicar un comentario