Programación General > Visual Basic 6.0 e inferiores
Cómo Unir Partes De Un Mismo Archivo (Foto JPG)
(1/1)
ProgramadorVB:
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
ProgramadorVB:
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.
Nebire:
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 --- Private Function RefundirArchivo(ByRef Rutas() As String) As String Dim f1 As Integer, f2 As Integer Dim b() As Byte, k As Long, n As Integer, t As Long On Local Error GoTo sale ' típicamente un fallo con una ruta, un archivo no se pudo abrir, no existe,etc... If (Not (Rutas)) <> -1 Then ' la matriz tiene elementos ? f1 = FreeFile: f2 = FreeFile Open Rutas(0) For Binary As #f1 t = 1 For n = 1 To UBound(Rutas) Open Rutas(n) For Binary As #f2 ' abrimos archivo uno a uno k = LOF(f2) ' nos informamos de su tamaño ReDim b(0 To k - 1) ' reservamos memoria Get #f2, , b ' leemos origen Put #f1, t, b ' pegamos en destino t = t + k ' actualizamos puntero de escritura Close #f2 ' cerramos archivo actual Next Erase b ' liberamos memoria RefundirArchivo = Rutas(0) ' si todo fue bien devolvemos la ruta del archivo resultante, si falló algo se devuelve una cadena vacía. End Ifsale: Close #f1, f2End Function
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 --- Private Sub Form_Click() Dim r() As String, res As String, k as integer ' recopilación de las rutas... ReDim r(0 To 9) r(0) = "C:Mi archivo.jpg" For k = 1 To 9 r(k) = "C:Mi archivo-00" & CStr(k) & ".jpg" Next res = RefundirArchivo(r) ' llamada a la función ' avisar del resultado If res <> "" Then MsgBox "Archivo refundido en el archivo: " & res Else MsgBox "Algo falló al refundir archivos..." MsgBoxEnd Sub
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.
Navegación
Ir a la versión completa