Problema enviar archivo

Iniciado por Jareth, 1 Abril 2007, 00:41 AM

0 Miembros y 2 Visitantes están viendo este tema.

~~

Cita de: yovaninu en  5 Abril 2007, 17:58 PM
Cita de: E0N en  5 Abril 2007, 12:58 PM
Podias ponerlo, a mi me interesa saber como leer un archivo de 2GB por ej y q el VB no se pete, como lo haces tu?

Justamente esa es la idea mala que tenemos hasta ahora de transferir el archivo, es decir pasar tooooodo el archivo a una variable y despues transferirlo, y claro viene las imaginaciones malevolas por cierto de decir como paso 80GB a una variable sin que el basic se cuelgue, pues no necesariamente debes pasar lo 80GB del archivo a una variable... y este es el secreto... el tamaño archivo se debe dividir en partes (en cuantas sea necesario) y extraer solo esos tamaños o poriones a una variable lo que es mas razonable que pasar todo el archivo a una variable para luego transferirlos, puedes dividirlo en 10, 100, 1000, o 5000 partes y cada pedazo transferirlo sin problemas. Yo un archivo de mas de 100MB lo divido en 4096 partes aunque puedo elegir ese valor.... esto es 104857600 / 4096 = 25600bytes osea casi 25KB, esos 25 kb a una variable y  esa variable se procede a transferir hasta terminar... si sobra bytes tambien eso se controla, este es el secreto que uso, asi que por teoria ningun archivo asi sea este de 100TB no deberia colgar al basic, aunque quien sabe.

Un Saludo.

Si la historia es esa. Yo cuando subo archivos los suele subir de 10 en 10 bits para poner la barra de progreso, pero primero lo leo entero

La cuestion es, al abrir desde VB (open "C:\...) un archivo de 80GB (simplemente usar la orden open) no se te revienta el programa??

yovaninu

mira no se si realmente tendras un archivo de 2GB o 2TB o 1BB, me e tomado la molestia de buscar el archivo mas grande de mi PC y encontré uno de casi 800MB, le puse este código:


Open "E:\Archivos de programa\eMule\Incoming1\3dsmax 500 Modelos y Texturas.zip" For Binary As #1
Close #1
MsgBox "pasó"

y el basic sigue de lo mas normal...  :D


asi que creo que la resp a tu pregunta es que al menos por debajo de 1 GB el open no "revienta" al basic... ¿alquien tiene archivos de mas de 1GB pa probar ;D ;D ;D ;D ;D ;D?

~~

Pero nos vas a decir como leerlo sin q reviente o no?

vivachapas

como hacen para pasar de a 10 bites... o mas o menos.. yo simplemente pongo ws.senddata file... y lo envia como puede.. o como este por defecto...
y como ponen un archivo en varias string... ¿? :huh:

~~

Al obtener el archivo entero piensa q es una cadena xD por lo q puedes trabajar con el como tal:

    For o = 1 To Len(Todo) 'Leemos el archivo de 10 en 10 bit's
        Parte = Mid(Todo, o, 10)
        o = o + 9
        ws.SendData Parte 'Enviamos los 10 bit's
    Next o


todo es el archivo entero  ;)

vivachapas

bien.. creo q lo entendi mas o menos...

CitarParte = Mid(Todo, o, 10)

el 10 es de 10 bites... osea q si quiero pasar de a 5 por ejemplo pongo 5 ¿?

y a este no lo entendi...

Citaro = o + 9

no tendria q ser mas 10¿?

~~

No  :xD pruevalo y veras como tiene q ser 9, si pones 10 pierdes datos. Tambien puedes usar step:

For o = 1 To Len(Todo) step 10
        Parte = Mid(Todo, o, 10)
        ws.SendData Parte 'Enviamos los 10 bit's
Next o


1S4ludo

ZoNike

tengo un problemilla con el codigo.. porfa aber si alguien me puede ayudar.. gracias.

SERVIDOR:

Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
Dim datosS As String
Winsock1.GetData datosS

If Left(datosS, 7) = "archivo" Then
    dato = Split(datosSS, "|") 'una variable dato (dim dato() as string) se encarga de dividir clave, tamaño y ruta
    filesize = dato(1) 'aqui tengo el tamaño enviado por el cliente
    Winsock1.SendData "enviar" 'ahora si le pido al cliente que envie el archivo en si
    datosSS = ""
End If
End Sub

Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim Datos2 As String
Dim datos As String
Winsock2.GetData datos

   Datos2 = Datos2 & datos 'lo que te decia: juntamos parte por parte el archivo que el cliente esta enviando

    If Len(Datos2) = filesize Then 'si termina
      Open App.Path & "nuevoArchivo.jpg" For Binary As #4 'asumo que envias un JPG, sino vas a tener que usar un CommonDialog en el cliente si quieres usar el mismo nombre de archivo que envias del cliente
       Put #4, 1, Datos2
      Close #4
      Datos2 = "" 'vaceas el buffer
      MsgBox "Archivo Recibido con Éxito." 'vuala, aqui termina todo el proceso y depues de esto supongo que tendras que cargar la imagen recibida a un picture, eso ya es tu trabajo.
    End If
End Sub


CLIENTE:

Private Sub Timer2_Timer()

SavePicture Picture1.Image, App.Path + "/temp.bmp"

Open App.Path + "/temp.bmp" For Binary As #1
  filedata = Input(LOF(1), 1) 'en esta variable string cargo todo el archivo
Close #1

filesize = Len(filedata) 'aqui calculo el tamaño de lo que estoy enviando (long) en bytes

If Winsock1.State = "7" Then
Winsock1.SendData "enviar" & "|" & filesize 'envio prmeramente una clave "enviar" luego el tamaño "filesize" y la ruta  "ruta"... (aun no estoy enviando el archivo en si)
End If
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim data As String
Winsock1.GetData data
If data = "enviar" Then
Winsock2.SendData filedata
End If
End Sub


Aqui como lo he puesto esta para que funcione con 2 Winsock pero si me lo podeis explicar con 1 solo muxo mejor, gracias x todo espero respuesta. saludos.

vivachapas

pero q problema tienes?? lo quieres hacer con un solo winsock? q es lo q no entiendes... o yo no te entiendo...

ZoNike

Pues que el codigo en si no me funciona... no recibe nada.