SoloCodigo

Programación General => Visual Basic 6.0 e inferiores => Mensaje iniciado por: ProgramadorVB en Miércoles 2 de Junio de 2010, 21:12

Título: Cómo Unir Partes De Un Mismo Archivo (Foto JPG)
Publicado por: ProgramadorVB en Miércoles 2 de Junio de 2010, 21:12
Hola amigos, cómo están, espero que muy bien.

Estoy modificando un proyecto, para descargar cualquier archivo en varias partes... para acelerar el proceso de descarga...

El tema es que luego de descargar las partes por separado... no puedo unirlo todo, en un archivo correcto... que en mi ejemplo es un JPG... ya he probado pero no logro dar con la tecla...

Espero que me puedan ayudar... publico aquí el proyecto, limpio de mis intentos de unión... para que se entienda mejor...

Por favor, necesito ayuda con esto, ya que me estoy volviendo  :wacko:   loco

Gracias de antemano...

Un saludo
Título: Re: Cómo Unir Partes De Un Mismo Archivo (Foto JPG)
Publicado por: ProgramadorVB en Jueves 3 de Junio de 2010, 01:06
Hola, ya me respondieron... ésta es la solución:


Dim Parte1 As String, Parte2 As String, Parte3 As String
Open "C:Prueba.001" For Binary As #1
Parte1 = Space$(LOF(1))
Get #1, 1, Parte1
Close #1
Open "C:Prueba.002" For Binary As #1
Parte2 = Space$(LOF(1))
Get #1, 1, Parte2
Close #1
Open "C:Prueba.003" For Binary As #1
Parte3 = Space$(LOF(1))
Get #1, 1, Parte3
Close #1

Open "C:Prueba.jpg" For Binary As #1
Put #1, 1, Parte1 & Parte2 & Parte3
Close #1



Un saludo y gracias.
Título: Re: Cómo Unir Partes De Un Mismo Archivo (Foto JPG)
Publicado por: Nebire en Jueves 3 de Junio de 2010, 07:53
No es muy práctico ese método, porque a priori no sabes si tienes 3 o 20 partes.
Lo correcto sería que una función que utilizara un bucle...

en ódigo sería más o menos:
Fíjate que  tomamos los archivos del 1 en adelante y se pegan  todos en el archivo 0
Código: Visual Basic
  1.  
  2. Private Function RefundirArchivo(ByRef Rutas() As String) As String
  3.     Dim f1 As Integer, f2 As Integer
  4.     Dim b() As Byte, k As Long, n As Integer, t As Long
  5.  
  6.     On Local Error GoTo sale    '  típicamente un fallo con una ruta, un archivo no se pudo abrir, no existe,etc...
  7.     If (Not (Rutas)) <> -1 Then  ' la matriz tiene elementos ?
  8.         f1 = FreeFile: f2 = FreeFile
  9.         Open Rutas(0) For Binary As #f1
  10.         t = 1
  11.         For n = 1 To UBound(Rutas)
  12.             Open Rutas(n) For Binary As #f2  ' abrimos archivo uno a uno
  13.                 k = LOF(f2)                  ' nos informamos de su tamaño
  14.                 ReDim b(0 To k - 1)          ' reservamos memoria
  15.                 Get #f2, , b                 ' leemos origen
  16.                 Put #f1, t, b                ' pegamos en destino
  17.                 t = t + k                    ' actualizamos puntero de escritura
  18.             Close #f2                        ' cerramos archivo actual
  19.         Next
  20.         Erase b                              ' liberamos memoria
  21.         RefundirArchivo = Rutas(0)           ' si todo fue bien devolvemos la ruta del archivo resultante, si falló algo se devuelve una cadena vacía.
  22.     End If
  23. sale:
  24.     Close #f1, f2
  25. End Function
  26.  
  27.  
  28.  

Para que funciones correctamente se requiere ciertas condiciones... la mas obvia es:
* La matriz de rutas esté correctamente ordenada si las partes se unen en diferente orden ya sabes que podrá salir.
* El tamaño final del archivo no puede superar el tamaño de un long (2GB.)

Para probarlo: imginemos que tenemos un lote de archivos en la unidad c, que sellaman 'Mi archivo.jpg' y los siguientes en la forma 'Mi archivo-00x.jpg' donde x es un cifra del 1 al 9, queremos por tanto refundir esos archivos del 1 al 9 sobre el primero.. usando el evento click del formulario:
Código: Visual Basic
  1.  
  2. Private Sub Form_Click()
  3.     Dim r() As String, res As String, k as integer
  4.    
  5.     '  recopilación de las rutas...
  6.      ReDim r(0 To 9)
  7.     r(0) = "C:Mi archivo.jpg"
  8.     For k = 1 To 9
  9.         r(k) = "C:Mi archivo-00" & CStr(k) & ".jpg"
  10.     Next
  11.    
  12.     res = RefundirArchivo(r)           '   llamada a la función
  13.    
  14.    ' avisar del resultado
  15.      If res <> "" Then
  16.         MsgBox "Archivo refundido en el archivo: " & res
  17.     Else
  18.         MsgBox "Algo falló al refundir archivos..."
  19.     MsgBox
  20. End Sub
  21.  
  22.  
  23.  

p.d.: Adicionalmente el método que te señalan más arriba podría fallar, ya que utiliza caracteres para leer un archivo, un carácter se compone de 2 bytes, así cuando leas ficheros cuyo tamaño no sea par, fallará.... porque estarás pegando un byte más que desplazará a los de los siguientes archivos.