Administrar el sistema de archivos con C++ y Boost

Publicado por Laura
hace 12 años

<p>Hola a todos. En este artículo mostraré un ejemplo sencillo sobre como copiar, borrar y saber el tamaño de un archivo en C++.</p>

<p>Para esto utilizaremos la librería Filesystem de Boost ( www.boost.org ). Esta librería nos permitirá hacer muchas cosas con el sistema de archivos independientemente de la plataforma en la que la utilicemos.</p>

<p>Para lograr nuestro objetivo, tomaremos los parámetros que el usuario nos da al llamar al programa. Estos parámetros están guardados en el vector <strong>argv</strong> en la función main.</p>

<pre class="prettyprint"> int main( int argc, char **argv ) { ...</pre>

<p>El primer elemento de este vector ( argv[ 0 ] ), siempre es el nombre del programa que se está ejecutando. Entonces el comando a ejecutar ( copiar, borrar, tamaño ) estará en el segundo elemento de este vector ( argv[ 1 ] ) y las opciones para dicho comando estarán en los siguientes índices. Pensando en que es un programa en modo de consola, se llamaría de la siguiente forma:</p>

<pre class="prettyprint"> ./programa comando opciones</pre>

<p>Por ejemplo para copiar un archivo ( fuente.txt ) a un destino ( destino.txt ) sería así:</p>

<pre class="prettyprint"> ./programa copiar fuente.txt destino.txt</pre>

<p>Como verán en el código, estos parámetros los guardaremos en una instancia de la clase vector de la librería STL ( que seguramente tendrán instalada ... ). De esta forma es más sencillo de manipular los datos.</p>

<p>Luego para copiar, borrar y saber el tamaño de un archivo utilizamos las funciones copy_file, remove y file_size, respectivamente.</p>

<p>Aquí les dejo el código:</p>

<pre class="prettyprint">

include &lt;iostream&gt;

include &lt;boost/filesystem.hpp&gt;

using namespace boost::filesystem;

/**

  • Clase FM ( File Management ) */ class FM { private: public: FM(){ ; } void mostrar_ayuda(); int procesar_comando( int, char ** ); int copiar( std::vector&lt;std::string&gt; ); int borrar( std::vector&lt;std::string&gt; ); int tamano( std::vector&lt;std::string&gt; ); };

/**

  • Método mostrar_ayuda
  • Muestra los comándos permitidos por pantalla. / void FM::mostrar_ayuda() { std::cout &lt;&lt; "Comandos permitidos:" &lt;&lt; std::endl; std::cout &lt;&lt; " copiar \t Copia un archivo \t\t ejemplo: programa copiar fuente destino" &lt;&lt; std::endl; std::cout &lt;&lt; " borrar \t Borra un archivo \t\t ejemplo: programa borrar archivo" &lt;&lt; std::endl; std::cout &lt;&lt; " tamaño \t Tamaño en bytes de un archivo \t ejemplo: programa tamaño archivo" &lt;&lt; std::endl; }

/**

  • Método copiar

  • Copia un archivo */ int FM::copiar( std::vector&lt;std::string&gt; parametros ) { // nos dieron los nombres de los archivo fuente y destino ? if( parametros.size() != 4 ) { mostrar_ayuda(); return 1; }

    // existe el archivo que queremos copiar ? if( ! exists( parametros[ 2 ] )) { std::cout &lt;&lt; "Parece que el archivo " &lt;&lt; parametros[ 2 ] &lt;&lt; " no existe." &lt;&lt; std::endl; return 1; }

    // el archivo destino existe ? Se está intentando sobreescribirlo ? if( exists( parametros[ 3 ] )) { // en este ejemplo no reemplazaremos el archivo. Simplemente le avisamos al usuario. std::cout &lt;&lt; "Ya existe un archivo con el nombre " &lt;&lt; parametros[ 3 ] &lt;&lt; "." &lt;&lt; std::endl; return 1; }

    // se copia el archivo copy_file( parametros[ 2 ], parametros[ 3 ] ); std::cout &lt;&lt; "Se ha copiado el archivo: " &lt;&lt; parametros[ 2 ] &lt;&lt; ", en el destino: " &lt;&lt; parametros[ 3 ] &lt;&lt; std::endl; return 0; }

/**

  • Método borrar
  • Borra un archivo. */ int FM::borrar( std::vector&lt;std::string&gt; parametros ) { // nos dieron el nombre del archivo que borraremos ? if( parametros.size() != 3 ) { mostrar_ayuda(); return 1; } // existe el archivo ? if( ! exists( parametros[ 2 ] )) { std::cout &lt;&lt; "Parece que el archivo " &lt;&lt; parametros[ 2 ] &lt;&lt; " no existe." &lt;&lt; std::endl; return 1; } // borrar y salir remove( parametros[ 2 ] ); std::cout &lt;&lt; "Se ha borrado el archivo " &lt;&lt; parametros[ 2 ] &lt;&lt; std::endl; return 0; }

/**

  • Método tamaño
  • Muestra el tamaño de un archivo en bytes. */ int FM::tamano( std::vector&lt;std::string&gt; parametros ) { // nos dieron el nombre del archivo ? if( parametros.size() != 3 ) { mostrar_ayuda(); return 1; } // existe el archivo que nos dieron ? if( ! exists( parametros[ 2 ] )) { std::cout &lt;&lt; "Parece que el archivo " &lt;&lt; parametros[ 2 ] &lt;&lt; " no existe." &lt;&lt; std::endl; return 1; } // mostrar el tamaño y salir. std::cout &lt;&lt; "Archivo: " &lt;&lt; parametros[ 2 ] &lt;&lt; std::endl; std::cout &lt;&lt; "Tamaño: " &lt;&lt; file_size( parametros[ 2 ] ) &lt;&lt; " bytes." &lt;&lt; std::endl; return 0; }

/**

  • Método procesar_comando

  • Procesa el comando ingresado por el usuario al comenzar el programa. */ int FM::procesar_comando( int argc, char **argv ) { // Nos dieron el nombre del comando ? if( argc &lt;= 1 ) { mostrar_ayuda(); return 1; }

    // pasamos todos los parámetros a un nuevo vector // así será más fácil manipularlo std::vector&lt;std::string&gt; parametros; for( short a = 0; a &lt; argc; a++ ) parametros.push_back( argv[ a ] );

    // ejecutamos el comando que nos hayan pedido if( parametros[ 1 ] == "copiar" ) return copiar( parametros ); if( parametros[ 1 ] == "borrar" ) return borrar( parametros ); if( parametros[ 1 ] == "tamaño" ) return tamano( parametros );

    // si el programa llega hasta aquí es porque el comando no existe. mostrar_ayuda(); return 1; }

/**

  • Función principal */ int main( int argc, char **argv ) { FM fm; return fm.procesar_comando( argc, argv ); }</pre>

<p>Voto positivo si te parece útil. Saludos a todos!</p>

boost archivos c++