Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
II Semestre 2001
[<=] [home] [<>] [\/] [=>]
CI-1201 Programación II

Tarea #4 [solución]

DELTREE.exe

C:\DIR\SubDir> DELTREE.exe /?
Deletes a directory and all the subdirectories and files in it.

To Delete one or more files and directories:
DELTREE [/Y] [drive:]path [[drive:]path[...]]

  /Y            Suppresses prompting to confirm you want to delete
                the subdirectory.
  [drive:]path  Specifies the name of the directory you want to delete.

Note: Use DELTREE cautiously. Every file and subdirectory within the
specified directory will be deleted.
Figura 1

      Implemente el comando DELTREE.exe que elimina, recursivamente, un directorio. En su implementación debe usar la clase string de la biblioteca de C++. Como base para su trabajo, puede usar el programa de la Figura 2.

/* DELTREE.cpp
   Borra un directorio y todos sus subdirectorios
*/
/* Profe:
   Me hice este "deltree". Cuando lo ejecuto funciona pero al
   final me da un problema y se cierra, y en el debug me marca
   esta línea que yo no sé que es:

       #else  // WPRFLAG
           __initenv = _environ;
           mainret = main(__argc, __argv, _environ);   */

#include <iostream.h>
#include <io.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <direct.h>
#include <sys/stat.h>
#include "resource.h"

void deltree(const char *,int);


void main(int argc, char *argv[ ], char envp[ ])
{
char hp[2]={NULL};
if(argc == 2)
{
strcpy(hp,argv[1]);
if(hp[1]=='?')
//  Ayuda                 {
cout<<"Borra un directorio y sus subdirectorios.\n\n";
cout<<"ELIDIR [unidad:][ruta]  [/D]\n\n";
cout<<"[unidad:][ruta] Unidad, ruta y nombre del directorio.\n";
cout<<"[/D] Elimina el despliege en pantalla de\n" <<" los 
   archivos borrados.\n\n"; }
else
//  Borra el directorio con despliege en pantalla
{
char d;
cout << "Se borrar"<<char(160)<<"n todos los archivos del 
   directorio.\n "
<< char(168) <<" Desea continuar ? (Y/N): ";
cin >> d;
tolower(d);
if(d == 'y')    // LLamada a la función
deltree(argv[1],0);
}
}
if(argc == 3)
{
strcpy(hp,argv[2]);
if('d'==tolower(hp[1]))
//  Borra el directorio con despliege en pantalla
{
char d;
cout << "Se borrar"<<char(160)<<"n todos los archivos del 
   directorio.\n "
<< char(168) <<" Desea continuar ? (Y/N): ";
cin >> d;
tolower(d);
if(d == 'y')    // LLamada a la función
deltree(argv[1],1);
}
else
cout << "Par"<<char(160)<<"metro invalido: "<<hp[1]<<endl; }
if(argc < 2)
cout<<"Faltan par"<<char(160)<<"metros.\n";
if(argc > 3)
cout<<"Muchos par"<<char(160)<<"metros.\n";
}//  main()


void deltree(const char *dirname,int p)
//  Borra los archivos y subdirectoris dentro del directorio
{
struct _finddata_t c_file;
long hFile;
char f_dir[500]={NULL};
char dir[500]={NULL};
char arch[100]={NULL};

strcpy(dir,dirname);
int l=strlen(dir);
for(int i=l;i<(l+3);i++)
//    Agrega "*.*" y asigna "\"
// al final de una carpeta si no existe
{
if((i == l) && (dir[l-1] != '\\'))
{    dir[i]='\\'; l++; }
else
{
if(i==(l))   dir[i]='*';
if(i==(l+1)) dir[i]='.';
if(i==(l+2)) dir[i]='*';
}        }
strcpy(f_dir,dir);
/* Encuentra el primer archivo en el directorio (".") */
if( (hFile = _findfirst( f_dir, &c_file )) == -1L )
   cout << "No existe el directorio "<< dirname << endl;
else
{
/* Encuentra el segundo archivo en el directorio ("..") */
if(_findnext( hFile, &c_file ) == 0)
{
/* Encuentra los demás archivos en el directorio */
while( _findnext( hFile, &c_file ) == 0 )
{
l=strlen(dir);
//ellimina "*.*" del directorio
for(i=(l-1);i>(l-4);i--)
dir[i] = NULL;                 //limpia "arch"
for(i=0;i<100;i++)
arch[i]=NULL;
// almacena en arch el archivo
strcpy(arch,c_file.name);
l=strlen(dir);
int h=0;
// agrega el archivo al directorio
for(i=l;i<(l+strlen(arch));i++)
{
dir[i] = arch[h];
h++;
}
if((( c_file.attrib & _A_ARCH ) == 0) && (c_file.size == 0))
// Si es carpeta llama la función recursivamente // con la nueva 
   carpeta 

{
deltree(dir,p);
}
else
// Si es archivo quita el atributo "read only" si existe
// y borra el archivo
{
_chmod( dir, _S_IREAD | _S_IWRITE);
if(remove(dir) == 0)
{    if(p==0)
cout<<dir<<" borrado.\n";
}
else
cout<<"NO SE PUDO BORRAR "<<dir<<endl;
}
// limpia "dir"
for(i=0;i<500;i++)
dir[i]=NULL;                  strcpy(dir,f_dir);
}
}
_findclose( hFile );
}
// Quita el atributo "read only" si existe
// y borra el directorio original de "deltree"
_chmod( dirname, _S_IREAD | _S_IWRITE);
if(_rmdir(dirname) == 0)
{            if(p==0)
cout<<dirname<<" borrado.\n";
}
else
cout<<"NO SE PUDO BORRAR "<<dirname<<endl;

}// deltree()

// EOF: DELTREE.cpp
Figura 2

[mailto:] Kenneth Mora y Pablo Gainza

 

Tiempo de entrega: 10 Días
Modalidad: Individual

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2001
Derechos de autor reservados © 2001
[home] <> [/\]