From 50021a2ec779555dffdf5b1915f0072dfee667c4 Mon Sep 17 00:00:00 2001 From: "Valeriano A.R" Date: Mon, 10 Jun 2013 21:02:15 +0200 Subject: [PATCH] New "copy" action. Minimizes the actions to copy a directory tree. --- filenodecmp.c | 107 ++++++++++++++++++++++++++++- filenodecmp.h | 4 +- main.c | 183 ++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 242 insertions(+), 52 deletions(-) diff --git a/filenodecmp.c b/filenodecmp.c index f0d8719..1bbd543 100644 --- a/filenodecmp.c +++ b/filenodecmp.c @@ -423,7 +423,7 @@ void AccionFileNode_CheckPair( } -AccionFileNode *AccionFileNode_Build( +AccionFileNode *AccionFileNode_BuildSync( FileNode *izquierda,FileNode *derecha) { AccionFileNode *afnRaiz=AccionFileNode_CrearNormal(izquierda,derecha); @@ -437,6 +437,111 @@ AccionFileNode *AccionFileNode_Build( + + + + + +void AccionFileNode_Copy( + FileNode *fnIzq,FileNode *fnDer,AccionFileNode **afnCola) +{ + AccionFileNode *afnNew=AccionFileNode_CrearNormal(fnIzq,fnDer); + + if(!fnIzq && !fnDer){ + AccionFileNode_Destruir(afnNew); + return; + } + if(!fnIzq && fnDer){ + if(fnDer->flags&FileFlag_Directorio){ + AccionFileNode_CompareChilds(afnNew,afnCola, + AccionFileNode_DeletePair); + } + + if(fnDer->estado!=EstadoFichero_Borrado){ + afnNew->accion=AccionFileCmp_BorrarDerecha; + }else{ + afnNew->accion=AccionFileCmp_Nada; + } + (*afnCola)->sig=afnNew; + (*afnCola)=afnNew; + } + if(fnIzq && !fnDer){ + if(fnIzq->estado!=EstadoFichero_Borrado){ + if(fnIzq->flags&FileFlag_Directorio){ + afnNew->accion=AccionFileCmp_CrearDirDerecha; + (*afnCola)->sig=afnNew; + (*afnCola)=afnNew; + AccionFileNode_CompareChilds(afnNew,afnCola, + AccionFileNode_Copy); + afnNew=AccionFileNode_CrearNormal(fnIzq,fnDer); + if(abs(fnIzq->ft-fnDer->ft)<=1){ // appox. equal + afnNew->accion=AccionFileCmp_Nada; + }else{ + afnNew->accion=AccionFileCmp_FechaIzquierdaADerecha; + } + }else{ + afnNew->accion=AccionFileCmp_IzquierdaADerecha; + } + }else{ + afnNew->accion=AccionFileCmp_Nada; + } + (*afnCola)->sig=afnNew; + (*afnCola)=afnNew; + } + if(fnIzq && fnDer){ + if(fnIzq->flags&FileFlag_Directorio || + fnDer->flags&FileFlag_Directorio) + { + if(fnIzq->estado!=EstadoFichero_Borrado){ + AccionFileNode_CompareChilds(afnNew,afnCola, + AccionFileNode_Copy); + if(abs(fnIzq->ft-fnDer->ft)<=1){ // appox. equal + afnNew->accion=AccionFileCmp_Nada; + }else{ + afnNew->accion=AccionFileCmp_FechaIzquierdaADerecha; + } + }else{ + AccionFileNode_CompareChilds(afnNew,afnCola, + AccionFileNode_DeletePair); + afnNew->accion=AccionFileCmp_BorrarDerecha; + } + }else{ + if(fnIzq->estado!=EstadoFichero_Borrado){ + if(abs(fnIzq->ft-fnDer->ft)<=1){ // appox. equal + afnNew->accion=AccionFileCmp_Nada; + }else{ + afnNew->accion=AccionFileCmp_IzquierdaADerecha; + } + }else{ + if(fnDer->estado!=EstadoFichero_Borrado){ + afnNew->accion=AccionFileCmp_BorrarDerecha; + } + } + } + (*afnCola)->sig=afnNew; + (*afnCola)=afnNew; + } +} + + + + + + + +AccionFileNode *AccionFileNode_BuildCopy( + FileNode *izquierda,FileNode *derecha) +{ + AccionFileNode *afnRaiz=AccionFileNode_CrearNormal(izquierda,derecha); + AccionFileNode *afnCola=afnRaiz; + + AccionFileNode_CompareChilds(afnRaiz,&afnCola, + AccionFileNode_Copy); + + return afnRaiz; +} + + void AccionFileNode_Print(AccionFileNode *afn){ char showPath[MaxPath]; while(afn!=NULL){ diff --git a/filenodecmp.h b/filenodecmp.h index cc55c68..ee8f41e 100644 --- a/filenodecmp.h +++ b/filenodecmp.h @@ -29,8 +29,8 @@ AccionFileNode *AccionFileNode_Crear(); void AccionFileNode_Destruir(AccionFileNode *afn); AccionFileNode *AccionFileNode_CrearNormal(FileNode *fnIzq,FileNode *fnDer); -AccionFileNode *AccionFileNode_Build(FileNode *izquierda,FileNode *derecha); - +AccionFileNode *AccionFileNode_BuildSync(FileNode *izquierda,FileNode *derecha); +AccionFileNode *AccionFileNode_BuildCopy(FileNode *izquierda,FileNode *derecha); void AccionFileNode_Print(AccionFileNode *afn); diff --git a/main.c b/main.c index 65bb94e..6ec557c 100644 --- a/main.c +++ b/main.c @@ -12,16 +12,26 @@ void help(char *exe){ char exeFilename[MaxPath]; File_GetName(exe,exeFilename); printf("Modo de uso:\n"); - printf("\t%s info [file] {[file] {..}}\n",exeFilename); - printf("\t%s scan [dir] [tree] \n",exeFilename); - printf("\t%s rescan [dir] [tree] \n",exeFilename); - printf("\t%s read [file] [tree]\n",exeFilename); - printf("\t%s dir [dir]\n",exeFilename); - printf("\t%s sync [dirIzquierda] [dirDerecha]\n",exeFilename); + printf(" %s info [file] {[file] {..}}\n",exeFilename); + printf(" %s scan [dir] [tree] \n",exeFilename); + printf(" %s rescan [dir] [tree] \n",exeFilename); + printf(" %s read [file] [tree]\n",exeFilename); + printf(" %s dir [dir]\n",exeFilename); + printf("\n"); + printf(" %s sync [dirIzquierda] [dirDerecha]\n",exeFilename); + printf(" %s resync [dirIzquierda] [dirDerecha]\n",exeFilename); + printf(" %s synctest [dirIzquierda] [dirDerecha]\n",exeFilename); + printf(" %s resynctest [dirIzquierda] [dirDerecha]\n",exeFilename); + printf("\n"); + printf(" %s copy [dirIzquierda] [dirDerecha]\n",exeFilename); + printf(" %s recopy [dirIzquierda] [dirDerecha]\n",exeFilename); + printf(" %s copytest [dirIzquierda] [dirDerecha]\n",exeFilename); + printf(" %s recopytest [dirIzquierda] [dirDerecha]\n",exeFilename); } -int sync(char *pathIzquierda,char *pathDerecha,int dryrun); +FileNode *checkDir(char *path,int recheck); +int sync(char *pathIzquierda,char *pathDerecha,int recheck,int dryrun); int main(int argc,char *argv[]){ @@ -30,6 +40,11 @@ int main(int argc,char *argv[]){ FileTime ft; int i; + if(argc<2){ + help(argv[0]); + return 0; + } + if(!strcmp(argv[1],"info") && argc>=3){ // Informacion de ficheros for(i=2;i