Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   copiar fichero mas de 2Gb con esta funcion (https://www.clubdelphi.com/foros/showthread.php?t=30066)

aram2r 08-02-2006 08:41:14

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;


roman 08-02-2006 09:04:47

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

roman 08-02-2006 09:16:18

¡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

roman 08-02-2006 09:24:53

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 :(

dec 08-02-2006 10:55:59

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;

OSKR 08-02-2006 17:04:06

Una peqeña acotación...con 32 bits en un entero se alcanza a 4 GB

roman 08-02-2006 17:08:05

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

OSKR 08-02-2006 17:28:22

Eso es correcto, asumía q ya hablabas de un unsigned, para desplazamientos es lo mejor


La franja horaria es GMT +2. Ahora son las 20:14:33.

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