Como listar todos los archivos de una carpeta con c++??

Publicado por Milhouse Van Houten
hace 10 años

<p>Hola a todos. como hago para listar todos los archivos de una carpeta con c++ pero que sea multiplataforma? O al menos que funcione tanto en linux como en windows. Solo quiero que el programa me muestre los nombres de los archivos que contiene una carpeta uno abajo del otro. Supongo que debería haber una función estándar para esto, pero no recuerdo ni encuentro cuál era.</p>

<p>Imagino que sería algo así</p>

<pre class="prettyprint">

include <iostream>

// otras librerias

int main() { // declaraciones archivos = traerArchivos( "/mi/directorio/personal" ); for( int x =0; x<cantidadDeArchivos; x++) { cout << archivos[x] << endl; } return 0; }</pre>

<p>Desde ya gracias!</p>

c++
Respuesta de Laura
hace 10 años

<p>Podrías utilizar el conjunto de librerías Boost (www.boost.org) que son multiplataforma, y van camino a ser incluídas como parte del estándar en próximas versiones de C++.</p>

<p>Una de las librerías de Boost es Filesystem. Con esta librería podés listar los archivos de un directorio, además de manipularlos, entre otras muchas posibilidades. Publiqué <a href="http://www.comunidadq.com/articulos/ver/3/administrar-el-sistema-de-archivos-con-c-y-boost">un artículo</a> relacionado hace un tiempo.</p>

<p>Te dejo un código de ejemplo</p>

<pre class="prettyprint">

include <iostream>

include <boost/filesystem.hpp>

using namespace boost::filesystem;

void list_directory( path my_directory ) { // Primero deberías comprobar si es un directorio válido. // Luego se recorre el directorio en busca de archivos. directory_iterator end_it; for( directory_iterator it( my_directory ); it != end_it; it++ ) { if( is_regular_file( it->status() )) { std::cout << it->path().filename() << std::endl; } } }

int main() { list_directory( path( "/tu/directorio" )); return 0; }</pre>

<p>Cabe aclarar que al momento de compilar tu programa vas a tener que vincular boost_system y boost_filesystem.</p>

<p>Ejemplo utilizando G++</p>

<pre class="prettyprint"> g++ programa.cpp -o programa -lboost_system -lboost_filesystem</pre>

<p> </p>

Respuesta de Lucas
hace 10 años

<p>Hay una función estándar llamada system(). Esa función ejecuta un programa del sistema operativo (conocido como comando). En gnu linux podés usar el comando ls el cual tiene la sintaxis básica : ls [directorio a listar].</p>

<p> </p>

<p>Por ejemplo:</p>

<pre class="prettyprint"> <código>

system("ls /usr/share");

<y más código></pre>

<p>Para que sea multiplataforma podrías usar compilación condicional manejando el preprocesador, o bien, usando un archivo en donde esté mencionado qué sistema operativo es y entonces en base a lo que tiene poder ejecutar tal o cual fragmento de código.</p>

<p>Ls sólo en gnu linux (y toda familia unix), pero en windows la verdad que no sé.</p>

<p>Esa es la forma más básica, aunque por lo que veo, la biblioteca del primer comentario es más profesional :) saludos!</p>

Respuesta de Gaspar Fernandez
hace 8 años

<p>Hola,</p><p>Si estás en un sistema nix, y no quieres utilizar boost (la respuesta de arriba con boost me gusta, pero no siempre lo tenemos a nuestra disposición), puedes utilizar dirent. Te pongo un ejemplo en C, aunque compilaría desde C++ e incluso podrías utilizar cout en lugar de printf.</p><p>También tienes más información en <a href="http://totaki.com/poesiabinaria/2011/09/listar-archivos-dentro-de-un-directorio-o-carpeta-en-c/" rel="nofollow">esta web.</a></p><p><br /></p><pre><span class="co2" style="font-style:italic;">#include <stdlib.h></span><br /><span class="co2" style="font-style:italic;">#include <stdio.h></span><br /><span class="co2" style="font-style:italic;">#include <sys/types.h></span><br /><span class="co2" style="font-style:italic;">#include <dirent.h></span><br /><br /><span class="coMULTI" style="font-style:italic;">/ Función para devolver un error en caso de que ocurra /</span><br /><span class="kw4">void</span><span> error</span><span class="br0">(</span><span class="kw4">const</span><span> </span><span class="kw4">char</span><span> </span><span class="sy0"></span><span>s</span><span class="br0">)</span><span class="sy0">;</span><br /><span class="coMULTI" style="font-style:italic;">/ Función que hace algo con un archivo /</span><br /><span class="kw4">void</span><span> procesoArchivo</span><span class="br0">(</span><span class="kw4">char</span><span> </span><span class="sy0"></span><span>archivo</span><span class="br0">)</span><span class="sy0">;</span><br /><br /><span class="kw4">int</span><span> main</span><span class="br0">(</span><span class="br0">)</span><br /><span class="br0">{</span><br /><span>  </span><span class="coMULTI" style="font-style:italic;">/ Con un puntero a DIR abriremos el directorio /</span><br /><span>  DIR </span><span class="sy0"></span><span>dir</span><span class="sy0">;</span><br /><span>  </span><span class="coMULTI" style="font-style:italic;">/ en ent habrá información sobre el archivo que se está "sacando" a cada momento /</span><br /><span>  </span><span class="kw4">struct</span><span> dirent </span><span class="sy0"></span><span>ent</span><span class="sy0">;</span><br /><br /><span>  </span><span class="coMULTI" style="font-style:italic;">/ Empezaremos a leer en el directorio actual /</span><br /><span>  dir </span><span class="sy0">=</span><span> opendir </span><span class="br0">(</span><span class="st0">"."</span><span class="br0">)</span><span class="sy0">;</span><br /><br /><span>  </span><span class="coMULTI" style="font-style:italic;">/ Miramos que no haya error /</span><br /><span>  </span><span class="kw1">if</span><span> </span><span class="br0">(</span><span>dir </span><span class="sy0">==</span><span> NULL</span><span class="br0">)</span><span> </span><br /><span>    error</span><span class="br0">(</span><span class="st0">"No puedo abrir el directorio"</span><span class="br0">)</span><span class="sy0">;</span><br /><span>  </span><br /><span>  </span><span class="coMULTI" style="font-style:italic;">/ Una vez nos aseguramos de que no hay error, ¡vamos a jugar! /</span><br /><span>  </span><span class="coMULTI" style="font-style:italic;">/ Leyendo uno a uno todos los archivos que hay /</span><br /><span>  </span><span class="kw1">while</span><span> </span><span class="br0">(</span><span class="br0">(</span><span>ent </span><span class="sy0">=</span><span> readdir </span><span class="br0">(</span><span>dir</span><span class="br0">)</span><span class="br0">)</span><span> </span><span class="sy0">!=</span><span> NULL</span><span class="br0">)</span><span> </span><br /><span>    </span><span class="br0">{</span><br /><span>      </span><span class="coMULTI" style="font-style:italic;">/ Nos devolverá el directorio actual (.) y el anterior (..), como hace ls /</span><br /><span>      </span><span class="kw1">if</span><span> </span><span class="br0">(</span><span> </span><span class="br0">(</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/strcmp.html" rel="nofollow"><span class="kw3">strcmp</span></a><span class="br0">(</span><span>ent</span><span class="sy0">-></span><span>d_name</span><span class="sy0">,</span><span> </span><span class="st0">"."</span><span class="br0">)</span><span class="sy0">!=</span><span class="nu0">0</span><span class="br0">)</span><span> </span><span class="sy0">&&</span><span> </span><span class="br0">(</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/strcmp.html" rel="nofollow"><span class="kw3">strcmp</span></a><span class="br0">(</span><span>ent</span><span class="sy0">-></span><span>d_name</span><span class="sy0">,</span><span> </span><span class="st0">".."</span><span class="br0">)</span><span class="sy0">!=</span><span class="nu0">0</span><span class="br0">)</span><span> </span><span class="br0">)</span><br /><span>    </span><span class="br0">{</span><br /><span>      </span><span class="coMULTI" style="font-style:italic;">/ Una vez tenemos el archivo, lo pasamos a una función para procesarlo. /</span><br /><span>      procesoArchivo</span><span class="br0">(</span><span>ent</span><span class="sy0">-></span><span>d_name</span><span class="br0">)</span><span class="sy0">;</span><br /><span>    </span><span class="br0">}</span><br /><span>    </span><span class="br0">}</span><br /><span>  closedir </span><span class="br0">(</span><span>dir</span><span class="br0">)</span><span class="sy0">;</span><br /><br /><span>  </span><span class="kw1">return</span><span> EXIT_SUCCESS</span><span class="sy0">;</span><br /><span class="br0">}</span><span> </span><br /><br /><span class="kw4">void</span><span> error</span><span class="br0">(</span><span class="kw4">const</span><span> </span><span class="kw4">char</span><span> </span><span class="sy0"></span><span>s</span><span class="br0">)</span><br /><span class="br0">{</span><br /><span>  </span><span class="coMULTI" style="font-style:italic;">/ perror() devuelve la cadena S y el error (en cadena de caracteres) que tenga errno /</span><br /><span>  </span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/perror.html" rel="nofollow"><span class="kw3">perror</span></a><span> </span><span class="br0">(</span><span>s</span><span class="br0">)</span><span class="sy0">;</span><br /><span>  </span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/exit.html" rel="nofollow"><span class="kw3">exit</span></a><span class="br0">(</span><span>EXIT_FAILURE</span><span class="br0">)</span><span class="sy0">;</span><br /><span class="br0">}</span><br /><br /><span class="kw4">void</span><span> procesoArchivo</span><span class="br0">(</span><span class="kw4">char</span><span> </span><span class="sy0"></span><span>archivo</span><span class="br0">)</span><br /><span class="br0">{</span><br /><span>  </span><span class="coMULTI" style="font-style:italic;">/ Para "procesar", o al menos, hacer algo con el archivo, vamos a decir su tamaño en bytes /</span><br /><span>  </span><span class="coMULTI" style="font-style:italic;">/ para ello haremos lo que vemos aquí: http://totaki.com/poesiabinaria/2010/04/tamano-de-un-fichero-en-c/ /</span><br /><span>  FILE </span><span class="sy0"></span><span>fich</span><span class="sy0">;</span><br /><span>  </span><span class="kw4">long</span><span> ftam</span><span class="sy0">;</span><br /><br /><span>  fich</span><span class="sy0">=</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/fopen.html" rel="nofollow"><span class="kw3">fopen</span></a><span class="br0">(</span><span>archivo</span><span class="sy0">,</span><span> </span><span class="st0">"r"</span><span class="br0">)</span><span class="sy0">;</span><br /><span>  </span><span class="kw1">if</span><span> </span><span class="br0">(</span><span>fich</span><span class="br0">)</span><br /><span>    </span><span class="br0">{</span><br /><span>      </span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/fseek.html" rel="nofollow"><span class="kw3">fseek</span></a><span class="br0">(</span><span>fich</span><span class="sy0">,</span><span> </span><span class="nu0">0L</span><span class="sy0">,</span><span> SEEK_END</span><span class="br0">)</span><span class="sy0">;</span><br /><span>      ftam</span><span class="sy0">=</span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/ftell.html" rel="nofollow"><span class="kw3">ftell</span></a><span class="br0">(</span><span>fich</span><span class="br0">)</span><span class="sy0">;</span><br /><span>      </span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/fclose.html" rel="nofollow"><span class="kw3">fclose</span></a><span class="br0">(</span><span>fich</span><span class="br0">)</span><span class="sy0">;</span><br /><span>      </span><span class="coMULTI" style="font-style:italic;">/ Si todo va bien, decimos el tamaño /</span><br /><span>      </span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html" rel="nofollow"><span class="kw3">printf</span></a><span> </span><span class="br0">(</span><span class="st0">"%30s (%ld bytes)<span class="es1">\n</span>"</span><span class="sy0">,</span><span> archivo</span><span class="sy0">,</span><span> ftam</span><span class="br0">)</span><span class="sy0">;</span><br /><span>    </span><span class="br0">}</span><br /><span>  </span><span class="kw1">else</span><br /><span>    </span><span class="coMULTI" style="font-style:italic;">/ Si ha pasado algo, sólo decimos el nombre */</span><br /><span>    </span><a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html" rel="nofollow"><span class="kw3">printf</span></a><span> </span><span class="br0">(</span><span class="st0">"%30s (No info.)<span class="es1">\n</span>"</span><span class="sy0">,</span><span> archivo</span><span class="br0">)</span><span class="sy0">;</span></pre>