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