Red de conocimiento informático - Conocimiento informático - Cómo escribir un programa VB que pueda transferir archivos

Cómo escribir un programa VB que pueda transferir archivos

Utilice el control WinSock en VB para transferir archivos.

La transferencia de archivos es una función básica para la programación de redes, como el software de control remoto. Al compilar un software, descargué muchos programas de transferencia de archivos de Internet, pero las funciones de transferencia de archivos proporcionadas por estos programas no se podían utilizar en absoluto. Está bien transferir texto, pero no es posible transferir archivos binarios en absoluto. Por tanto, como módulo funcional básico, es necesario introducirlo por separado.

Primero, para transferir una cadena en VB, puedes escribir así:

Dim strData As String

strData = "Test"

Winsock1.SendData strData

Pero si envías un archivo binario, ¿aún puedes usar una variable String para almacenarlo? El análisis teórico no es posible. También he hecho experimentos y de hecho no es posible. Aunque los archivos se pueden transferir, los archivos recibidos son diferentes de los enviados. La razón puede ser que los archivos binarios pueden tener cualquier "caracter", pero no todos los caracteres se pueden colocar en variables de cadena.

A excepción de las variables de tipo String, otros tipos de variables en VB tienen solo unos pocos bytes de longitud. ¿Solo se pueden enviar unos pocos bytes a la vez? ¿No agotaría eso la máquina? De hecho, la situación no es tan pesimista. Podemos usar matrices completamente para resolver este problema, es decir, usar matrices de bytes. Lea todos los archivos que se transmitirán a la matriz y luego envíelos. El programa es el siguiente:

FileName es el nombre del archivo a transferir y WinS es el control WinSock utilizado para enviar el archivo. Este es un programa de remitente.

Public Sub SendFile(FileName As String, WinS As Winsock)

Dim FreeF As Integer 'Número de archivo libre

Dim LenFile As Long 'La longitud del file

Dim bytData() As Byte 'Matriz para almacenar datos

FreeF = FreeFile 'Obtener el número de archivo gratuito

Abrir nombre de archivo para binario como #FreeFile ' Abrir archivo

DoEvents

LenFile = LOF(FreeFile) 'Obtener la longitud del archivo

ReDim bytData(1 To LenFile) 'Redefinir el tamaño de la matriz según el longitud del archivo

p>

Obtener #FreeFile, , bytData 'Leer el archivo en la matriz

Cerrar #FreeFile 'Cerrar el archivo

WinS. SendData bytData 'Enviar datos

End Sub

El programa en el extremo receptor es el siguiente:

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim bytData() como byte

Dim f

f = FreeFile

Abrir strFileName para binario como #f

ReDim bytData(1 To bytesTotal)

Winsock1.GetData bytData

Pon #f, i, bytData

i = i + bytesTotal 'Garantiza que cada escritura sea al final del archivo, i es una variable global

Close #f

End Sub

Hay dos cosas a tener en cuenta aquí, ReDim Preserve bytData( 1 a LenFile), el subíndice comienza desde 1, si escribe como ReDim bytData (LenFile), el subíndice comienza desde 0 y la matriz tiene una longitud de LenFile+1. El LOF en LenFile = LOF(FreeFile) es una función para obtener la longitud del archivo. Está incluida en VB. He visto muchos ejemplos usando API o leyendo en un bucle hasta el final para obtener la longitud del archivo. Utilice la función LOF. Eso es todo.

Un programa de este tipo puede transmitir tanto archivos de texto como archivos binarios. ¿Pero has encontrado algún problema con este programa? ¿Qué pasa si quiero transferir un archivo de 50M? ¿Puede el sistema asignar 50 M de espacio de memoria para bytData?

Entonces el autor tomó un archivo de 50M como experimento. El archivo recibido era diferente del archivo original y era más grande que el 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 tiene sus propios problemas. Es imposible que el sistema asigne espacio a la matriz sin límite. Incluso si puede, lo hará. hacer que el sistema responda lentamente. Al transferir un archivo de 50 M, el sistema pareció congelarse. Entonces, ¿cómo solucionar este problema? Una idea natural es transmitir los datos en segmentos. El programa es el siguiente:

Programa de envío, 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 'Número de archivo libre

Dim LenFile As Long 'Longitud del archivo

Dim bytData() As Byte 'Matriz para almacenar datos

FreeF = FreeFile 'Obtener el número de archivo gratuito

Abrir nombre de archivo para binario como #FreeF 'Abrir el archivo

DoEvents

LenFile = LOF (FreeF) 'Obtener la longitud del archivo

Si LenFile <= iMax Entonces 'Si el archivo a enviar es más pequeño que el tamaño del bloque de datos, envíelo directamente

ReDim bytData( 1 A LenFile) 'Según el archivo La longitud redefine el tamaño de la matriz

Obtener #FreeF, , bytData 'Leer el archivo en la matriz

Cerrar #FreeF 'Cerrar el archivo

WinS.SendData bytData 'Enviar datos

Salir Sub

End If

'El archivo es más grande que el tamaño del bloque de datos, envíe en trozos

Hacer hasta (iPos >= (LenFile - iMax)) 'Bucle para enviar el bloque completo de datos

ReDim bytData(1 To iMax)

Obtener #FreeF, iPos + 1, bytData

WinS.SendData bytData

iPos = iPos + iMax 'Mueve iPos para que apunte a los datos a leer

Bucle

' Cosas a tener en cuenta aquí Sí, debe verificar si quedan datos en el archivo si el tamaño del archivo es exactamente igual a

' un número entero. múltiplo del tamaño del bloque de datos, entonces no quedan datos

ReDim bytData( 1 To LenFile - iPos) 'Envía los datos restantes que no son suficientes para un bloque de datos

Obtenga #FreeF, iPos + 1, bytData

WinS.SendData bytData

Cerrar #FreeF

El siguiente es el programa en el extremo receptor:

Sub privado Winsock1_DataArrival(ByVal bytesTotal mientras)

Atenuar bytData() como byte

Atenuar lLenFile mientras

Atenuar f

f = FreeFile

Abrir strFileName para binario como #f 'strFileName es el nombre del archivo

lLenFile = LOF(f)

ReDim bytData(1 A bytesTotal)

Winsock1.GetData bytData

Si lLenFile = 0 Entonces 'lLenFile=0 significa que esta es la primera vez que se abre un archivo. Hay un problema aquí, es decir, si el archivo existe, se producirá un error. Debe verificar si el archivo existe antes de abrirlo. (Lo omití aquí)

Pon #f, 1, bytData

De lo contrario

Pon #f, lLenFile + 1, bytData

Finalizar si

Cerrar #f

Finalizar sub