Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Varios archivos en un solo (open binary)

Estas en el tema de Varios archivos en un solo (open binary) en el foro de Visual Basic clásico en Foros del Web. Bueno, estoy queriendo meter varios archivos en un solo... Es decir cargo binariamente la info de cada archivo y generar un solo archivo con esa ...
  #1 (permalink)  
Antiguo 02/12/2009, 07:48
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 6 meses
Puntos: 19
Varios archivos en un solo (open binary)

Bueno, estoy queriendo meter varios archivos en un solo... Es decir cargo binariamente la info de cada archivo y generar un solo archivo con esa info para luego en otra oportunidad poder separarlos.

Una opcion que se me ocurrio es grabar de modo binario cada archivo uno seguido de otro. Y separar con alguna marca un archivo de otro... asi cuando quiero separarlos recorro secuencialmente los bytes hasta encontrar la marca (ahi sabria que termina un archivo y comienza otro) el problema es que no puedo poner ninguna marca, trate con -1 pero obviamente no se puede, es decir todos los numeros puede llegar a tener el archivo y encontrarme la marca en cualquier lado.

Es decir, recordemos que un array binario puede tener en cada posicion de 0 a 255. Pero son numeros posibles todos (osea el archivo en si puede contener de 0 a 255) entonces que numero uso para generar la marca si cualquiera puede ser usado por el archivo.

Otra posibilidad que se me ocurrio pero no me la permite es crear un archivo de acceso aleatorio, y directamente en cada "seek" asignarle un archivo de los que quiero cargar.

El problema es que de esta forma si o si tengo que tener una estructura type definida y en este caso cada archivo puede variar si tamaño asi que nuevamente no puedo establecer una sola... Igualmente probe con 100.000 bytes y me tira "Desbordamiento" es decir en el "LEN" del archivo aleatorio le pongo 100.000 y tira desbordamiento.

Realmente, me encuentro en un problema grabe.

Edito: La longitud maxima que admite un archivo aleatorio es de 32.000 y pico (osea el tamaño de un integer)

Asi que realmente no sirve... Abria que buscar una forma de hacerlo open binary y cargar uno seguido de otro y poner una marca para diferenciar cuando termina uno y cuando comienza otro

Edito2: Lo que estoy queriendo hacer seria como generar un archivo de recursos con los archivos que yo quiera, obviamente en tiempo de ejecucion con mi programa

Última edición por culd; 02/12/2009 a las 08:01
  #2 (permalink)  
Antiguo 02/12/2009, 08:46
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Varios archivos en un solo (open binary)

Hola:

Se me ocurre una posibilidad que dependiendo de lo que quieras hacer podría servir.
No es mas que una idea que se me va ocurriendo mientras escribo.

Supongamos que tenemos los siguientes archivos por poner algo

Archivo1.txt
Archivo2.exe
Archivo3.dat

Creamos ArchivoRecursos de Salida
Sacamos algo así como una cabecera para saber la composicion del primer archivo.
Por ejemplo
20 Caracteres para nombre archivo Archivo1.txt + espacios en blanco
10 Caracteres para tamaño Archivo1.txt Número de Bytes del mismo
A continuación los datos contenidos en Archivo1.txt

De este modo , abres el archivo Binary posteriormente
Sabes que 20 Caracteres Nombre del Fichero Original
10 Caracteres Número de Bytes que deberás leer para tenerlo completo
y de este modo tienes que

20 + 10 + Val(NumeroDeBytes) = Archivo1 Completo
desde 20 + 10 + Val(NumerodeBytes) + 1 Empieza nuevamente

20 + 10 + Val(NumeroDeBytes) = Archivo2 Completo

Es una idea, que te apunto para que puedas meditarla.

Saludos
  #3 (permalink)  
Antiguo 02/12/2009, 09:30
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 6 meses
Puntos: 19
Respuesta: Varios archivos en un solo (open binary)

Algo similar se me ocurrio...
Poner un archivo txt al comienzo que ocupe cierta cantidad de bytes minimos, y en ese archivo poner la info de todos los archivos que estan adentro, lingitud, formato, etc etc... Osea similar a lo tuyo

Obvio no seria lo mas optimo.

Hace un rato probando, junte dos imagenes .jpg (para probar) en un mismo archivo... Obviamente el archivo que se genero pesa ARCHIVO1+ARCHIVO2... La cuestion es que a ese nuevo archivo le puse extension .jpg y BUELA... Si se ejecuta se ve la primer imagen que agregue (pero obviamente no la segunda)...

Que significa eso:
Si el archivo1 pesa 50 bytes, y el archivo 2 pesa 40 bytes.
Al guardar lo logico seria que pese 90 bytes... en realidad pesa 92 bytes...
Por que al primer archivo le suma 1 byte y al ultimo otro byte... Entonces ese seria el "fin de archivo" por eso se puede ver la primer imagen JPG...

El punto es: Como joraca verifico cual es el ultimo byte... Si cuando lo visualizo me tira byte "0", y en el conjunto de los 50bytes puede haber varios "0".
  #4 (permalink)  
Antiguo 02/12/2009, 11:35
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Varios archivos en un solo (open binary)

Hola:

He preparado un ejemplo de lo que yo proponia y después te lo subo con una explicacion de los controles que tienes que poner en el formulario para que funcione.

El problema es que leo el foro en este momento desde un equipo en el que no tengo el ejemplo.

La pregunta del millón es ¿ que pretendes hacer, si no es indiscreccion, con el archivo ? porque evidentemente lo que sería mas complicado que funcionara sería lo de ver imagenes una detras de otra, etc. o por ejemplo ejecutarse un exe detrás de otro, para milagros doctores hay.

Lo que yo tengo de momento en el ejemplo y funciona es lo siguiente:

A través de un FileListBox por simplificar, seleccionas un archivo y al darle doble click te lo añade al final del archivo que tu le indiques. Después otra funcion te enseña en un ListBox los nombre de archivos y tamaño de cada uno de ellos.

He previsto 20 Caracteres para el nombre de archivo y lo guardo sin el Path, pero evidentemente se trata de aumentar este tamaño si se pretende además guardar el nombre de la carpeta contenedora del mismo. No se guardan Fechas de creación ni nada por el estilo pero por supuesto podría hacerse, por lo que al restaurar el archivo las fechas del mismo serán las del sistema en este momento.

Bueno, como te digo en cuanto llegue a casa te subo el código de ejemplo a ver que tal lo ves y si cumple tus necesidades.

Saludos
  #5 (permalink)  
Antiguo 02/12/2009, 11:38
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Varios archivos en un solo (open binary)

Respecto a tu pregunta de porque tiene un byte mas el archivo generado, el tema está en como lo generas.

Evidentemente no puedes utilizar las sentencias INPUT ni PRINT ya que estas sólo son válidas para archivos de texto puesto que podrían encontrarse en otro tipo de archivos con caracteres <EOF> que le hiciera pensar que ha llegado al fin del archivo.

En cambio con la opcion Binary copias sin problemas todo el archivo.

Hasta luego
  #6 (permalink)  
Antiguo 02/12/2009, 11:53
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 6 meses
Puntos: 19
Respuesta: Varios archivos en un solo (open binary)

Acabo de probar lo del archivo de texto...

Supongamos que tengo 4 archivos que quiero juntar todos.

Verifico el total de cada uno y genero un archivo donde en primera instancia genero un archivo .txt con la cantidad de archivos y tamaños que hay. Entonces le di 100bytes (aunque el archivo txt pese menos), entonces al "descomprimir" ó "regenerar" el .txt lo genero en 100bytes y al final del archivo me deja espacios libres (por los bytes vacios)...

En fin, de esa forma anda, pero no es lo mas optimo...

Lo idea seria armar archivos .res de recursos osea de la misma forma
  #7 (permalink)  
Antiguo 02/12/2009, 12:26
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Varios archivos en un solo (open binary)

Hola:

Esta es mi idea Inicial, crear un nuevo proyecto con los siguientes controles

1 FileListBox con el nombre por omisión File1 para ver algunos archivos
2 Label como Label1 y Label2 para ver Nombre y Tamaño archivo elegido
1 ListBox con el nombre List1 para mostrar después las cabeceras Comprimidas
1 Boton Command1 para ejecutar la muestra de Cabeceras

Código:
Option Explicit

Private Sub Command1_Click()
  ' El Command Abre el C:\Prueba.tot y muestra los nombres
  List1.Clear
  Dim Posicion As Long
  Dim Nombre As String * 20
  Dim Bytes As String * 10
  Open "C:\Prueba.tot" For Binary As #1
  Posicion = 1
  Do
    Get #1, Posicion, Nombre
    Get #1, Posicion + 20, Bytes
    List1.AddItem Trim$(Nombre) & " " & Trim$(Bytes)
    Posicion = Posicion + 30 + Val(Bytes)
    If Posicion > LOF(1) Then Exit Do
  Loop
  Close #1
End Sub

Private Sub File1_Click()
  ' Click en un fichero del File nos muestra Nombre y Bytes
  Label1 = File1.FileName
  Open Label1 For Input As #1
  Label2 = LOF(1)
  Close #1
End Sub

Private Sub File1_DblClick()
  ' Doble Clic, lo añade al archivo de momento C:\Prueba.tot
  Dim Datos As String
  Open "C:\Prueba.tot" For Binary As #1
  Open File1.Path & "\" & Label1 For Binary As #2
  Datos = Space$(LOF(2))
  Get #2, 1, Datos
  Close #2
  Put #1, LOF(1) + 1, Left$(Label1 & Space$(20), 20) & Right$(Space$(10) & Label2,
10) & Datos
  Close #1
End Sub
De momento es lo básico para empezar con mi idea, si quieres pruébalo y comentamos

Saludos
  #8 (permalink)  
Antiguo 02/12/2009, 23:49
 
Fecha de Ingreso: octubre-2009
Mensajes: 19
Antigüedad: 14 años, 6 meses
Puntos: 1
Respuesta: Varios archivos en un solo (open binary)

Me imagino que lo que quiere hacer es un Joiner.
  #9 (permalink)  
Antiguo 03/12/2009, 04:17
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Varios archivos en un solo (open binary)

Hola:

Jugando un poco con la idea, he creado el siguiente ejemplo.

De momento lo unico que hace es crear el archivo Unificado, deben controlarse posibles errores de tamaño de grandes archivos, extraccion, etc.

Basta con Copiar y pegar el siguiente código en el Bloc de Notas y ponerle la extension .frm al archivo creado.



Código vb:
Ver original
  1. VERSION 5.00
  2. Begin VB.Form Form1
  3.    BorderStyle     =   1  'Fixed Single
  4.   Caption         =   "Form1"
  5.    ClientHeight    =   6615
  6.    ClientLeft      =   45
  7.    ClientTop       =   435
  8.    ClientWidth     =   10335
  9.    LinkTopic       =   "Form1"
  10.    MaxButton       =   0   'False
  11.   ScaleHeight     =   6615
  12.    ScaleWidth      =   10335
  13.    StartUpPosition =   3  'Windows Default
  14.   Begin VB.CommandButton Command3
  15.       Caption         =   "Procesar"
  16.       Enabled         =   0   'False
  17.      Height          =   315
  18.       Left            =   8700
  19.       TabIndex        =   9
  20.       Top             =   420
  21.       Width           =   1575
  22.    End
  23.    Begin VB.CommandButton Command2
  24.       Caption         =   "Quitar"
  25.       Enabled         =   0   'False
  26.      Height          =   315
  27.       Left            =   5940
  28.       TabIndex        =   8
  29.       Top             =   420
  30.       Width           =   1575
  31.    End
  32.    Begin VB.CommandButton Command1
  33.       Caption         =   "Añadir"
  34.       Enabled         =   0   'False
  35.      Height          =   315
  36.       Left            =   4320
  37.       TabIndex        =   7
  38.       Top             =   420
  39.       Width           =   1575
  40.    End
  41.    Begin VB.ListBox List1
  42.       Height          =   5520
  43.       Left            =   4320
  44.       TabIndex        =   6
  45.       Top             =   1020
  46.       Width           =   5955
  47.    End
  48.    Begin VB.FileListBox File1
  49.       Height          =   4185
  50.       Left            =   60
  51.       TabIndex        =   2
  52.       Top             =   2340
  53.       Width           =   4215
  54.    End
  55.    Begin VB.DirListBox Dir1
  56.       Height          =   1890
  57.       Left            =   60
  58.       TabIndex        =   1
  59.       Top             =   360
  60.       Width           =   4215
  61.    End
  62.    Begin VB.DriveListBox Drive1
  63.       Height          =   315
  64.       Left            =   60
  65.       TabIndex        =   0
  66.       Top             =   60
  67.       Width           =   4215
  68.    End
  69.    Begin VB.Label Label4
  70.       BorderStyle     =   1  'Fixed Single
  71.      Height          =   255
  72.       Left            =   4320
  73.       TabIndex        =   10
  74.       Top             =   780
  75.       Width           =   5955
  76.    End
  77.    Begin VB.Label Label3
  78.       Alignment       =   1  'Right Justify
  79.      BorderStyle     =   1  'Fixed Single
  80.      Height          =   255
  81.       Left            =   9180
  82.       TabIndex        =   5
  83.       Top             =   60
  84.       Width           =   1035
  85.    End
  86.    Begin VB.Label Label2
  87.       Alignment       =   2  'Center
  88.      BorderStyle     =   1  'Fixed Single
  89.      Height          =   255
  90.       Left            =   7440
  91.       TabIndex        =   4
  92.       Top             =   60
  93.       Width           =   1695
  94.    End
  95.    Begin VB.Label Label1
  96.       BorderStyle     =   1  'Fixed Single
  97.      Height          =   255
  98.       Left            =   4380
  99.       TabIndex        =   3
  100.       Top             =   60
  101.       Width           =   3015
  102.    End
  103. End
  104. Attribute VB_Name = "Form1"
  105. Attribute VB_GlobalNameSpace = False
  106. Attribute VB_Creatable = False
  107. Attribute VB_PredeclaredId = True
  108. Attribute VB_Exposed = False
  109. Option Explicit
  110.  
  111. Private Sub Drive1_Change()
  112.   ' Cambiamos de Unidad
  113.  On Error GoTo NoDrive
  114.   Dir1.Path = Drive1.Drive
  115.   Dir1.Enabled = True
  116.   File1.Enabled = True
  117.   Exit Sub
  118. NoDrive:
  119.   Dir1.Enabled = False
  120.   File1.Enabled = False
  121.   MsgBox "Unidad no accesible", vbCritical, "Acceso a Unidad"
  122. End Sub
  123.  
  124. Private Sub Dir1_Change()
  125.   ' Cambiamos de Carpeta
  126.  File1.Path = Dir1.Path
  127. End Sub
  128.  
  129. Private Sub File1_Click()
  130.   ' Seleccionamos Archivo
  131.  Label1.Caption = File1.FileName
  132.   If Right$(File1.Path, 1) = "\" Then
  133.     Label1.ToolTipText = File1.Path & File1.FileName
  134.   Else
  135.     Label1.ToolTipText = File1.Path & "\" & File1.FileName
  136.   End If
  137.   Label2.Caption = FileDateTime(Label1.ToolTipText)
  138.   Label3.Caption = FileLen(Label1.ToolTipText)
  139.   ' Si no está en la lista permitirá añadirlo
  140.  Command1.Enabled = False
  141.   Dim i As Integer
  142.   For i = 0 To List1.ListCount - 1
  143.     If List1.List(i) = Label1.ToolTipText Then Exit Sub
  144.   Next
  145.   Command1.Enabled = True
  146. End Sub
  147.  
  148. Private Sub Command1_Click()
  149.   ' Añadimos archivo a la lista
  150.  List1.AddItem Label1.ToolTipText
  151.   Command1.Enabled = False
  152.   Command3.Enabled = True
  153. End Sub
  154.  
  155. Private Sub Command2_Click()
  156.   ' Quitamos archivo de la Lista
  157.  List1.RemoveItem List1.ListIndex
  158.   Command2.Enabled = False
  159.   If List1.ListCount = 0 Then Command3.Enabled = False
  160. End Sub
  161.  
  162. Private Sub Form_Load()
  163.   Label4 = "C:\Prueba.tot"
  164.   ContenidoDestino
  165. End Sub
  166.  
  167. Private Sub List1_Click()
  168.   ' Al seleccionar del List, permitimos eliminarlo
  169.  Command2.Enabled = True
  170. End Sub
  171.  
  172. Private Sub Command3_Click()
  173.   ' Añadimos los archivos
  174.  Dim Datos As String, i As Integer
  175.   If Dir(Label4) <> "" Then Kill Label4
  176.   Open Label4 For Binary As #1
  177.   For i = 0 To List1.ListCount - 1
  178.     Open List1.List(i) For Binary As #2
  179.     Datos = Space$(LOF(2))
  180.     Get #2, 1, Datos
  181.     Close #2
  182.     Put #1, LOF(1) + 1, Left$(List1.List(i) + Space$(128), 128) & Right$(Space$(10) & Len(Datos), 10) & Datos
  183.   Next
  184.   Close #1
  185.   Command3.Enabled = False
  186.   ContenidoDestino
  187. End Sub
  188.  
  189. Private Sub ContenidoDestino()
  190.   ' Contenido del archivo creado
  191.  List1.Clear
  192.   If Dir$(Label4) = "" Then Exit Sub
  193.   Dim Posicion As Long
  194.   Dim Nombre As String * 128
  195.   Dim Bytes As String * 10
  196.   Open Label4 For Binary As #1
  197.   Posicion = 1
  198.   Do
  199.     Get #1, Posicion, Nombre
  200.     Get #1, Posicion + 128, Bytes
  201.     List1.AddItem Trim$(Nombre)
  202.     Posicion = Posicion + 128 + 10 + Val(Bytes)
  203.     If Posicion > LOF(1) Then Exit Do
  204.   Loop
  205.   Close #1
  206. End Sub

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:27.