2009-08-13 22 views
16

¿Hay un liso forma de glob en C o C++ en Windows?Globo en C++/C, en Windows

P. ej., Myprogram.exe * .txt envía a mi programa una lista ARGV que tiene ... ARGV [1] = *.txt en él.

Me gustaría poder tener una función (llamémoslo readglob) que toma una cadena y devuelve un vector de cadenas, cada una con un nombre de archivo.

De esta manera, si tengo los archivos a.txt b.txt c.txt en mi directorio y readglob obtiene un argumento *.txt, devuelve la lista de archivos anterior.

//Prototype of this hypothetical function. 
vector<string> readglob(string); 

¿Existe tal cosa?

Respuesta

23

Enlace con setargv.obj (o wsetargv.obj) y argv [] se globbed para usted similar a cómo los comandos Unix hacen:

no puedo dar fe por bien que lo hace, sin embargo.

+0

Terriblemente no multiplataforma, pero es fácil y solo funciona. –

+4

No tiene que ser multiplataforma porque solo Win32 tiene este problema. Gran consejo. –

+2

Acabo de probarlo yo mismo. Funciona como un campeón. No podría ser más fácil. –

0

Ehw. Tuve que implementar algo como esto en ANSI C hace unos 15 años. Comience con las rutinas opendir/readdir de ANSI, supongo. Los Globs no son exactamente RegEx, por lo que tendrás que implementar tu propio filtro.

+0

Según http://stackoverflow.com/questions/883594/microsoft-visual-studio-opendir-and-readdir-how opendir/readir no están en Visual Studio. –

+0

¡Drat! esos deben ser POSIX, no ANSI. ¿Qué pasó con la capa Win NT POSIX? – Roboprog

2

se hablaba de tenerlo en Boost :: filesystem pero se eliminó a favor de usar el boost :: regex.

para Win32 específico (MFC), puede utilizar la clase CFileFind

+0

Eso es un fastidio. Hacer una prueba rápida usando cl & #including afx.h da como resultado un error de enlace relacionado con el nuevo. +1 para el enlace, pero no quiero comer toda la noche trabajando para que MFC funcione para mí. –

+0

Parece que para cosas que no son de MFC, puede utilizar FindFirstFile y sus amigos para hacerlo con código win32 directo. –

+0

MFC es en su mayoría envoltorios de llamadas win32, no recuerdo el FindFirstFile(), todo vuelve a mí ahora. –

1

Puede haber una manera mejor ahora, pero la última vez que tuvo que hacer frente a este problema que terminé incluyendo Henry Spencer's regex library enlazado estáticamente en mi programa (su la biblioteca está licenciada por BSD), y luego hice una clase contenedora que convertía las expresiones globales del usuario en expresiones regulares para alimentar al código regex. Puede ver/tomar la clase contenedora here si lo desea.

Una vez que tenga esas partes en su lugar, lo último que debe hacer es leer el directorio y pasar cada nombre de entrada a la función de coincidencia para ver si coincide con la expresión o no. Los nombres de archivo que coinciden, lo agregas a tu vector; los que no descartas Leer el directorio es bastante fácil de usar usando las funciones DOS _findfirst() y _findnext(), pero si quieres una interfaz C++ más agradable tengo una clase portable wrapper para eso también ...

3

Esto es muy específico de Windows. No sé cómo escribirías esto para ser multiplataforma. Pero lo he usado en programas de Windows y funciona bien para mí.

// Change to the specified working directory 
string path; 
cout << "Enter the path to report: "; 
cin >> path; 
_chdir(path.c_str()); 

// Get the file description 
string desc; 
cout << "Enter the file description: "; 
cin >> desc; 

// List the files in the directory 
intptr_t file; 
_finddata_t filedata; 
file = _findfirst(desc.c_str(),&filedata); 
if (file != -1) 
{ 
    do 
    { 
    cout << filedata.name << endl; 
    // Or put the file name in a vector here 
    } while (_findnext(file,&filedata) == 0); 
} 
else 
{ 
    cout << "No described files found" << endl; 
} 
_findclose(file); 
+0

no use etiquetas pre/code, en su lugar solo resalte el código y haga clic en el botón con 1/0's en él. Lo hará aparecer como código. –

+0

Gracias, Evan. Esa es la primera vez que pongo código en una respuesta. Obviamente ... –

+0

+1 para el código; He seleccionado la respuesta de Michael porque es mucho más simple. :-) –

Cuestiones relacionadas