Esta función es una verdadera tontería,simplemente la hice para ver como iba con los punteros y demás...
Para facilitar la lectura dejo una Imagen también.
Imagen

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
 int pCopy(char *,char *);
   int main(int argc, char *argv[])
    {
      pCopy("C:\\datos.txt","C:\\COPIADEDATOS.TXT");
      system("PAUSE");	
    }
   int pCopy(char * Source,char * pDest)
    {
      FILE * pArchivo1 = fopen(Source,"rb");

          fseek(pArchivo1,0,SEEK_END);
          long peso = ftell(pArchivo1);
          rewind(pArchivo1);
          char * Buffer = (char*)malloc(peso);
          fread(Buffer,1,peso,pArchivo1); 

      fclose(pArchivo1);
       FILE * pArchivo2 = fopen(pDest,"wb");
         fwrite(Buffer,1,peso,pArchivo2);
	   fclose(pArchivo2);   
     free(Buffer);
	 //Comprobacion para el return
	  if(pArchivo1 != NULL && pArchivo2 != NULL) return 1;
}
*Probado con Binarios y Texto.

Agradecimientos a todos los que participan en la sección...

Saludos....
Blog técnico dedicado a la seguridad informática y al estudio de nuevas vulnerabilidades.
Blog: http://www.seginformatica.net
Twitter: https://twitter.com/#!/p0is0nseginf
Es buena la función, no conocía rewind() yo tenía que usar fseek(f,0L,SEEK_SET); o fsee(f,0,SEEK_SET); solo el return no me gustó yo te recomendaría comprobar ambos archivos al principio y si no abren retornar -1 ahí mismo así hacer todo el procedimiento aunque el archivo sea nulo, osea:

Código: Seleccionar todo

   int pCopy(char * Source,char * pDest)
    {
     //Abrir binarios
      FILE * pArchivo1 = fopen(Source,"rb");
      FILE * pArchivo2 = fopen(pDest,"wb");
      //Comprobacion para el return
     if(pArchivo1 != NULL && pArchivo2 != NULL) return -1;

          fseek(pArchivo1,0,SEEK_END);
          long peso = ftell(pArchivo1);
          rewind(pArchivo1);
          char * Buffer = (char*)malloc(peso);
          fread(Buffer,1,peso,pArchivo1);

      fclose(pArchivo1);

         fwrite(Buffer,1,peso,pArchivo2);
      fclose(pArchivo2);   
     free(Buffer);
     return 0;

}
así ya deberías poder implementar una condicional para tu función:

Código: Seleccionar todo

   int main(int argc, char *argv[])
    {
      if(pCopy("C:\\datos.txt","C:\\COPIADEDATOS.TXT")==0)
        printf("Se ha copiado todo con éxito");
      else
        printf("Ha ocurrido un error al abrir alguno de los ficheros");
      system("PAUSE");   
    }
(:
//mHmm..
jajaja, buena funcion... esto suele venir bien en los lenguaes como VB que a la hora de programar malware filecopy ( o copyfile, no recuerdo cmo era) esta muy detectado y biene bien una funcion como esta que no es detectada...

salu2!
Imagen
Bueno agradezco a psicosis por las recomendaciones y les mando un recadito que no lo recuerdo muy bien pero les coloco lo que recuerdo:

Linkgl tienes 2 fallas enormes, creo que para los que empezamos siempre seguimos las correcciones de los que estan más avanzados en el tema pero y si seguimos más errores aún, tienes un error en la condición

Código: Seleccionar todo

if(pArchivo1 != NULL && pArchivo2 != NULL) return -1;
Si abre bien los 2 archivos retorna -1??
Además la idea de ftell con fseek es buena pero en un archivo de 4GB se consumira 4GB de memoria( o al menos eso se asume ), Por favor ser lo más posibles correctos en las correcciones y si no dejarla a otros usuarios.
Fin del recado.

p0is0n, te marco tus errores personalmente, primero no compruebas si los archivos se abrieron o no, te da igual.. Pero eso no es bien visto y puede causar errores, segundo cierras los 2 archivos y luego compruebas despues de cerrados si no se abrieron bien?

Código: Seleccionar todo

fclose(pArchivo1);
 FILE * pArchivo2 = fopen(pDest,"wb");
 fwrite(Buffer,1,peso,pArchivo2);
 fclose(pArchivo2); 
free(Buffer);
 //Comprobacion para el return
 if(pArchivo1 != NULL && pArchivo2 != NULL) return 1;
A mi no me funcionó pero tampoco me tome la molestia de arreglarlo.. Preferí hacer mi muestra:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

/* @autor The Swash
    @thanks psicosis
*/
int sCopy(char * Source, char * Dest);
                    
main(){
       int xd;
       xd = sCopy("C:\\Replace.exe","C:\\Raimees.exe");
       printf("%i",xd);
       getchar();
       }                    
                                                          
                                  
int sCopy(char * Source, char * Dest){
    FILE * FSrc;
    FILE * Dst;
    char * Buffer;
    int Size = 0;
    int Readed;
    int Writed;
    
    FSrc = fopen(Source, "rb");
    Dst = fopen(Dest,"wb");

    if ((FSrc != NULL) && (Dst != NULL)){
         while (fgetc(FSrc)!=EOF){
                Size++;
                }
         rewind(FSrc);       
         Buffer = (char *) malloc(Size * sizeof(char));
         Readed = fread(Buffer,1,Size,FSrc);
         if (Readed == Size){
             Writed = fwrite(Buffer,1,Size,Dst);
             if (Writed == Size){
                 fclose(FSrc);
                 fclose(Dst);       
                 free(Buffer);
                 return 0;
                 } 
             else{
                  fclose(FSrc);
                  fclose(Dst);
                  free(Buffer);                  
                  return -1;
                  }
         } 
    }               
    else{
         fclose(FSrc);
         fclose(Dst);
         return -1;
         }
}  
Saludos.
En tu ventana
Y en tu ventana, gritas al cielo pero lo dices callada..
plop! no me había fijado jeje, como no compilé no le dí importancia solo copié y pegé el codigo de p0is0n y aquí mismo edité, bueno el code de p0is0n funciona, solo para copiar por ejemplo binarios tienes que poner un sizeof(char) en el fread y fwrite y asi te queda bien.

Code correcto:

Código: Seleccionar todo

   #include <stdio.h>
#include <stdlib.h>

int pCopy(char *,char *);

   int main(int argc, char *argv[])
    {
      pCopy("C:\\fuck.exe","C:\\copia.exe");
      system("PAUSE");   
    }
 int pCopy(char * Source,char * pDest)
    {
     //Abrir binarios
     FILE * pArchivo1 = fopen(Source,"rb");
     FILE * pArchivo2 = fopen(pDest,"wb");
      //Comprobacion para el return
     if(pArchivo1 == NULL || pArchivo2 == NULL) return -1;
     fseek(pArchivo1,0,SEEK_END);
     long peso = ftell(pArchivo1);
     rewind(pArchivo1);
     char * Buffer = (char*)malloc(peso);
     fread(Buffer,peso,sizeof(char),pArchivo1);
     fclose(pArchivo1);
     fwrite(Buffer,peso,sizeof(char),pArchivo2);
     fclose(pArchivo2);   
     free(Buffer);
     return 0;
}
Gracias por corregirme no es la primera vez que me equivoco por no compilar, ahora sí compilé ;)
//mHmm..
Gracias KainRazor...Pues,generalmente uso Notepad++ para programar,y luego Dev C++ para compilar y demás...

Saludos bro...
Blog técnico dedicado a la seguridad informática y al estudio de nuevas vulnerabilidades.
Blog: http://www.seginformatica.net
Twitter: https://twitter.com/#!/p0is0nseginf
Responder

Volver a “Fuentes”