border

Miembros:
Mensajes:
Temas:
Online:

Ultimo Miembro:

 
 

Cuenta Bancaria en EEUU
  #1 (permalink)  
Antiguo 12-01-2007, 18:38:40
Un Nuevo Amigo
 
Registrado: ene 2007
Posts: 17
Ixreb Valoración +2
Predeterminado Me envia 1 kb de mas...

Os comento, mi proposito es unir 2 archivos ya cortados (he comprobado que se han cortado correctamente), pero si por ejemplo, el 1º archivo ocupa 3 kb al copiarlo al archivo donde voy a unirlos me ocupa 4, y no entiendo porque me envia 1kb mas... El código es el siguiente:

Dim Buffer As String * 1024

Open "c:\archivo_" & i & "." & i For Binary As #1

Do While not EOF(1)
Get #1, , Buffer
Open destino.Text For Binary As #2
Seek (2), LOF(2) + 1
Put #2, , Buffer
Close #2
Loop

Close #1

i = i + 1

(Ahora mismo se van añadiendo cada vez que pulse el boton, ya que, queria saber que fallaba)

Pues lo dicho, siempre me añade 1 kb mas por archivo, por lo tanto el archivo unido no sirve al unirlo

Gracias adelantadas
Responder Con Cita
  #2 (permalink)  
Antiguo 12-01-2007, 20:22:42
Avatar de acalanto
Moderador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 4.307
acalanto ha deshabilitado la reputación
Predeterminado

Es que por defecto dimensionas un buffer de 1024 y deberías hacerlo de forma dinámica tal como te muestro en el siguiente código modificado.


Código:
Dim Buffer As String
Dim i as Long
'Apertura del archivo Destino
Open destino.Text For Binary As #2 
for i = 1 to 2
    'Abrimos el fichero origen 'I'
    Open "c:\archivo_" & i & "." & i For Binary As #1 
    'Asignamos un buffer stream de la longitud del fichero origen
    Buffer = string(LOF(1),32)
    Get #1, , Buffer 
    Put #2, , Buffer 
    Close #1
next i 
'Cerramos fichero destino
Close #2


Espero que te resulte útil.
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #3 (permalink)  
Antiguo 12-01-2007, 23:56:13
Un Nuevo Amigo
 
Registrado: ene 2007
Posts: 17
Ixreb Valoración +2
Predeterminado

gracias acalanto, funciona a la perfección. Yo en realidad lo habia dimensionado a 1 kb para tener control sobre el progreso, y por cada vez que se hiciese el bucle aumentar un progressbar con tamaño max tamaño del archivo. Pero este código tambien funciona, solo me queda probar si peta pegando archivos mayores

Saludos
Responder Con Cita
  #4 (permalink)  
Antiguo 13-01-2007, 08:45:14
Avatar de acalanto
Moderador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 4.307
acalanto ha deshabilitado la reputación
Predeterminado

Yo te he propuesto esta variante de código con la seguridad de que se trata de ficheros pequeños que construyen uno mayor, y por esta razón no controlo el tamaño del fichero origen.

Para garantizar que funcione bien con cualquier tamaño de fichero es necesario lerr por bloques el origen hasta agotarlo, para evitar un desbordamiento de la memoria con un tamaño de buffer excesivo. Observa el siguiente ejemplo y comprobarás que funciona bien bajo cualquier situación (Ojo que windows no acepta ficheros mayores de 2 GB). Lógicamente deberás probar y adaptar a tus necesidades ya que está escrito 'al vuelo' y he podido cometer algún error.


Código:
public function union(FDestino as String, relpath as string, bloques as Long) as boolean
    Dim Buffer As String
    Dim MaxLen As Long 
    Dim Resto As Long
    Dim ptr As Long
    Dim i as Long 
    Dim hdo as integer
    Dim hdd as Integer
    On Local Error Resume Next
    'Asumimos un bloque máximo de lectura de 1 MB
    MaxLen = 1024^2
    'Apertura del archivo Destino 
    hdd = Freefile()
    Close #hdd : Open FDestino For Binary As #2 
    'Bucle de tratamiento de las diferentes particiones
    'con las que se construye el fichero completo.
    for i = 1 to bloques 
        'Abrimos el fichero origen 'I' 
        hdo = Freefile() : Close #hdo
        Open RelPath & cstr(i) & "." & cstr(i) For Binary As #hdo
        'Iniciamos el puntero de lectura
        ptr = 0
        Do
            If (LOF(hdo)-ptr) <= Len(MaxLen) then 
                'Asignamos un buffer stream de la longitud pendiente de copia 
                Buffer = string(LOF(1)-ptr, 32) 
                Get #hdo, ptr+1, Buffer 
                Put #hdd, , Buffer 
                Close #hdo
                Exit Do
            Else
                'Lectura y proceso de un Bloque MaxLen 
                Buffer = string(MaxLen, 32) 
                Get #hdo, ptr+1, Buffer 
                Put #hdd, , Buffer 
                ptr=ptr+MaxLen
            End If 
        Loop 
    Next i
    'Cerramos fichero destino 
    Close #2 
    'Controlamos si se han producido errores
    'durante el proceso de reconstrucción.
    union = iff(Err<>0, false, true)
end function
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #5 (permalink)  
Antiguo 14-01-2007, 02:31:33
Un Nuevo Amigo
 
Registrado: ene 2007
Posts: 17
Ixreb Valoración +2
Predeterminado

muchas gracias acalanto :smt003

muy buen codigo
Responder Con Cita
Respuesta


Herramientas
Desplegado

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
Trackbacks are habilitado
Pingbacks are habilitado
Refbacks are habilitado


Temas Similares
Tema Autor Foro Respuestas Último Mensaje
como programar lo que envia un puerto usb en vb.net 2005 Sandra Iveth Visual Basic.NET 2003 & 2005 1 19-06-2008 10:54:59
FORMULARIO QUE SE ENVIA A CORREO PERO NO ME LLEGA amada666 ASP 3 09-10-2006 00:22:27
Este codigo no envia error pero no funciona, pueden indicarm Keko7 Visual Basic 6.00 1 18-03-1970 22:47:24


La franja horaria es GMT. Ahora son las 23:07:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0
A vBSkinworks Design

Alojado en el servicio Premium de Masquewebs | Diseño mejorado por MasqueWebs

right