Copiar .png

Iniciado por Josstaa, 24 Febrero 2013, 04:13 AM

0 Miembros y 1 Visitante están viendo este tema.

Josstaa

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.

amchacon

#1
Voy a rescatar el código de un viejo proyecto:

Código (cpp) [Seleccionar]

// Esta funcion copia el contenido de un archivo a otro

void AMC::CopiarArchivos(ifstream &Lectura,ofstream &Escritura,unsigned long long Tamanyo_Archivo)
{
char* Cosa; // Buffer para leer
unsigned int Tamanyo_Lectura; // Variable que designa el tamaño de cada lectura
unsigned long long Contador = 0;  // Variable auxiliar, se utiliza para contabilizar el progueso obtenido y calcular un porcentaje
    unsigned short Porcentaje = 0; // Porcentaje actual
    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
    unsigned long long Offset = 0; // Variable que contiene la posicion del archivo actual

if (!Lectura)
throw Excepcion("ERROR AL COPIAR ARCHIVOS, ARCHIVO DE ORIGEN NO ENCONTRADO",ARCHIVO_NO_ENCONTRADO);

// Si el tamanyo del archivo es inferior al buffer máximo permitido. Se leera el archivo del tirón
         
    if (Tamanyo_Archivo < MAX_LECTURA)
            Tamanyo_Lectura = Tamanyo_Archivo;
    else
             Tamanyo_Lectura = MAX_LECTURA; // Si no, se dejará en el máximo valor

/* Asignamos la memoria al buffer, si no se puede satisfacer la operación se intentará asignar un buffer menor,
si el tamaño del buffer llega a 1. La propia función de asignar memoria lanza una excepción que termina el programa */

while (!AsignarMemoria(Cosa,Tamanyo_Lectura))
{
Tamanyo_Lectura /=2;
}

/* Decidimos si vamos a mostrar el porcentaje o no, para aumentar el rendimiento. Solo se mostrará
si su tamaño es superior a 100 MB */

    if (Tamanyo_Archivo >  104857600)
Limite = Tamanyo_Archivo/100;
    else
             Limite = 0; // Desactivado
             

while (Offset != Tamanyo_Archivo) // Mientras la posicion del archivo no llegue a su tamaño
          {
               // Leemos y escribimos
   
               Lectura.read(Cosa,Tamanyo_Lectura);
               Escritura.write(Cosa,Tamanyo_Lectura);
   
   Offset += Tamanyo_Lectura; // Aumentamos el progueso del archivo
               
   // Si el muestreo de porcentaje está activado...
   
               if (Limite != 0)
               {
   Contador += Tamanyo_Lectura; // Aumentamos el medidor
   
   if (Contador >= Limite) // Si el medidor supera el 1% del archivo
   {
  Porcentaje++; // Aumentamos el porcentaje
  cout<<Porcentaje<<"%"<<endl; // Lo mostramos por pantalla
  Contador = 0; // Reseteamos el medidor
   }
               }
               
   // Antes de repetir el bucle, comprobaremos si en la proxima lectura desbordaremos el archivo
   
               if ((Tamanyo_Archivo - Offset) < Tamanyo_Lectura)
               {
  // Si así es, hacemos una lectura con lo que nos quede del archivo
 
                  Lectura.read(Cosa,Tamanyo_Archivo - Offset);
                  Escritura.write(Cosa,Tamanyo_Archivo - Offset);
 
  // Situamos el indicador de posición al final del archivo
 
                  Offset = Tamanyo_Archivo;
               }
               
         }
         
      delete[] Cosa; //Borramos la memoria dinámica usada
}

/* Asigna el buffer de lectura, devuelve verdadero si tuvo exito.

Si no tuvo exito, devuelve falso por si se quiere modificar. Si no se puede modificar más, se lanza una excepción */

inline bool AMC::AsignarMemoria(char* &Cosa,unsigned int Lectura)
{
try
{
Cosa = new char[Lectura]; // Asignamos el buffer
return true; // Hemos conseguido asignar el buffer con exito
}
catch(...) // Si ocurrió alguna excepción
{
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
return false;
else // Si el tamaño del buffer no puede disminuir más, se lanza una excepción.
throw Excepcion("Error inesperado en la memoria",MEMORIA_NO_DISPONIBLE);
}
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar