C/Visual C - Script automatizado mover ficheros

 
Vista:
sin imagen de perfil

Script automatizado mover ficheros

Publicado por angel (12 intervenciones) el 01/04/2016 11:18:43
Hola tengo que hacer un script para msdos, un bat. Que mueva ficheros de una carpeta a otra, la dinamica de uso es la siguiente:

Tenemos una carpeta origen: donde los usuarios cuelgan ficheros con esta nomenclatura, 16200001__Pepe_Martinez_Placas.pdf
16200001__Pepe_Martinez_firma.doc
16300020__Angela_Perez_graficos.xls
16300020__Angela_Perez_firma.pdf

Los primeros 8 dígitos son el numero de expediente, siempre serán los mismos para cada paciente, el resto del nombre del fichero puede variar tanto en longitud, como nombre placa... firma etc.... Creo que el problema reside aqui ya que si tuviera una longitud fija podria introducir comodines como por ejemplo:

move c:\origen\16200001???????????????????*.* c:\destino

Pero esto no funciona ya que puede tener distinta longitud el nombre del fichero.

Los ficheros deben copiarse a la carpeta destino que sera, en función del fichero introducido en la carpeta origen,

16200001__Pepe_Martinez
16300020__Angela_Perez

Si alguien tiene alguna sugerencia, me hace falta para el trabajo.
gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Script automatizado mover ficheros

Publicado por aguml (272 intervenciones) el 01/04/2016 11:58:44
1. ¿Tiene que ser en batch? ¿no vale c?
La forma de obtener el nombre que yo usaría, al haber guiones bajos y extensión, seria buscar el último guión se ese nombre y obtendría el nombre de la persona y el código sin mucho problema para poder crear el directorio con el nombre y código de la persona.
2. Para buscar archivos con un código si que sirve el comodín aunque sea de largo variable, para eso está el asterisco. Quita todos los interrogantes y deja solo el asterisco y veras.
3. Puedes usar funciones de string.h pero te aconsejo que cambies el guión bajo de después del código y de después del nombre por otro símbolo, por ejemplo un guión normal y así podrías usar por ejemplo strtok para dividir el nombre de archivo en sus partes de forma sencilla.
Da más detalles para poder ayudarte mejor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Script automatizado mover ficheros

Publicado por angel (12 intervenciones) el 01/04/2016 13:27:59
en principio había dicho un bat, pero puede ser cualquier formato, exe, cmd, c.. La nomenclatura de los ficheros no puedo cambiarla es fija, es un requisito que tengan el código de 8 digitos y los guiones bajos 00000000__Nombre_Persona_comentario

Probare cambiar ? por *, la verdad que soy administrador de sistemas y en programación no tengo conocimientos para utilizar librerias y demás por ello quería hacerlo desde msdos con un bat. Cualquier idea que me puedas aportar sera bien recibida ;)

Gracias por contestar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Script automatizado mover ficheros

Publicado por aguml (272 intervenciones) el 02/04/2016 01:07:09
La nomenclatura es un problema ya que para crear un directorio con el código y el nombre de la persona no sería difícil si el nombre de la persona tuviese siempre dos partes, por ejemplo "Maria_Perez" pero si fuese "Jose_Maria_Perez" ya tenemos más guiones y no funcionaria el contar los guiones para obtener el nombre del directorio. ¿Tampoco pueden ir dos guiones bajos antes del comentario? O sea "12345678__Pedro_Perez__Firma". Es que si no es asi tendría que ser que los comentarios sean siempre los mismos para poder buscarlos en los nombres de archivo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Script automatizado mover ficheros

Publicado por agustin (272 intervenciones) el 02/04/2016 06:05:52
Esto seria C usando dos guiones bajos despues del nombre de la persona:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
#include <string.h>
#include <dirent.h>
//---------------------------------------------------------------------------
 
void error(const char *s);
int ObtenerNombreDirectorio(char* codigo,char*ruta,char* nombreDirectorio);
int CrearDirectorio(char* nombreDirectorio,char* ruta);
int MoverArchivos(char* rutaOrigen,char* rutaDestino,char* codigo);
//---------------------------------------------------------------------------
 
int main(int argc, char* argv[])
{
   char ncliente[50],nombreDir[MAXPATH],ruta[MAXPATH];
   char rutaDestino[MAXPATH];
   do{
      printf("Introduce el codigo de cliente: ");
      scanf("%s",ncliente);
      if(strlen(ncliente) != 8)
         printf("Codigo de cliente erroneo.\n");
      else
         break;
   }while(1);
   printf("Introduce la ruta del directorio: ");
   getchar();
   fgets(ruta,MAXPATH,stdin);
   ruta[strlen(ruta)-1]='\0';
 
   if(ObtenerNombreDirectorio(ncliente,ruta,nombreDir)==ERROR_SUCCESS){
      strcpy(rutaDestino,ruta);
      strcat(rutaDestino,"\\");
      strcat(rutaDestino,nombreDir);
      if(CrearDirectorio(nombreDir,ruta)==ERROR_SUCCESS){
         MoverArchivos(ruta,rutaDestino,ncliente);
      }else{
         if(errno==EACCES){
            printf("El directorio ya existe y se ha usado el mismo\n");
            MoverArchivos(ruta,rutaDestino,ncliente);
         }else{
            error("No se pudo crear el directorio");
         }
      }
   }
   system("PAUSE");
   return 0;
}
//---------------------------------------------------------------------------
 
int MoverArchivos(char* rutaOrigen,char* rutaDestino,char* codigo)
{
   struct ffblk p;
   int retval;
   char auxRutaOrigen[MAXPATH]={0},auxRutaDestino[MAXPATH];
 
   strcpy(auxRutaOrigen,rutaOrigen);
   strcat(auxRutaOrigen,"\\");
   strcat(auxRutaOrigen,codigo);
   strcat(auxRutaOrigen,"*.*");
   if(findfirst(auxRutaOrigen, &p, FA_ARCH)==0){
      strcpy(auxRutaOrigen,rutaOrigen);
      strcat(auxRutaOrigen,"\\");
      strcat(auxRutaOrigen,p.ff_name);
      strcpy(auxRutaDestino,rutaDestino);
      strcat(auxRutaDestino,"\\");
      strcat(auxRutaDestino,p.ff_name);
      MoveFile(auxRutaOrigen,auxRutaDestino);
      while(!findnext(&p)){
         strcpy(auxRutaOrigen,rutaOrigen);
         strcat(auxRutaOrigen,"\\");
         strcat(auxRutaOrigen,p.ff_name);
         strcpy(auxRutaDestino,rutaDestino);
         strcat(auxRutaDestino,"\\");
         strcat(auxRutaDestino,p.ff_name);
         MoveFile(auxRutaOrigen,auxRutaDestino);
      }
      retval=EXIT_SUCCESS;
      if(findclose(&p)!=0){
         error("No puedo cerrar el directorio");
         retval=EXIT_FAILURE;
      }
   }else{
      error("No puedo abrir el directorio");
      retval=EXIT_FAILURE;
   }
   return retval;
}
//---------------------------------------------------------------------------
 
int CrearDirectorio(char* nombreDirectorio,char* ruta)
{
   int retval;
   char aux[MAXPATH];
 
   strcpy(aux,ruta);
   strcat(aux,"\\");
   strcat(aux,nombreDirectorio);
   if(mkdir(aux)==0)
      retval=EXIT_SUCCESS;
   else
      retval=EXIT_FAILURE;
 
   return retval;
}
//---------------------------------------------------------------------------
 
int ObtenerNombreDirectorio(char* codigo,char*ruta,char* nombreDirectorio)
{
   struct ffblk p;
   int pos=0,retval;
   char *ptr,aux[MAXPATH];
 
   memset(nombreDirectorio,'\0',MAXPATH);
   strcpy(aux,ruta);
   strcat(aux,"\\");
   strcat(aux,codigo);
   strcat(aux,"*.*");
 
   if(findfirst(aux, &p, FA_ARCH)==0){
      while( (ptr = strstr(&p.ff_name[pos], "__")) != NULL ){
         pos=((int)ptr+2)-(int)p.ff_name;
      }
      if(pos >= 2)
         pos-=2;
      strncpy(nombreDirectorio,p.ff_name,pos);
      retval=EXIT_SUCCESS;
      if(findclose(&p)!=0){
         error("No puedo cerrar el directorio");
         retval=EXIT_FAILURE;
      }
   }else{
      error("No se encuentran archivos con ese codigo o no se puede abrir el directorio");
      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);
}
//---------------------------------------------------------------------------
Lo que hago es obtener el nombre del primer archivo para el codigo introducido y uso ese nombre para obtener el nombre del directorio. Le quito el comentario y para eso busco la ultima aparicion de los dos guiones bajos y me quedo con la subcadena anterior a esos dos guiones. Con esa subcadena creo el directorio en el mismo lugar de la ruta introducida y meto dentro todos los archivos que contengan ese codigo al inicio de su nombre. Si el directorio ya existe lo uso y si no lo creo. Parece complejo pero no lo es para nada. Si quieres cambiar algo o explicar alguna cosa por aqui andaré.
PD:Esto va para los administradores, las etiquetas code de este foro no se llevan nada bien con "\\" de C. ¿Podeis solucionarlo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Script automatizado mover ficheros

Publicado por angel (12 intervenciones) el 02/04/2016 09:39:55
Hola Agustin al compilar el programa con DevC++ me aparecen muchos errores de compilación y no me permite probarlo si funciona correctamente. Gracias por contestar a todos es muy de agradecer
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Script automatizado mover ficheros

Publicado por aguml (272 intervenciones) el 02/04/2016 11:42:32
Debería funcionar ya que aunque dir.h tengo entendido que no es ansi esta en todas partes. Pon los errores que te da y si es por eso luego te pongo otra solución más estándar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Script automatizado mover ficheros

Publicado por angel (12 intervenciones) el 02/04/2016 11:49:23
Aquí tienes el resumen de errores

Compiling single file...
--------
- Filename: C:\Users\Ángel\Desktop\SinNombre2.cpp
- Compiler Name: TDM-GCC 4.9.2 64-bit Release

Processing C++ source file...
--------
- C++ Compiler: C:\Program Files (x86)\Dev-Cpp\MinGW64\bin\g++.exe
- Command: g++.exe "C:\Users\Ángel\Desktop\SinNombre2.cpp" -o "C:\Users\Ángel\Desktop\SinNombre2.exe" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc
C:\Users\Ángel\Desktop\SinNombre2.cpp: In function 'int main(int, char**)':
C:\Users\Ángel\Desktop\SinNombre2.cpp:17:32: error: 'MAXPATH' was not declared in this scope
char ncliente[50],nombreDir[MAXPATH],ruta[MAXPATH];
^

C:\Users\Ángel\Desktop\SinNombre2.cpp:29:10: error: 'ruta' was not declared in this scope
fgets(ruta,MAXPATH,stdin);
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:32:45: error: 'nombreDir' was not declared in this scope
if(ObtenerNombreDirectorio(ncliente,ruta,nombreDir)==ERROR_SUCCESS){
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:32:57: error: 'ERROR_SUCCESS' was not declared in this scope
if(ObtenerNombreDirectorio(ncliente,ruta,nombreDir)==ERROR_SUCCESS){
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:33:14: error: 'rutaDestino' was not declared in this scope
strcpy(rutaDestino,ruta);
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:39:20: error: 'EACCES' was not declared in this scope
if(errno==EACCES){
^
C:\Users\Ángel\Desktop\SinNombre2.cpp: In function 'int MoverArchivos(char*, char*, char*)':
C:\Users\Ángel\Desktop\SinNombre2.cpp:54:17: error: aggregate 'MoverArchivos(char*, char*, char*)::ffblk p' has incomplete type and cannot be defined
struct ffblk p;
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:56:23: error: 'MAXPATH' was not declared in this scope
char auxRutaOrigen[MAXPATH]={0},auxRutaDestino[MAXPATH];
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:58:11: error: 'auxRutaOrigen' was not declared in this scope
strcpy(auxRutaOrigen,rutaOrigen);
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:62:36: error: 'FA_ARCH' was not declared in this scope
if(findfirst(auxRutaOrigen, &p, FA_ARCH)==0){
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:62:43: error: 'findfirst' was not declared in this scope
if(findfirst(auxRutaOrigen, &p, FA_ARCH)==0){
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:66:14: error: 'auxRutaDestino' was not declared in this scope
strcpy(auxRutaDestino,rutaDestino);
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:69:44: error: 'MoveFile' was not declared in this scope
MoveFile(auxRutaOrigen,auxRutaDestino);
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:70:25: error: 'findnext' was not declared in this scope
while(!findnext(&p)){
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:80:22: error: 'findclose' was not declared in this scope
if(findclose(&p)!=0){
^
C:\Users\Ángel\Desktop\SinNombre2.cpp: In function 'int CrearDirectorio(char*, char*)':
C:\Users\Ángel\Desktop\SinNombre2.cpp:95:13: error: 'MAXPATH' was not declared in this scope
char aux[MAXPATH];
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:97:11: error: 'aux' was not declared in this scope
strcpy(aux,ruta);
^
C:\Users\Ángel\Desktop\SinNombre2.cpp: In function 'int ObtenerNombreDirectorio(char*, char*, char*)':
C:\Users\Ángel\Desktop\SinNombre2.cpp:111:17: error: aggregate 'ObtenerNombreDirectorio(char*, char*, char*)::ffblk p' has incomplete type and cannot be defined
struct ffblk p;
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:113:18: error: 'MAXPATH' was not declared in this scope
char *ptr,aux[MAXPATH];
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:116:11: error: 'aux' was not declared in this scope
strcpy(aux,ruta);
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:121:26: error: 'FA_ARCH' was not declared in this scope
if(findfirst(aux, &p, FA_ARCH)==0){
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:121:33: error: 'findfirst' was not declared in this scope
if(findfirst(aux, &p, FA_ARCH)==0){
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:123:20: error: cast from 'char*' to 'int' loses precision [-fpermissive]
pos=((int)ptr+2)-(int)p.ff_name;
^
C:\Users\Ángel\Desktop\SinNombre2.cpp:129:22: error: 'findclose' was not declared in this scope
if(findclose(&p)!=0){
^


Compilation results...
--------
- Errors: 24
- Warnings: 0
- Compilation Time: 0,25s
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Script automatizado mover ficheros

Publicado por Angel (12 intervenciones) el 02/04/2016 09:30:10
Hola aguml en principio no creo que me pongan problema por la nomenclatura que me comentas "12345678__Pedro_Perez__Firma" esta si que estaría permitida.

En principio el procedimiento es el siguiente:

Se recibe un documento (pdf, docx, xlsx) vía email o scaneado, siempre se deberá guardar de la misma manera y con las siguientes condiciones:
- Se guardarán siempre en la misma carpeta (en una carpeta común para todo el mundo)

- Se guardarán poniendo como número de historia (8 digitos)

El proceso debería recoger el documento y trasladarlo a un carpeta que tenga el número de historia:

Por ejemplo si en la carpeta c:\Origen, se encuentra el fichero "12345678__Pedro_Perez__Firma.pdf" deberia moverlo a la carpeta c:\Destino\12345678__Pedro_Perez

Gracias por el interés mostrado!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Script automatizado mover ficheros

Publicado por aguml (272 intervenciones) el 02/04/2016 11:46:42
Cuando lo ejecutes ¿tu introduces un código deseado? ¿o tiene que mover cada archivo que encuentre a su respectiva carpeta sin preguntar nada?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Script automatizado mover ficheros

Publicado por angel (12 intervenciones) el 02/04/2016 11:48:47
Debe mover el archivos encontrado en la ruta, a su respectiva carpeta sin preguntar nada. Tiene que ser lo mas transparente posible para el usuario
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Script automatizado mover ficheros

Publicado por agustin (272 intervenciones) el 02/04/2016 14:34:58
No uses dev-c++ porque esta desactualizado y ya no tiene soporte. Cambiate por ejemplo a codeblocks que si que esta actualizado. Luego instalo yo codeblocks para hacer las modificaciones necesarias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Script automatizado mover ficheros

Publicado por agustin (272 intervenciones) el 02/04/2016 21:16:43
Aqui tienes un codigo mas estandar que a mi me funciona tanto en C++Builder como en CodeBlock asi que no creo que tengas mas problemas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//---------------------------------------------------------------------------
#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);
}
//---------------------------------------------------------------------------
Ahora el codigo recorre todos los archivos del directorio de origen y los pone ordenados en sus respectivas carpetas en el de destino creando sus respectivas carpetas. Los codigos de cliente tienen que tener 8 digitos y si no es asi te avisará y se saltará el archivo.
Indica si se movio el archivo o falló y al final hace un pequeño resumen de todo lo que pasó.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Script automatizado mover ficheros

Publicado por angel (12 intervenciones) el 05/04/2016 15:33:28
Buenas tardes agustin, he conseguido compilar tu código y creo que se adaptara perfectamente a lo que necesito ya te contare.... me gustaría agradecerte tu colaboración y ayuda... eres un crack! Muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Script automatizado mover ficheros

Publicado por angel (12 intervenciones) el 11/04/2016 22:47:54
Buenas noches agustin! tras probar el programa en producción unos dias me requieren una serie de cambios

no seria necesario que el programa cree el directorio si no existe, estos directorios ya estarán creados con la siguiente nomenclatura

12345678__Pepito_Grillo_Martinez
87654321__Pepe_Pérez_Garcia

Los ficheros, los dejaran como dije en una carpeta c:\Origen y estos ficheros si existe la carpeta serán movidos a dicha carpeta. Contemplando el fallo humano, ya que lo renombraran los ficheros a mano y se pueden equivocar podrian tener la siguiente estructura

12345678__albarán con espacios en blanco

12345678_Documentos prueba

12345678__compra material

12345678_ presupuesto

12345678__ presupuesto

1234567__presupuesto

123456789__presupuesto

El programa antiguo comprobaba el nombre delimitado por "__", ahora creo que simplemente comprobando los 8 primeros digitos del fichero, si son iguales que los 8 primeros digitos de la carpeta que los mueva. Aunque existan acentos, espacios o tan solo "_" otro requerimiento es que si se encuentra algun fichero que no cumple con la nomenclatura de los 8 digitos, por ejemplo que tenga 7 o incluso mas de 8 que mueva esos ficheros a una carpeta errores, para una revisión manual de la nomenclatura por un empleado.

Por ejemplo el fichero "12345678_presupuestoI" y "12345678__Presupuesto II" se compararia con las carpetas ya creadas compararia el codigo del fichero, con el codigo de la carpeta "12345678__Pepito_Grillo_Martinez" y lo moveria. En caso de no existir el codigo del fichero o bien... no tener la longitud adecuada menos o mas de 8 digitos, seria movido a la carpeta errores.

No se si se puede hacer tal y como lo planteo ahora, son cuestiones que han ido saliendo... Muchas gracias por tu ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar