Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-02-2006
aram2r aram2r is offline
Miembro
 
Registrado: ene 2004
Posts: 81
Poder: 21
aram2r Va por buen camino
Post copiar fichero mas de 2Gb con esta funcion

Hola amigos, utilizo esta clasica *funcion para copiar un fichero con cierta perioridad, y ha estado funcionando perfectamente hasta que el fichero ha sobrepasdo las 3Gb no me copia mas de 2.033.000, hasta en un fichero de 18Gb solo me copia las 2 primeras..........

He probado en la condicion del bucle a poner
Código:
  While not Eof(Origen) do
Pero me sigue copiando solo 2Gb ??????? Xq???

Que puedo hacer para copiar ficheros de mas de 2Gb con barra de proceso......xq con CopyFile se copia bien pero tiene el incoveniente que deja la aplicacion frita mientras copia......

*funcion:

Código:
procedure TForm1.copiarConProgreso(ArchivoOrigen, ArchivoDestino: String);
var
  Origen,
  Destino  :file of byte;
  Buffer   :array[0..4096] of char;
  Leidos   :integer;
  Longitud :LongInt;
begin
 {Abrimos fichero Origen y Destino}
 AssignFile(Origen,ArchivoOrigen);
 reset(Origen);
 AssignFile(Destino,ArchivoDestino);
 rewrite(Destino);
 {Hallamos la longitud del fichero a copiar}
 Longitud:=FileSize(Origen);
 {Actualizamos limites de la ProgressBar}
 PB1.Max:=Longitud;
 PB1.Min:=0;
 while Longitud >0 do
 begin
   BlockRead(Origen,Buffer[0],SizeOf(Buffer),Leidos);
   Longitud:=Longitud-Leidos;
   BlockWrite(Destino,Buffer[0],Leidos);
   PB1.Position:=PB1.Position+Leidos;
   Application.ProcessMessages;
 end;
 CloseFile(Origen);
 CloseFile(Destino);
 PB1.Position:=0;
end;
Responder Con Cita
  #2  
Antiguo 08-02-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Si no me equivoco, 2GB es aproximadamente lo que puede representarse con un integer que es el tipo de datos de la propiedad Max del ProgressBar. No sé si no te copia todo el archivo o simplemente no queda bien la barra. En tal caso deberás hacer una escala para que quede bien.

// Saludos
Responder Con Cita
  #3  
Antiguo 08-02-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Ah! Ya veo. Además de la barra de progreso sí tienes problemas en la copia ya que usas un LongInt para la longitud del archivo y LongInt viene a ser lo mismo que el integer. Puedes cambiar por un LongWord, lo que te doblará la capacidad, o mejor un Int64.

// Saludos
Responder Con Cita
  #4  
Antiguo 08-02-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Je, je, otro problema: FileSize regresa un integer

Supongo que te puedes arreglar directamente con la función GetFileSize de la API Windows.

// Saludos

pd: no tengo a la mano un archivo tan grande como para probar
Responder Con Cita
  #5  
Antiguo 08-02-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

¿Porqué no pruebas con la función "CopyFileEx" o con la función "ShFileOperation"? En el caso de esta última quedaría más o menos como sigue, de tal modo que se muestre una ventana de progreso mientras se copia el archivo y además la interfaz de tu aplicación no se vea "retenida".

Código Delphi [-]
uses
  Windows, ShellApi;

function CopiarArchivo(const archivoOrigen,
  archivoDestino: string) : boolean;
var
  FileOp: TSHFileOpStruct;
begin
  FillChar(FileOp, SizeOf(FileOp), #0);
  with FileOp do
  begin
    wFunc := FO_COPY;
    Wnd := GetDesktopWindow;
    pFrom := PChar(archivoOrigen+#0);
    pTo := PChar(archivoDestino+#0);
    lpszProgressTitle := 'Copiando...';
    fFlags := FOF_SIMPLEPROGRESS or FOF_ALLOWUNDO;
  end;
  Result := (ShFileOperation(FileOp) = 0);
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 08-02-2006
Avatar de OSKR
OSKR OSKR is offline
Miembro
 
Registrado: nov 2004
Ubicación: San Cristóbal/Táchira/Venezuela
Posts: 389
Poder: 20
OSKR Va por buen camino
Una peqeña acotación...con 32 bits en un entero se alcanza a 4 GB
__________________
Los Estados Unidos parecen destinados por la Providencia para plagar la América de miserias a nombre de la libertad."
Simón Bolívar
(Carta al Coronel Inglés Patricio Cambell 05/08/1829).
Responder Con Cita
  #7  
Antiguo 08-02-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No exactamente. Un Integer tiene signo y por ello va de -2GB a 2GB. Por ello mencioné que al usar LongWord (integer sin signo) doblaría la capacidad.

// Saludos
Responder Con Cita
  #8  
Antiguo 08-02-2006
Avatar de OSKR
OSKR OSKR is offline
Miembro
 
Registrado: nov 2004
Ubicación: San Cristóbal/Táchira/Venezuela
Posts: 389
Poder: 20
OSKR Va por buen camino
Eso es correcto, asumía q ya hablabas de un unsigned, para desplazamientos es lo mejor
__________________
Los Estados Unidos parecen destinados por la Providencia para plagar la América de miserias a nombre de la libertad."
Simón Bolívar
(Carta al Coronel Inglés Patricio Cambell 05/08/1829).
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Tamaño fijo de string escribiendo un fichero davidgaldo Varios 1 09-11-2005 18:08:18
que programa esta ejecutando un determinado archivo slat API de Windows 1 11-04-2005 17:11:23
Pasar contenido fichero a un campo memo Jose Manuel Impresión 2 15-03-2005 16:39:59
Leer un fichero .ini oesteve OOP 6 16-06-2003 16:40:20
Sintaxis de esta Función cmgenny Varios 5 11-05-2003 06:43:01


La franja horaria es GMT +2. Ahora son las 19:22:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi