[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