Bueno, ahí va una prueba. El programa no borra ficheros (por seguridad), simplemente imprime los nombres al revés. Si pulsas Esc durante la ejecución, el programa se detiene.
Debes pasarle como parámetros directorios y/o nombres de ficheros con o sin wildcards (*, ?). Por ejemplo:
prueba *.c *.obj c:\winnt\fonts
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
#include <dos.h>
#include <ctype.h>
#include <string.h>
#define ESCAPE 27
int recorre_ficheros(char *);
int hacemos_algo(char *);
/*-----------------------------------------------------*/
int main(int argc, char *argv[])
{
int i;
if (argc < 2) {
printf("Uso: %s <fichero/carpeta> [<fichero/carpeta>]\n", argv[0]);
return 1;
}
/* procesamos todos los parámetros */
for (i = 1; i < argc; i++)
recorre_ficheros(argv[i]);
}
/*-----------------------------------------------------*/
int recorre_ficheros(char *nombre)
{
int error;
int ret = 0;
struct ffblk fb;
char dir_actual[128]={0};
getcwd(dir_actual, 128);
printf("\n\nDirectorio actual: %s --> %s\n", dir_actual, nombre);
/*
esta primera prueba la hacemos, ya que no tenemos por qué estar
situados en el directorio "padre"
*/
if (chdir(nombre) == 0) {
ret = recorre_ficheros("*.*");
chdir(dir_actual);
return ret;
}
error = findfirst(nombre, &fb, FA_ARCH|FA_DIREC);
if (error) {
printf("No encuentro el fichero %s", nombre);
return 1;
}
do {
/* no tratamos los directorios "." y ".." */
if (fb.ff_name[0] == '.')
continue;
/* si es un directorio, entramos en él y lo recorremos */
if ( fb.ff_attrib & FA_DIREC ) {
/* printf("\n--> directorio [%s] -> [%s]", dir_actual, fb.ff_name); */
if ( chdir(fb.ff_name) ) {
perror("chdir: ");
continue;
}
ret = recorre_ficheros("*.*");
chdir(dir_actual);
if (ret == ESCAPE)
break;
continue;
}
/* esta es la función que realiza el tratamiento de los ficheros */
ret = hacemos_algo(fb.ff_name);
if (ret == ESCAPE)
break;
} while ( !findnext(&fb) ); /* siguiente fichero */
/* restablecemos el directorio original */
chdir(dir_actual);
return ret;
}
/*-----------------------------------------------------*/
int hacemos_algo(char *nombre)
{
int tecla;
printf("\n\t¿Procesamos fichero: %s (s/n)?", nombre);
/* esperamos a que el usuario pulse s, n, o escape */
do {
tecla = toupper(getch());
} while (tecla != 'S' && tecla != 'N' && tecla != ESCAPE);
if (tecla == 'S')
printf("\t--> \"%s\"\n", nombre, strrev(nombre));
return tecla;
}
si quieres borrar un fichero, utiliza la función unlink() o remove(). En realidad, remove es una macro que llama a unlink.
Si quieres borrar un directorio, utiliza rmdir(), pero primero, tendrás que borrar todo el contenido, y luego borrar el
directorio.Esto lo harías tras las sentencias (tienes que ponerlo en 2 sitios, al principio de recorre ficheros y en el bucle)
ret = recorre_ficheros("*.*");
chdir(dir_actual);
rmdir(nombre);
Las funciones findfirst()/findnext() no permiten nombres largos, por lo que si te topas con uno, verás su nombre en la versión corta (8+3) como si hicieras un "dir /x" en w2k. Puedes ver que el campo ff_name de la estructura ffblk tiene 13 posiciones (12 + nulo) para almacenar el nombre.
Si vas a trabajar en windows, te recomiendo que utilices las funciones que proporciona windows ya que permiten el tratamiento de nombres largos, y son algo más completas.
Lo he realizado con TurboC.
un saludo.