Ayuda con codigo mover ficheros
Publicado por sysadmin (12 intervenciones) el 14/04/2016 09:28:05
Buenos días, hace unas semanas solicite ayuda en la web, y la verdad que me ayudaron mucho.. sobretodo "agustin" pedí ayuda para hacer un programa que mueva ficheros en C++, el programa funciona bien aunque me solicitan cambios que no se como realizar. Y aquí estoy de nuevo pidiendo ayuda, ya que es para el trabajo los cambios son los siguientes
el programa debe leer los nombres de los ficheros de la carpeta de una carpeta por ejemplo c:\Origen la estructura de los ficheros es la siguiente debe empezar por 8 digitos
"12345678__Pepe_Martinez__presupuesto.xls"
en la ruta c:\Destino existirán ya creadas las siguientes carpetas "12345678__Pepe_Martinez"
el programa debe fijarse en los 8 primeros dígitos, "12345678" y mover dichos ficheros que tengan el mismo código, pueden ser .doc, .xls, etc... y moverlos a su carpeta correspondiente " 12345678__Pepe_Martinez" para ello debe comparar solo los 8 dígitos de la carpeta y moverlos dentro si es el mismo codigo, en caso de que se produzca algun error como:
> que no se encuentre la carpeta, porque no exista
> el fichero no cumpla los requisitos, no tenga 8 digitos, sean menos o mas.... ya que hay que
contemplar el fallo humano.
Debe moverlo a otra carpeta por ejemplo c:\Errores , aquí se almaceran todos los ficheros que no cumplan. Si no existe solo debe moverlo a la carpeta c:\Errores.
Tengo el siguiente codigo, que hace algo parecido que planteo agustin, pero la verdad que no se modificarlo para adecuarlo.
//---------------------------------------------------------------------------
#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);
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
//Cambiar las rutas por las deseadas
char rutaOrigen[]={"C:\\Origen"};
char rutaDestino[]={"C:\\Destino"};
printf("Directorio raiz de origen: %s\n",rutaOrigen);
printf("Directorio raiz de destino: %s\n",rutaDestino);
if(MoverArchivos(rutaOrigen,rutaDestino)!=EXIT_SUCCESS)
printf("Asegurese de que la ruta del directorio es correcta\n");
system("PAUSE");
return 0;
}
//---------------------------------------------------------------------------
int MoverArchivos(char* rutaOrigen,char* rutaDestino)
{
DIR *dirOrigen,*dirDestino;
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");
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++;
}
}
}
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, "__");
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);
}
//---------------------------------------------------------------------------
el programa debe leer los nombres de los ficheros de la carpeta de una carpeta por ejemplo c:\Origen la estructura de los ficheros es la siguiente debe empezar por 8 digitos
"12345678__Pepe_Martinez__presupuesto.xls"
en la ruta c:\Destino existirán ya creadas las siguientes carpetas "12345678__Pepe_Martinez"
el programa debe fijarse en los 8 primeros dígitos, "12345678" y mover dichos ficheros que tengan el mismo código, pueden ser .doc, .xls, etc... y moverlos a su carpeta correspondiente " 12345678__Pepe_Martinez" para ello debe comparar solo los 8 dígitos de la carpeta y moverlos dentro si es el mismo codigo, en caso de que se produzca algun error como:
> que no se encuentre la carpeta, porque no exista
> el fichero no cumpla los requisitos, no tenga 8 digitos, sean menos o mas.... ya que hay que
contemplar el fallo humano.
Debe moverlo a otra carpeta por ejemplo c:\Errores , aquí se almaceran todos los ficheros que no cumplan. Si no existe solo debe moverlo a la carpeta c:\Errores.
Tengo el siguiente codigo, que hace algo parecido que planteo agustin, pero la verdad que no se modificarlo para adecuarlo.
//---------------------------------------------------------------------------
#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);
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
//Cambiar las rutas por las deseadas
char rutaOrigen[]={"C:\\Origen"};
char rutaDestino[]={"C:\\Destino"};
printf("Directorio raiz de origen: %s\n",rutaOrigen);
printf("Directorio raiz de destino: %s\n",rutaDestino);
if(MoverArchivos(rutaOrigen,rutaDestino)!=EXIT_SUCCESS)
printf("Asegurese de que la ruta del directorio es correcta\n");
system("PAUSE");
return 0;
}
//---------------------------------------------------------------------------
int MoverArchivos(char* rutaOrigen,char* rutaDestino)
{
DIR *dirOrigen,*dirDestino;
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");
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++;
}
}
}
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, "__");
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);
}
//---------------------------------------------------------------------------
Valora esta pregunta


0