2010-05-07 7 views

Respuesta

7

No hay una forma estándar de C++ para emular esto porque no hay una funcionalidad estándar de C++ para leer el contenido de un directorio. Lo que puede hacer es el uso Boost.Filesystem:

#include <boost/filesystem.hpp> // plus iostream,algorithm,string,iterator 
using namespace boost::filesystem; // and std 

struct pathname_of { 
    string operator()(const directory_entry& p) const { 
     return p.path().filename(); // or your creativity here 
    } 
}; 

int main(int argc, char* argv[]) 
{ 
    transform(directory_iterator("."), directory_iterator(), 
       ostream_iterator<string>(cout, "\n"), 
       pathname_of()); 
    return 0; 
} 
+2

¿Hay NINGÚN ALTO impulso que no pueda hacer?!?! – DVK

+0

@Wilhelm: Gracias. ¿Cómo compilas eso? Intenté esto pero fallí 'g ++ -I ~/.boost/include/boost-1_38 wiltell_code.cpp -o wiltell_code' – neversaint

+2

¿Qué error obtienes? Compilador, enlazador? Asegúrese de agregar el elemento faltante include: ''. Di 'std :: for_each()' o agrega una instrucción 'using'. ¿Estás en Linux o Mac? Si estás en Linux, asegúrate de enlazar con 'boost_filesystem'. Con g ++ puedes decir '-lboost_filesystem'. Si estás en una Mac, probablemente también necesites enlazar con 'boost_system'. – wilhelmtell

0

Puede imitar el "pegote" usando fnmatch. Pero deberá abrir el directorio, leer el contenido y hacer coincidir cada entrada usando fnmatch.

No hay equivalente directo que sea AFAIK estándar.

+1

¿Qué? ¿POSIX no es un estándar lo suficientemente bueno? –

-2

Me llaman la vieja escuela.

f = popen("ls file*.txt", "r"); 
+3

Lo llamo innecesario ... usa 'fork()' y 'exec()' junto con muchos otros para algo que solo debería tomar una llamada al sistema – dlamotte

+0

Sólo un comentario de nit, diana diamotte, glob() ciertamente más de una llamada al sistema Hace la asignación dinámica de la memoria dentro de la estructura pglob que usted proporciona, y tiene que leer en el directorio, por lo que hay al menos dos llamadas al sistema. Pero es solo una llamada de biblioteca, y eso es lo preferido. Y dada la solución de Wayne provocará que se genere un shell que a su vez llamará glob() o similar, está claro que la solución glob() es estrictamente mejor. –

+0

Ick. Eso no es "vieja escuela", es simplemente horrible. -1. –

18

La API POSIX especifica los glob() y globfree() funciones para esto. Vea el man page. wordexp() y wordfree(), también especificado por POSIX, soporte other kinds of expansions también.

+0

Hah, no es broma ... Lo hace. ¡Gracias por publicar eso! – dlamotte

Cuestiones relacionadas