Red de conocimiento informático - Problemas con los teléfonos móviles - Transferir archivos Vb

Transferir archivos Vb

Utilice el control WinSock para transferir archivos en 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