Administrar el sistema de archivos con C++ y Boost

Publicado por Laura
hace 6 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 <iostream>

include <boost/filesystem.hpp>

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<std::string> ); int borrar( std::vector<std::string> ); int tamano( std::vector<std::string> ); };

/**

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

/**

  • Método copiar
  • Copia un archivo */ int FM::copiar( std::vector<std::string> 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 << "Parece que el archivo " << parametros[ 2 ] << " no existe." << 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 << "Ya existe un archivo con el nombre " << parametros[ 3 ] << "." << std::endl; return 1; }

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

/**

  • Método borrar
  • Borra un archivo. */ int FM::borrar( std::vector<std::string> 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 << "Parece que el archivo " << parametros[ 2 ] << " no existe." << std::endl; return 1; } // borrar y salir remove( parametros[ 2 ] ); std::cout << "Se ha borrado el archivo " << parametros[ 2 ] << std::endl; return 0; }

/**

  • Método tamaño
  • Muestra el tamaño de un archivo en bytes. */ int FM::tamano( std::vector<std::string> 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 << "Parece que el archivo " << parametros[ 2 ] << " no existe." << std::endl; return 1; } // mostrar el tamaño y salir. std::cout << "Archivo: " << parametros[ 2 ] << std::endl; std::cout << "Tamaño: " << file_size( parametros[ 2 ] ) << " bytes." << 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 <= 1 ) { mostrar_ayuda(); return 1; }

    // pasamos todos los parámetros a un nuevo vector // así será más fácil manipularlo std::vector<std::string> parametros; for( short a = 0; a < 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>