MULTIMEDIA, Video digital, Grabación, Diseño gráfico, Diseño web, Programación > Webmasters - Diseño Web - Programación - Diseño gráfico

Programa para borrar un/os archivos.

<< < (2/2)

Lector:
Hellowwww.  :wink:

Qué tal el fin de semana.? :wink:

Como me has dicho, ALP, en el borland escribí "findfirst" y me fui a la ayuda, lei un poco y compile un ejemplo que daba. Este, también incluia la función findnext, y lo que el programa hacia era mostrar el contenido del directorio actual. También hablaba de las funciones "dos_findfirst" y "dos_findnext" y que para que ambas funcinen se debian incluir las librerias "stdio.h" y "dir.h".

Lo cierto es que mucho no pude hacer, espero que me den una manito con esto a ver como lo puedo ir asociando con lo anterior.

Un saludo y gracias de nuevo. :wink:

ALP:
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



--- Código: ---#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;
}
--- Fin del código ---



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)

--- Código: ---
    ret = recorre_ficheros("*.*");
    chdir(dir_actual);
    rmdir(nombre);

--- Fin del código ---



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.

Lector:
:shock:  :shock:  :shock:  :shock:

Gracias ALP, la verdad es que no pensé que fuese tan largo, ayer estuve leyendo algo de unlink(en la ayuuda del Borland), también pensando en cómo hacer para integrar lo que estaba leyendo con lo que necesito, pero no se me ocuriro nada (ahora que veo el código me doy cuenta porqué :oops:  :lol: ).

Te agradezco muchísimo y dame un día para entender lo más posible el código, es que no sólo quiero usar el programa, sino entenderlo lo mejor posible para mí.

Te agradezco de nuevo y un saludo. :wink:

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa