Transferir archivos Vb
La transmisión de archivos es una función básica de la programación de red, como el software de control remoto. Cuando estaba escribiendo un software, descargué muchos programas de transferencia de archivos de Internet, pero las funciones de transferencia de archivos proporcionadas por estos programas no fueron útiles en absoluto. Es posible enviar texto, pero es imposible enviar archivos binarios. Por tanto, como módulo funcional básico, es necesario introducirlo por separado.
Primero, pasa una cadena en VB, puedes escribir así:
Dim strData como una cadena
strData = "Test"
Winsock1. Enviar datos strData
Pero si envía un archivo binario, ¿aún se puede almacenar en una variable de cadena? Teóricamente es imposible. También he hecho experimentos y es realmente imposible. Aunque el archivo se puede transferir, el archivo recibido es diferente del archivo enviado. La razón puede ser que puede haber cualquier "carácter" en un archivo binario, pero no todos los caracteres se pueden colocar en una variable de cadena.
A excepción de las variables de cadena, otros tipos de variables en VB tienen solo unos pocos bytes de longitud. ¿Puedo enviar sólo unos pocos bytes a la vez? ¿Eso no mataría la máquina? De hecho, la situación no es tan pesimista. Podemos resolver completamente este problema usando matrices, es decir, usando matrices de bytes. Lea todos los archivos que se transferirán a la matriz y envíelos. El proceso es el siguiente:
FileName es el nombre del archivo a transferir y WinS es el control WinSock que envía el archivo. Este es un programa de envío.
Archivo de subenvío público (el nombre del archivo es una cadena, WinS es Winsock)
Dim FreeF As Integer 'Número de archivo libre
Dim LenFile as Long' archivo longitud.
Atenuar bytData() como una matriz de bytes utilizada para almacenar datos.
Consigue el número de expediente gratuito.
Abra un archivo con el nombre de archivo binario como #archivolibre'.
Múltiples actividades
LenFile = LOF(FreeF)' para obtener la longitud del archivo.
ReDim bytData(1 To LenFile)'Redefine el tamaño de la matriz según la longitud del archivo.
Obtener #FreeF,, bytData 'Lee el archivo en una matriz.
"Cerrar #FreeF" cierra el archivo.
Ganó. SendData bytData 'Enviar datos.
Conector final
El proceso del extremo receptor es el siguiente:
Private Sub Winsock 1 _ llegada de datos (ByVal bytes total As Long)
Dim bytData() para bytes
dim f
f = archivo libre
Abrir strFileName del archivo binario como #f
ReDim bytData(1 a bytesTotal)
Winsock1. Obtener datos en bytes
Ponga #f, I, bytData
' I = i+bytesTotal ' Asegúrese de que cada escritura esté al final del archivo, I es una variable global.
Cerrar #f
Conector final
Hay dos lugares a los que prestar atención, redim preservar mediante tdata (1 al archivo len), el subíndice comienza desde 1. Si escribe ReDim bytData (LenFile), el subíndice comienza desde 0 y la longitud de la matriz es LenFile+1. LenFile = LOF(FreeFile) LOF es una función que obtiene la longitud de un archivo y viene con VB. He visto muchos ejemplos de uso de API o bucles para leer hasta el final para obtener la longitud del archivo, lo cual es muy problemático. Simplemente use la función LOF.
Un programa de este tipo puede transferir archivos de texto y archivos binarios.
¿Pero encuentras algún problema con este programa? ¿Qué debo hacer si quiero enviar un archivo de 50M? ¿Puede el sistema asignar 50 M de espacio de memoria para bytData?
Entonces el autor tomó un archivo de 50M para experimentar. El archivo recibido es diferente del archivo original, pero más grande que el archivo original. ¿Cuál es el problema?
En primer lugar, redefinir el tamaño de la matriz bytData en función del tamaño del archivo es problemático en sí mismo. Es imposible que el sistema asigne espacio a la matriz infinitamente, e incluso si pudiera, ralentizaría la respuesta del sistema. Al transferir archivos de 50 millones, el sistema parece fallar. Entonces, ¿cómo solucionar este problema? Una idea natural es transferir datos en segmentos. El proceso es el siguiente:
Remitente, iPos es una variable global con un valor inicial de 0. Esta variable contiene la ubicación de los datos actuales. Const iMax = 65535 es el tamaño de cada bloque de datos.
Dim FreeF As Integer 'FreeFileNumber
Dim LenFile As Long' La longitud del archivo.
Atenuar bytData() como una matriz de bytes utilizada para almacenar datos.
Consigue el número de expediente gratuito.
Abra un archivo con el nombre de archivo binario #FreeF '.
Múltiples actividades
LenFile = LOF(FreeF)' para obtener la longitud del archivo.
If LenFile & lt= iMax Then 'Si el archivo a enviar es más pequeño que el tamaño del bloque, envíelo directamente.
ReDim bytData(1 To LenFile)'Redefine el tamaño de la matriz según la longitud del archivo.
Obtener #FreeF,, bytData 'Lee el archivo en una matriz.
"Cerrar #FreeF" cierra el archivo.
Ganó. SendData bytData 'Enviar datos.
Conector de salida
Terminará si...
El archivo es más grande que el tamaño del bloque de datos, por lo que se envía en fragmentos.
Hasta (iPos > = (LenFile-iMax))' el período hasta que se envía el bloque de datos completo.
ReDim bytData(1 a iMax)
Obtén #FreeF,iPos + 1, byte de datos
Won. Enviar datos bytes data
IPos = iPos+iMax 'Mueve IPos para que apunte al siguiente dato a leer.
Anillo
Lo que hay que tener en cuenta aquí es que hay que comprobar si queda algún dato en el archivo. Si el tamaño del archivo es exactamente igual al tamaño del bloque de datos,
un múltiplo entero, entonces no hay datos.
"redim by tdata(1 to len file-IPOs)" envía los datos restantes que no son suficientes para un bloque.
Obtén #FreeF, iPos + 1, Byte de datos
Ganado. Enviar datos en bytes
Cerrar #FreeF
El siguiente es el programa del receptor:
Private Sub Winsock 1 _ llegada de datos (ByVal bytes total As Long )
Dim bytData() para bytes
Dim lLenFile para Long
Dim f
f = archivo libre
Abra el archivo binario strfilename, porque # f' strfilename es el nombre del archivo.
LunFile = LOF(Mujer)
ReDim bytData(1 a bytesTotal)
Winsock1. Obtener datos en bytes
Si lLenFile = 0, entonces "lLenFile=0" significa que esta es la primera vez que se abre el archivo.
Hay un problema aquí, es decir, "Si el archivo existe, se producirá un error. Debe verificar si el archivo existe antes de abrirlo". (Omitido aquí)
Ponga #f, 1, byte de datos
Otros
Ponga #f, lLenFile + 1, bytData
Finalizar si...
Cerrar#f
Finalizar conector