[C con Clase] Consulta de C++
Salvador Pozo
salvapozo en gmail.com
Jue Abr 14 12:50:51 CEST 2016
Hola:
En principio, el programa funciona bastante bien. Sólo he encontrado un error, en la función ObtenerLargoCodigo. Se producía un error si no se encontraba la subcadena "__". He añadido una línea para detectar este caso:
--8<----
int ObtenerLargoCodigo(char* nombreArchivo)
{
char ncliente[MAX_PATH],*ptr;
int i,pos=0,retval=0;
memset(ncliente,'\0',sizeof(ncliente));
ptr = strstr(nombreArchivo, "__");
if(!ptr) return retval; /* Retornar si el nombre de fichero no se ajusta
al patrón nnnnnnnn__aaaaaaa.bbb */
pos=((int)ptr)-(int)nombreArchivo;
strncpy(ncliente,nombreArchivo,pos);
for(i=0;i<strlen(ncliente);i++){
if(isdigit(ncliente[i])==1)
retval++;
else
break;
}
return retval;
}
--8<----
Faltaría mover los ficheros con error a otra carpeta.
Para eso hay que añadir otras modificaciones, que aunque sencillas, incumben a varios puntos del programa.
Pego aquí una versión corregida:
--8<----
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>
#include <string.h>
#include <dirent.h>
//---------------------------------------------------------------------------
#define ERROR_SUCCESS 0
void error(const char *s);
int ObtenerLargoCodigo(char* nombreArchivo);
int ObtenerNombreDirectorio(char* nombreArchivo,char* nombreDirectorio);
int CrearDirectorio(char* nombreDirectorio,char* ruta);
int MoverArchivos(char* rutaOrigen,char* rutaDestino, char* rutaErrores);
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
//Cambiar las rutas por las deseadas
char rutaOrigen[]={".\\Origen"};
char rutaDestino[]={".\\Destino"};
char rutaErrores[]={".\\Errores"}; // Carpeta de errores
printf("Directorio raiz de origen: %s\n",rutaOrigen);
printf("Directorio raiz de destino: %s\n",rutaDestino);
if(MoverArchivos(rutaOrigen,rutaDestino,rutaErrores)!=EXIT_SUCCESS)
printf("Asegurese de que la ruta del directorio es correcta\n");
system("PAUSE");
return 0;
}
//---------------------------------------------------------------------------
// Modificar MoverArchivos para añadir el tercer parámetro, para mover ficheros con errores
int MoverArchivos(char* rutaOrigen,char* rutaDestino, char* rutaErrores)
{
DIR *dirOrigen,*dirDestino,*dirErrores; // Añadir variable
struct dirent *ent;
int retval,nleidos=0,nmovidos=0,ncodigoincorrecto=0,nDirCreados=0;
int ret;
char auxRutaOrigen[MAX_PATH],auxRutaDestino[MAX_PATH];
char nombreDir[MAX_PATH];
printf("=====================================================\n");
dirErrores=opendir(rutaErrores); // Verificar que la carpeta de errores existe:
if(dirErrores==NULL) {
error("No puedo abrir el directorio de errores");
retval=EXIT_FAILURE;
}else{
dirOrigen=opendir(rutaOrigen);
if(dirOrigen==NULL){
error("No puedo abrir el directorio de origen");
retval=EXIT_FAILURE;
}else{
dirDestino=opendir(rutaDestino);
if(dirDestino==NULL){
error("No puedo abrir el directorio de destino");
retval=EXIT_FAILURE;
}else{
closedir(dirDestino);
while((ent=readdir(dirOrigen)) != NULL){
if((strcmp(ent->d_name,".")!=0)&&(strcmp(ent->d_name,"..")!=0)){
ret=ObtenerLargoCodigo(ent->d_name);
if(ret==8){
if(ObtenerNombreDirectorio(ent->d_name,nombreDir)==ERROR_SUCCESS){
sprintf(auxRutaOrigen,"%s\\%s",rutaOrigen,ent->d_name);
if(CrearDirectorio(nombreDir,rutaDestino)==ERROR_SUCCESS){
printf("Se ha creado el directorio \"%s\"\n",nombreDir);
nDirCreados++;
}
sprintf(auxRutaDestino,"%s\\%s\\%s",rutaDestino,nombreDir,ent->d_name);
if(rename(auxRutaOrigen,auxRutaDestino)==ERROR_SUCCESS){
printf("El archivo \"%s\" se movio al directorio \"%s\n",ent->d_name,nombreDir);
nmovidos++;
}else{
printf("Huvo algun error al mover el archivo \"%s\" al directorio \"%s\"\n",ent->d_name,nombreDir);
}
}
nleidos++;
}else{
ncodigoincorrecto++;
// Mover ficheros con errores:
sprintf(auxRutaOrigen,"%s\\%s",rutaOrigen,ent->d_name);
sprintf(auxRutaDestino,"%s\\%s",rutaErrores,ent->d_name);
if(rename(auxRutaOrigen,auxRutaDestino)==ERROR_SUCCESS){
printf("El archivo \"%s\" se movio al directorio \"%s\n",ent->d_name,nombreDir);
nmovidos++;
}else{
printf("Huvo algun error al mover el archivo \"%s\" al directorio \"%s\"\n",ent->d_name,nombreDir);
}
}
}
}
printf("=====================================================\n");
if(nleidos > 0)
printf("Se han movido %i de %i archivos\n",nmovidos,nleidos+ncodigoincorrecto);
else if(ncodigoincorrecto==0)
printf("No se han encontrado archivos\n");
if(ncodigoincorrecto > 0)
printf("Se encontraron %i archivos con codigo de cliente incorrectos\n",ncodigoincorrecto);
if(nDirCreados > 0)
printf("Se han creado %i directorios\n",nDirCreados);
else
printf("No se han creado directorios\n");
retval=EXIT_SUCCESS;
}
closedir(dirOrigen);
}
}
return retval;
}
//---------------------------------------------------------------------------
int ObtenerLargoCodigo(char* nombreArchivo)
{
char ncliente[MAX_PATH],*ptr;
int i,pos=0,retval=0;
memset(ncliente,'\0',sizeof(ncliente));
ptr = strstr(nombreArchivo, "__");
if(!ptr) return retval;
pos=((int)ptr)-(int)nombreArchivo;
strncpy(ncliente,nombreArchivo,pos);
for(i=0;i<strlen(ncliente);i++){
if(isdigit(ncliente[i])==1)
retval++;
else
break;
}
return retval;
}
//---------------------------------------------------------------------------
int CrearDirectorio(char* nombreDirectorio,char* ruta)
{
int retval;
char aux[MAX_PATH]={0};
sprintf(aux,"%s\\%s",ruta,nombreDirectorio);
retval=mkdir(aux);
return retval;
}
//---------------------------------------------------------------------------
int ObtenerNombreDirectorio(char* nombreArchivo,char* nombreDirectorio)
{
int pos=0,retval;
char *ptr;
memset(nombreDirectorio,'\0',MAX_PATH);
while( (ptr = strstr(&nombreArchivo[pos], "__")) != NULL ){
pos=((int)ptr+2)-(int)nombreArchivo;
}
if(pos >= 2)
pos-=2;
strncpy(nombreDirectorio,nombreArchivo,pos);
if(strlen(nombreDirectorio)>0)
retval=EXIT_SUCCESS;
else
retval=EXIT_FAILURE;
return retval;
}
//---------------------------------------------------------------------------
void error(const char *s)
{
/* perror() devuelve la cadena S y el error (en cadena de caracteres) que tenga errno */
perror(s);
}
//---------------------------------------------------------------------------
--8<----
Hasta pronto.
Más información sobre la lista de distribución Cconclase