/* 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
|