Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Josstaa en 24 Febrero 2013, 04:13 am



Título: Copiar .png
Publicado por: Josstaa en 24 Febrero 2013, 04:13 am
He estado intentando por un buen tiempo copiar archivos .png, pero no he podido, los métodos que hay por internet funcionan pero para archivos de texto, a demás, no basta con la funcion FileCopy o como sea, ya que necesito enviarla por sockets, me serviría perfecto un ejemplo de copiarla en el mismo directorio..

De antemano, gracias.


Título: Re: Copiar .png
Publicado por: amchacon en 24 Febrero 2013, 11:31 am
Voy a rescatar el código de un viejo proyecto:

Código
  1. // Esta funcion copia el contenido de un archivo a otro
  2.  
  3. void AMC::CopiarArchivos(ifstream &Lectura,ofstream &Escritura,unsigned long long Tamanyo_Archivo)
  4. {
  5. char* Cosa; // Buffer para leer
  6. unsigned int Tamanyo_Lectura; // Variable que designa el tamaño de cada lectura
  7. unsigned long long Contador = 0;  // Variable auxiliar, se utiliza para contabilizar el progueso obtenido y calcular un porcentaje
  8.    unsigned short Porcentaje = 0; // Porcentaje actual
  9.    unsigned long long Limite; // Valor auxiliar correspondiente al 1% del tamanyo del archivo. Se utiliza para saber cuando hay que aumentar el porcentaje en 1
  10.    unsigned long long Offset = 0; // Variable que contiene la posicion del archivo actual
  11.  
  12. if (!Lectura)
  13. throw Excepcion("ERROR AL COPIAR ARCHIVOS, ARCHIVO DE ORIGEN NO ENCONTRADO",ARCHIVO_NO_ENCONTRADO);
  14.  
  15. // Si el tamanyo del archivo es inferior al buffer máximo permitido. Se leera el archivo del tirón
  16.  
  17.    if (Tamanyo_Archivo < MAX_LECTURA)
  18.            Tamanyo_Lectura = Tamanyo_Archivo;
  19.    else
  20.             Tamanyo_Lectura = MAX_LECTURA; // Si no, se dejará en el máximo valor
  21.  
  22. /* Asignamos la memoria al buffer, si no se puede satisfacer la operación se intentará asignar un buffer menor,
  23. si el tamaño del buffer llega a 1. La propia función de asignar memoria lanza una excepción que termina el programa */
  24.  
  25. while (!AsignarMemoria(Cosa,Tamanyo_Lectura))
  26. {
  27. Tamanyo_Lectura /=2;
  28. }
  29.  
  30. /* Decidimos si vamos a mostrar el porcentaje o no, para aumentar el rendimiento. Solo se mostrará
  31. si su tamaño es superior a 100 MB */
  32.  
  33.    if (Tamanyo_Archivo >  104857600)
  34. Limite = Tamanyo_Archivo/100;
  35.    else
  36.             Limite = 0; // Desactivado
  37.  
  38.  
  39. while (Offset != Tamanyo_Archivo) // Mientras la posicion del archivo no llegue a su tamaño
  40.          {
  41.               // Leemos y escribimos
  42.  
  43.               Lectura.read(Cosa,Tamanyo_Lectura);
  44.               Escritura.write(Cosa,Tamanyo_Lectura);
  45.  
  46.   Offset += Tamanyo_Lectura; // Aumentamos el progueso del archivo
  47.  
  48.   // Si el muestreo de porcentaje está activado...
  49.  
  50.               if (Limite != 0)
  51.               {
  52.   Contador += Tamanyo_Lectura; // Aumentamos el medidor
  53.  
  54.   if (Contador >= Limite) // Si el medidor supera el 1% del archivo
  55.   {
  56.  Porcentaje++; // Aumentamos el porcentaje
  57.  cout<<Porcentaje<<"%"<<endl; // Lo mostramos por pantalla
  58.  Contador = 0; // Reseteamos el medidor
  59.   }
  60.               }
  61.  
  62.   // Antes de repetir el bucle, comprobaremos si en la proxima lectura desbordaremos el archivo
  63.  
  64.               if ((Tamanyo_Archivo - Offset) < Tamanyo_Lectura)
  65.               {
  66.  // Si así es, hacemos una lectura con lo que nos quede del archivo
  67.  
  68.                  Lectura.read(Cosa,Tamanyo_Archivo - Offset);
  69.                  Escritura.write(Cosa,Tamanyo_Archivo - Offset);
  70.  
  71.  // Situamos el indicador de posición al final del archivo
  72.  
  73.                  Offset = Tamanyo_Archivo;
  74.               }
  75.  
  76.         }
  77.  
  78.      delete[] Cosa; //Borramos la memoria dinámica usada
  79. }
  80.  
  81. /* Asigna el buffer de lectura, devuelve verdadero si tuvo exito.
  82.  
  83. Si no tuvo exito, devuelve falso por si se quiere modificar. Si no se puede modificar más, se lanza una excepción */
  84.  
  85. inline bool AMC::AsignarMemoria(char* &Cosa,unsigned int Lectura)
  86. {
  87. try
  88. {
  89. Cosa = new char[Lectura]; // Asignamos el buffer
  90. return true; // Hemos conseguido asignar el buffer con exito
  91. }
  92. catch(...) // Si ocurrió alguna excepción
  93. {
  94. if (Lectura > 1) // Se devolverá "falso" para indicar que no se pudo asignar la memoria y asi dar una oportunidad para asignar un buffer menor
  95. return false;
  96. else // Si el tamaño del buffer no puede disminuir más, se lanza una excepción.
  97. throw Excepcion("Error inesperado en la memoria",MEMORIA_NO_DISPONIBLE);
  98. }
  99. }
  100.