FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 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; |
#2
|
||||
|
||||
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 |
#3
|
||||
|
||||
¡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 |
#4
|
||||
|
||||
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 |
#5
|
||||
|
||||
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".
|
#6
|
||||
|
||||
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). |
#7
|
||||
|
||||
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 |
#8
|
||||
|
||||
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). |
|
|
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 |
|