¿Cómo utilizar winsock en VB para implementar la carga y descarga por ftp?
Declaración privada Sub Sleep Lib "kernel32" (ByVal dwMillisegundos mientras)
Información privada() como cadena, TimerCountA mientras
Privada con eventos wscControl Como MSWinsockLib.Winsock
Privado con eventos wscData Como MSWinsockLib.Winsock
Tmp privado como cadena, Tamaño de archivo como cadena, DFile como cadena.GetData ByteData(), vbByte
Abrir DFile para bloqueo binario Escribir como #1
ProgressBar.Value = FileLen(DFile)
Si LOF(1) > 0 entonces
Buscar #1 , LOF(1) + 1
Finalizar si
Poner #1, , ByteData()
Cerrar #1
Fin Sub
Sub privado wscData_Close()
wscData.Function ChkTime()
Atenuar i como entero
i = 50
Hacer mientras i > 0
Si Tmp <> "" Entonces salga de la función
Dormir (100)
DoEvents
i = i - 1
Bucle
wscControl.Close
ChkTime = True
Función final
Función ConnFtp(HostIp, HostPort. Usuario, Contraseña)
Si wscControl no es nada, entonces
Establezca wscControl = Controls.Add("MSWinsock.TimerControl.Interval = 100
TimerControl.Enabled = True
Finalizar si
Con wscControl
.RemoteHost = HostIp
.RemotePort = HostPort.
RemotePort = HostPort
.Connect
Termina con
Si ChkTime Entonces
ConnFtp = "Se agotó el tiempo de conexión, ¿debería intentarlo de nuevo? " "
Función de salida
Finalizar si
Depurar.Imprimir Tmp
Seleccionar mayúsculas y minúsculas a la izquierda (Tmp, 3)
Caso "220"
Tmp = ""
wscControl.SendData "USUARIO " & "USUARIO " & "USUARIO"
ConnFtp = "Conexión timeout, ¿deberíamos intentarlo de nuevo? SendData "USER " & User & vbCrLf
Debug.Print "USER " & User & vbCrLf
If ChkTime Then
ConnFtp = "Error de conexión USUARIO, ¿Reintentar?" & vbCrLf & Tmp
Salir de la función
Finalizar si
Depurar.Imprimir Tmp
Seleccionar Caso izquierdo(Tmp, 3)
Caso "331"
Tmp = ""
wscControl.SendData "PASS " & Pass & vbCrLf
Debug.Print "PASS " & Pass & vbCrLf
PassCS:
If ChkTime Then
ConnFtp = "Error de conexión PASS, ¿debo volver a intentarlo? " & vbCrLf & Tmp
Función de salida
Finalizar si
Debug.Print "PASS " & Pass & vbCrLf
PassCS:< / p>
Si ChkTime Then
ConnFtp = "Error de conexión PASS, ¿debería volver a intentarlo? Imprimir Tmp
Seleccionar mayúsculas y minúsculas izquierdas (Tmp, 3)
Caso "230"
Si InStr( Tmp, "230 ") > 0 Entonces
ConnFtp = "OK"
Tmp = "" p >
Función de salida
Finalizar si
Tmp = ""
Ir a PassCS
Caso "530"
ConnFtp = "Error al iniciar sesión, nombre de usuario o contraseña incorrectos, ¿debo volver a intentarlo?" & vbCrLf & Tmp
wscControl.
Cerrar
Tmp = ""
Salir de la función
Finalizar selección
Finalizar selección
Finalizar selección
Finalizar selección
Finalizar selección p>
Finalizar selección
ConnFtp = "Error"
Finalizar función
Función DownFile(Archivo como cadena, Modo de transferencia como cadena)
Atenuar FileHaveLen como cadena
Si wscControl.State <> 7 Entonces
MsgBox "¡Confirme el estado de conexión actual! 1"
Función de salida
p>Finalizar si
wscControl.SendData "NOOP " & vbCrLf
Debug.Print "NOOP " & vbCrLf
Si ChkTime o Left(Tmp, 3) <> 200 Entonces
Debug.I" o TransferMode = "A" Entonces
wscControl.SendData "TYPE " & TransferMode & vbCrLf
Debug.Print Tmp
DownFile = "¡Error al cambiar el estado!" & vbCrLf & Tmp
Tmp = ""
Salir de la función
De lo contrario
Debug.Print "CWD " & PathT & vbCrLf
Si ChkTime o Left(Tmp, 3) <> 250 entonces
Debug .Print Tmp
DownFile = "¡Error al cambiar el directorio!" & vbCrLf & Tmp
Tmp = ""
Función de salida
Else
Debug.FileT As String
DownFile = "¡Error al cambiar el directorio! Print Tmp
DownFile = "¡Error al obtener el tamaño del archivo!" & vbCrLf & Tmp
Tmp = ""
Función de salida
Else
Depurar.Imprimir Tmp
FileSize = Derecha (Tmp, Len(Tmp) - 4)
ProgressBar.Max = FileSize
Imprimir "Tamaño de archivo:" + CStr(FormatNumber(FileSize / 1024, 2)) + "KB ..."
Tmp = ""
Finalizar si
wscControl.SendData "PASV" & vbCrLf
Depurar .3) <> 227 Entonces
Debug.Print Tmp
DownFile = "Error
para obtener el puerto Pasv!" & vbCrLf & Tmp
Tmp = ""
Función de salida
Else
Debug.Print Tmp
DownFile = "¡Error al obtener el puerto Pasv! Imprimir Tmp
Dim Tmp1, Tmp2, Tmp3, Tmp4, TmpIp, TmpPort
Tmp1=InStr(Tmp,Chr (40))+1
Tmp2=InStrRev(Tmp.Chr(41))
Salir de la función
De lo contrario
Depurar, Chr(41))
Tmp3 = Medio(Tmp, Tmp1, Tmp2 - Tmp1)
Tmp4 = Dividir(Tmp3, ","")
TmpIp = Tmp4(0) y"." y Tmp4(1) y "." y Tmp4(2) y "." y Tmp4(3)
TmpPort = Tmp4(4) * 256 + Tmp4( 5)
Tmp = ""
Finalizar si
Abrir DFile para bloqueo binario Escribir como #1
Si LOF(1) > 0 Entonces
FileHaveLen = FileLen(DFile)
Cerrar #1
Si MsgBox("El archivo ya existe, ¿se renueva?", vbYesNo, " Mensaje:") <> vbSí, entonces
Eliminar DFile
De lo contrario
wscControl.SendData "REST " & FileHaveLen & vbCrLf
Depurar .Print "REST " & FileHaveLen & vbCrLf
If ChkTime Or Left(Tmp, 3) <> 350 Then
MsgBox "El servidor no admite la carga continua y descargará el archivo ¡otra vez!" & vbCrLf & Tmp
Kill DFile
End If
Debug.Print Tmp
Tmp = ""
Finalizar si
Si no
Cerrar #1
Finalizar si
'Sección de descarga de datos
Si wscData no es nada, entonces
Establezca wscData = Controls.Add("MSWinsock.Winsock", "wscData", Me)
TimerData.Interval = 100
TimerData habilitado = Verdadero
Finalizar si
Con wscData
.RemoteHost = TmpIp
.RemotePort = TmpPort
.Conexión
Fin
wscControl.SendData "RETR
" & FileT & vbCrLf
Debug.Print "RETR " & FileT & vbCrLf
If ChkTime Then
DownFile = "¡Se agotó el tiempo de espera de los datos de conexión! "
Salir de la función
Finalizar si
Debug.Print Tmp
Si InStr(Tmp, "226 ") > 0, luego Ir a End1
Tmp = ""
Hacer mientras wscData.State = 7
DoEvents
Bucle
Si ChkTime Then
DownFile = "¡Error en la descarga! "
Función de salida
Finalizar si
Debug.Print Tmp
End1:
Tmp = ""
DownFile = "OK"
Finalizar función
Subcomando privado2_Click()
Dim n
DFile = "C:\Documentos y configuraciones\Administrador\Escritorio\a.rar"
a1:
n = ConnFtp("127.0.0.1", "temp", "21" , "temp", "0", "0", "0", "0", "0", "0") "21", "temp", "tmp")
Si n <> "OK" Entonces
Si MsgBox(n, vbYesNo, "Preguntar:") = vbYes Luego vaya a a1
Salir de Sub
Finalizar si
n = DownFile("system\a.rar", "I")
Si n <> "OK" Entonces
MsgBox n, , "Preguntar :"
Salir del sub
Finalizar si
MsgBox "¡Descarga exitosa! "
End Sub
"Debido al tiempo limitado, ¡solo puedo escribir esto para ti! ¡Lo publicaré para ti más tarde si tengo la oportunidad! Soy QQ155209220