本文目录一览:
- 1、vb如何上传文件到指定ftp?
- 2、vb传输文件
- 3、VB WINSOCK传文件
- 4、VB中如何实现上传文件的功能?
- 5、怎么用vb编一个能把电脑里的文件发送出去的程序
- 6、如何用VB实现数据文件传输? 最好有代码和窗口或者注明有哪些控件
vb如何上传文件到指定ftp?
最简单的方法是用ftp批处理,代码如下
open app.path "\ftpcmd.ftp" for output as #1 '创建一个ftp命令文件
print #1, "open " "IP" '打开ftp服务器
print #1, "user " "用户名"
print #1, "pass " "密码"
print #1, "lcd " "本地文件路径" '指定本地文件所在目录
print #1, "put " "文件名"
close #1 'frp命令文件写完了
shell "ftp -n -s:" app.path "\ftpcmd.ftp" '调用系统ftp,并执行上面写的ftpcmd.ftp
vb传输文件
VB中使用WinSock控件传送文件
传送文件对于网络编程来说是基本的功能,比如远程控制软件。在编制一个软件时,我从网上下了很多传文件的程序,这些程序提供的传文件功能根本就不能用。传文本还可以,传二进制文件根本就不行。因此,作为一个基本的功能模块,有必要单独介绍一下。 -vb传文件
首先,在VB中要传送字符串,你可以这样写:
Dim strData As String
strData = "Test"
Winsock1.SendData strData
但是如果你传送的二进制文件,你还能用String变量来存放吗?从理论上分析是不行的,我也做了实验,确实是不行的。文件虽然可以传,但是接受的文件和发送的不一样,原因可能是二进制文件里可以有任何"字符",但是不是所有的字符都可以放在String变量里。 -vb传文件
除了String类型的变量,VB中其他类型的变量都只有几个字节长,难道一次只能发几个字节吗?那样岂不是要累死机器了!其实,情况没有那么悲观,我们完全可以使用数组来解决这个问题,就是使用byte数组。把要传送的文件都读到数组里,然后发送出去。程序如下: -vb传文件
FileName 为要传送的文件名,WinS为发送文件的WinSock控件。这是一个发送端的程序。
Public Sub SendFile(FileName As String, WinS As Winsock)
Dim FreeF As Integer '空闲的文件号
Dim LenFile As Long '文件的长度
Dim bytData() As Byte '存放数据的数组
FreeF = FreeFile '获得空闲的文件号
Open FileName For Binary As #FreeFile '打开文件
DoEvents
LenFile = LOF(FreeF) '获得文件长度
ReDim bytData(1 To LenFile) '根据文件长度重新定义数组大小
Get #FreeF, , bytData '把文件读入到数组里
Close #FreeF '关闭文件
WinS.SendData bytData '发送数据
End Sub
接受端的程序如下:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim bytData() As Byte
Dim f
f = FreeFile
Open strFileName For Binary As #f
ReDim bytData(1 To bytesTotal)
Winsock1.GetData bytData
Put #f, i, bytData
i = i + bytesTotal '保证每次写都是在文件的末尾, i是个全局变量
Close #f
End Sub
这里有两个需要注意的地方,ReDim Preserve bytData(1 To LenFile),下标是从1开始的,如果你写成ReDim bytData( LenFile),下标就是从0开始了,数组就有LenFile+1长了。LenFile = LOF(FreeFile)中的LOF是获得文件长度的函数,是VB里带的,我见过很多例子用API,或者循环的读直到末尾来获取文件长度,这样都是很麻烦的,使用LOF函数就可以了。 -vb传文件
这样的程序,即可以传送文本文件,也可以传送二进制文件。但是你有没有发现这个程序的问题呢?如果我要传送一个50M的文件呢?系统可以为bytData分配50M的内存空间吗?
于是笔者拿一个50M的文件做实验吧,接收到的文件和原来的文件不一样,比原来的大。问题出在那呢?
首先,根据文件大小重新定义bytData数组的大小本身就有问题,系统是不可能无限制的给数组分配空间的,即使可以,也会造成系统响应变慢。在传50M文件的时候,系统就跟死机了一样。那么怎么解决这个问题呢,一个自然的想法就是把数据分段传送。程序如下: -vb传文件
发送程序, iPos是个全局变量,初始值为0。这个变量保存着当前数据的位置。Const iMax = 65535是每个数据块的大小。
dim ipos as long
Const iMax = 65535
Dim FreeF As Integer '空闲的文件号
Dim LenFile As Long '文件的长度
Dim bytData() As Byte '存放数据的数组
FreeF = FreeFile '获得空闲的文件号
Open FileName For Binary As #FreeF '打开文件
DoEvents
LenFile = LOF(FreeF) '获得文件长度
If LenFile = iMax Then '如果要发送的文件小于数据块大小,直接发送
ReDim bytData(1 To LenFile) '根据文件长度重新定义数组大小
Get #FreeF, , bytData '把文件读入到数组里
Close #FreeF '关闭文件
WinS.SendData bytData '发送数据
Exit Sub
End If
'文件大于数据块大小,进行分块发送
Do Until (iPos = (LenFile - iMax)) '发送整块数据的循环
ReDim bytData(1 To iMax)
Get #FreeF, iPos + 1, bytData
WinS.SendData bytData
iPos = iPos + iMax '移动iPos,使它指向下来要读的数据
Loop
'这里要注意的是,必须检查文件有没有剩下的数据,如果文件大小正好等于数据块大小的
' 整数倍,那么就没有剩下的数据了
ReDim bytData(1 To LenFile - iPos) '发送剩下的不够一个数据块的数据
Get #FreeF, iPos + 1, bytData
WinS.SendData bytData
Close #FreeF
下面是接收端的程序:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim bytData() As Byte
Dim lLenFile As Long
Dim f
f = FreeFile
Open strFileName For Binary As #f 'strFileName是文件名
lLenFile = LOF(f)
ReDim bytData(1 To bytesTotal)
Winsock1.GetData bytData
If lLenFile = 0 Then 'lLenFile=0表示是第一次打开文件,这里有个问题,就是'如果如果该文件存在的话,就会出错,应该在打开前检查文件是否存在。(这里我省略了)
Put #f, 1, bytData
Else
Put #f, lLenFile + 1, bytData
End If
Close #f
End Sub
VB WINSOCK传文件
1.创建一个新的标准EXE文件; 2.加入一个Winsock控件; 3.加入如下代码: Private Sub Form Load() tcpServer.LocalPort = 1001 tcpServer.Localhost = ″servser″ tcpServer.remotePort = 1002 tcpServer.Localhost = ″klint″ tcpServer.Listen End Sub ′连接检查 Private Sub tcpServer ConnectionRequest (ByVal requestID As Long) If tcpServer.State sckClosed Then tcpServer.Close tcpServer.Accept requestID End Sub ′发送数据 Private Sub frmserver monsemove(x,y) tcpServer.SendData ″x″ str(x) tcpServer.SendData ″y″ str(y) End Sub 1.创建一个新的标准EXE文件; 2.加入一个Winsock控件; 3.加入两个TEXT框—— txt x和 txt y; 4.加入如下代码: Private Sub Form Load() tcpServer.LocalPort = 1002 tcpServer.Localhost = ″klint″ tcpServer.remotePort = 1001 tcpServer.Localhost = ″servser″ tcpServer.Listen End Sub ′连接检查 Private Sub tcpklint ConnectionRequest (ByVal requestID As Long) If tcpklint.State sckClosed Then tcpklint.Close tcpklint.Accept requestID End Sub Private Sub tcpClient DataArrival (ByVal bytesTotal As Long) Dim strData As String tcpklint.GetData strData if left(strData,1)=″X″then txt x.Text = strData else txt y.Text = strData endif End Sub 以上例程实现的是一个非常简单的点对点通信,在此基础上略加改造,可以形成功能复杂的实时计算机网络A-A交互通信系统,用于控制、图形仿真等。 使用UDP协 议建立对等通信和通过TCP建立客户/服务器通信的方法略有不同,它不需要建立客户和服务器,而是建立对等通信 1.设定Winsock的RemoteHost 属性为一个通信的计算机名称; 2.设定 RemotePort 为一个接口号; 3.调用Winsock的Bind 事件绑定本地的接口号。具体设定方法为: Private Sub Form Load() With Winsock1 .RemoteHost= ″PeerB″ .RemotePort = 1001 ′远程连接号 .Bind 1002 ′绑定的本地号 End With End Sub-vb传文件
VB中如何实现上传文件的功能?
用script脚本 直接调用 FTP 命令实现上传文件到FTP服务器。
代码如下:
'定义API函数
Const SYNCHRONIZE = H100000
Const INFINITE = HFFFFFFFF
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long-vb传文件
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long-vb传文件
Private Sub Command1_Click()
Dim filename As String
Dim ftp As String
Dim uname As String
Dim upin As String
ftp = InputBox("请输入服务器地址")
uname = InputBox("请输入帐号", , "anonymous")
upin = InputBox("请输入密码", , "IE@User")
filename = Timer() '取时间为文件名filename
Open filename ".script" For Output As #1 '生成filename.script脚本,传输FTP用
Print #1, "user"
Print #1, uname
Print #1, upin
Print #1, "pwd"
Print #1, "hash"
Print #1, "put " filename ".txt"
Print #1, "quit"
Close #1
Open filename ".txt" For Output As #1 '生成的filename.txt保存了combo1和text1的文字
Print #1, Text1.Text
Print #1, Combo1.Text
Close #1
DoEvents
'调用ftp命令传输,不需要inet或winsock控件
Dim pId As Long, pHnd As Long
pId = Shell("ftp -n -s:" filename ".script" " " ftp, vbHide)
pHnd = OpenProcess(SYNCHRONIZE, 0, pId)
If pHnd 0 Then
Call WaitForSingleObject(pHnd, INFINITE)
Call CloseHandle(pHnd)
End If
Kill filename ".script" '因为script脚本保存了帐号和密码,当传输完成后删除filename.script脚本
End Sub
怎么用vb编一个能把电脑里的文件发送出去的程序
先去这个地址下载Winsock控件:
然后添加一个Winsock1到窗体上。然后写代码。
【发送端】代码:
连接代码:
Winsock1.Close
Winsock1.Connect "127.0.0.1", 5000 '这里5000可以自定义。IP设为便于本地调试
发送代码:
Dim a() As Byte
If Winsock1.State = sckClosed Then
MsgBox "服务端连接失败", vbCritical, "警告"
Exit Sub
End If
'-----------------
send_filename = "C:\fasong.exe" '发送的文件名
Open send_filename For Binary As #1
If LOF(1) = 1000 Then '判断载入文件的大小,如果小于1000直接发送
ReDim a(LOF(1) - 1) As Byte
Get #1, , a
Winsock1.SendData a
Close
Exit Sub
End If
If LOF(1) 1000 Then '如果大于1000
lump = LOF(1) \ 1000 '切割的块数
left_lump = LOF(1) Mod 1000 '剩下的文件的大小
For i = 1 to lump
ReDim a(1 To 1000) As Byte
Get #1, , a
Winsock1.SendData a
Next
End If
If left_lump 0 Then '如果剩下文件大小大于0字节
ReDim a(1 To left_lump) As Byte
Get #1, , a
Winsock1.SendData a '发送文件
End If
Close
'--------------------------------------------------------
Close
接收端添加一个Winsock1。代码:
If Winsock1.State = sckClosed Then
Winsock1.LocalPort = 5000
Winsock1.Listen
ElseIf Winsock1.State = sckConnected Then
End If
在Winsock1的ConnectionRequest事件中这样写:
On Error Resume Next
Winsock1.Close
Winsock1.Accept requestID
在Winsock1的DataArrival事件中这样写:
On Error Resume Next
DoEvents '防止卡死
Dim a() as Byte
accept_filename = "d:\accept.exe" '接收后的文件名
Open accept_filename for binary as #1
If LOF(1) = 0 Then '如果接收到的是新文件
ReDim a(bytesTotal - 1) '必须减1 因为数组默认下标为0
Winsock1.GetData a
Put #1, 1, a '第一次写在1的位置
Else '如果是文件剩下的部分
ReDim a(bytesTotal - 1)
Winsock1.GetData a
Put #1, LOF(1) + 1, a '从第二次开始就将读写文件的指针往后移动一个字符,再写入数据。 '如果不往后移动指针(+1)的话,新的数据会覆盖掉前面的数据-vb传文件
End If
Close
如何用VB实现数据文件传输? 最好有代码和窗口或者注明有哪些控件
用winsock控件
以二进制方式打开文件
open file for binary
一次发送特定字节(编码:头几个或十几个字节用于控制、比如控制发送文件内容、文件名、发送序列等)
Winsock发送端要设置好协议(UPD或TCP)、远程IP、端口
接收端设置好协议和端口监听、
收到时解码(解出文件名、内容字节、写入字节位置等)并写出文件。