#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
;以上是加载窗体控件所需头文件
#Include <GuiListView.au3>
#include <GuiEdit.au3>
#Include <FTPEx.au3>
#include <Misc.au3>;检查按键是否被按下头文件
#include <Array.au3>
;以上是加载其他头文件
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("FTP_Tools", 786, 485, 219, 255)
$Label1 = GUICtrlCreateLabel("用户名", 13, 32, 45, 20)
$Input1 = GUICtrlCreateInput("test", 64, 28, 97, 24)
$Input2 = GUICtrlCreateInput("111111", 228, 28, 89, 24)
$Label2 = GUICtrlCreateLabel("密码", 173, 31, 45, 20)
$Label3 = GUICtrlCreateLabel("IP", 332, 31, 45, 20)
$IPAddress1 = _GUICtrlIpAddress_Create($Form1,360, 30, 180, 20)
_GUICtrlIpAddress_Set($IPAddress1, "127.0.0.1")
$Label4 = GUICtrlCreateLabel("端口", 550, 31, 45, 20)
$Input3 = GUICtrlCreateInput("21", 590, 27, 65, 24)
$Button1 = GUICtrlCreateButton("连接", 663, 23, 50, 33)
$Button12 = GUICtrlCreateButton("断开", 720, 23, 50, 33)
$Group1 = GUICtrlCreateGroup("信息区域", 16, 168, 753, 281)
$ListView1 = GUICtrlCreateListView("文件路径", 411, 192, 337, 241,-1)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 300)
$Edit1 = GUICtrlCreateEdit("", 40, 192, 230, 252)
GUICtrlSetData(-1, "logo..." & @CRLF)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label5 = GUICtrlCreateLabel("要下载的路径", 30, 90, 97, 33)
$Label10 = GUICtrlCreateLabel("状态:空闲中...", 15, 453, 550, 25,-1, $WS_EX_CLIENTEDGE)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$Input4 = GUICtrlCreateInput("www", 126, 85, 521, 24)
$Label6 = GUICtrlCreateLabel("要上传的路径", 30, 130, 97, 33)
$Input5 = GUICtrlCreateInput("", 127, 126, 521, 24)
$Button4 = GUICtrlCreateButton("下载目录", 668, 80, 97, 33)
$Button5 = GUICtrlCreateButton("O(∩_∩)O~)", 668, 120, 97, 33)
$Button6 = GUICtrlCreateButton("进入文件夹", 300, 190, 95, 33)
GUICtrlSetState ( $Button6, $GUI_DISABLE);使按钮暂时不可以使用
$Button7 = GUICtrlCreateButton("退后一步", 300, 233, 97, 33)
GUICtrlSetState ( $Button7, $GUI_DISABLE);使按钮暂时不可以使用
$Button8 = GUICtrlCreateButton("下载文件", 300, 275, 97, 33)
GUICtrlSetState ( $Button8, $GUI_DISABLE);使按钮暂时不可以使用
$Button9 = GUICtrlCreateButton("上传文件", 300, 318, 97, 33)
GUICtrlSetState ( $Button9, $GUI_DISABLE);使按钮暂时不可以使用
$Button10 = GUICtrlCreateButton("删除文件", 300, 360, 97, 33)
GUICtrlSetState ( $Button10, $GUI_DISABLE);使按钮暂时不可以使用
$Button11 = GUICtrlCreateButton("重命名文件", 300, 402, 97, 33)
GUICtrlSetState ( $Button11, $GUI_DISABLE);使按钮暂时不可以使用
$jindu = GUICtrlCreateProgress(570, 455, 200, 20, $PBS_SMOOTH)
GUISetState(@SW_SHOW)
;OnAutoItExitRegister("quit");注册一个程序退出时运行的函数
GUICtrlSetState ( $Button12, $GUI_DISABLE);使断开键暂时不可用直到连接成功或者失败
#EndRegion ### END Koda GUI section ###
;以上创建GUI,创建控件
;下面是主循环
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE ;关闭窗口
Exit;退出
Case $Button1;按下连接键
GUICtrlSetState ( $Button1, $GUI_DISABLE);使连接键暂时不可用直到连接成功或者失败
Local $server = _GUICtrlIpAddress_Get($IPAddress1);获取主机地址
Local $username = GUICtrlRead ($Input1);获取用户名
Local $passwrod = GUICtrlRead ($Input2);获取密码
Local $prot = GUICtrlRead ($Input3);获取端口信息
;MsgBox(48,"提示!",$server)
If $username = "" Then ;验证用户名
MsgBox(48,"提示!","请输入用户名")
GUICtrlSetState ( $Button1, $GUI_ENABLE);恢复连接按钮状态为可用
ContinueLoop
EndIf
;~ If $passwrod = "" Then ;验证密码
;~ MsgBox(48,"提示!","请输入密码")
;~ GUICtrlSetState ( $Button1, $GUI_ENABLE);恢复连接按钮状态为可用
;~ ContinueLoop
;~ EndIf
If $server = "0.0.0.0" Then ;验证IP地址
MsgBox(48,"提示!","请输入一个有效的主机地址")
GUICtrlSetState ( $Button1, $GUI_ENABLE);恢复连接按钮状态为可用
ContinueLoop
EndIf
GUICtrlSetState ( $Button1, $GUI_DISABLE);使连接键暂时不可用直到连接成功或者失败
_GUICtrlEdit_AppendText($Edit1, "获取用户信息..." & @CRLF);日志
$ftp_open = _FTP_Open("myftp");创建一个FTP会话
If $ftp_open = 0 Then;判断创建会话是否成功
_GUICtrlEdit_AppendText($Edit1, "创建一个FTP会话失败" & @CRLF);日志
GUICtrlSetState ( $Button1, $GUI_ENABLE);恢复连接按钮状态为可用
ContinueLoop
EndIf;结束判断
_GUICtrlEdit_AppendText($Edit1, "打开一个FTP会话..." & @CRLF);日志
$ftp_connect =_FTP_Connect($ftp_open,$server, $username, $passwrod,$prot);建立一个连接
If $ftp_connect = 0 Then;判断连接成功或者失败
_GUICtrlEdit_AppendText($Edit1, "建立一个FTP连接失败" & @CRLF);日志
GUICtrlSetState ( $Button1, $GUI_ENABLE);恢复连接按钮状态为可用
ContinueLoop
EndIf;判断结束
_GUICtrlEdit_AppendText($Edit1, "建立一个FTP连接..." & @CRLF);日志
$liebiao = _Ftp_ListToArray($ftp_connect,0,$INTERNET_FLAG_RESYNCHRONIZE);获取当前远程目录名称和文件名称
Local $i;声明局部变量
For $i = 1 To $liebiao[0];for 循环开始
GUICtrlCreateListViewItem ( $liebiao[$i],$ListView1);将目录列表更新到列表
Next;for循环结束
_GUICtrlEdit_AppendText($Edit1, "获取远程目录列表并输出到信息栏..." & @CRLF);日志
GUICtrlSetState ( $Button12, $GUI_ENABLE);连接动作完成,恢复断开按钮状态为可用
GUICtrlSetState ( $Button6, $GUI_ENABLE);使按钮可以使用
;GUICtrlSetState ( $Button7, $GUI_ENABLE);使按钮可以使用
GUICtrlSetState ( $Button8, $GUI_ENABLE);使按钮可以使用
GUICtrlSetState ( $Button9, $GUI_ENABLE);使按钮可以使用
GUICtrlSetState ( $Button10, $GUI_ENABLE);使按钮可以使用
GUICtrlSetState ( $Button11, $GUI_ENABLE);使按钮可以使用
GUICtrlSetData($Label10,"状态:服务器已连接")
Case $Button12;按断开接键
$Ftpc = _FTP_Close($ftp_open)
_GUICtrlEdit_AppendText($Edit1, "断开之前的连接..." & @CRLF);日志
_GUICtrlListView_DeleteAllItems($ListView1)
GUICtrlSetState ( $Button12, $GUI_DISABLE);使断开键暂时不可用直到再次连接成功
GUICtrlSetState ( $Button1, $GUI_ENABLE);当前断开,恢复连接按钮状态为可用
GUICtrlSetState ( $Button6, $GUI_DISABLE);使按钮不可以使用
GUICtrlSetState ( $Button7, $GUI_DISABLE);使按钮不可以使用
GUICtrlSetState ( $Button8, $GUI_DISABLE);使按钮不可以使用
GUICtrlSetState ( $Button9, $GUI_DISABLE);使按钮不可以使用
GUICtrlSetState ( $Button10, $GUI_DISABLE);使按钮不可以使用
GUICtrlSetState ( $Button11, $GUI_DISABLE);使按钮不可以使用
GUICtrlSetData($Label10,"状态:服务器已断开")
_EmptyMyScriptMem(@AutoItPID)
Case $Button6;按下进入文件夹
$sis =_GUICtrlListView_GetSelectedCount($ListView1);检查当前被选择的项目数量
If $sis <> 1 Then;判断数量,如果没有选择,则无动作
ContinueLoop
EndIf;结束判断
GUICtrlSetState ( $Button7, $GUI_ENABLE);使按钮可以使用
$si = _GUICtrlListView_GetSelectedIndices($ListView1,True);获取当前选择的项目序列号
$DQMLU_Name =_FTP_DirGetCurrent($ftp_connect);记录当前用户所处的目录位置
$FileName = _GUICtrlListView_GetItemText($ListView1,$si[1]);获取当前选择的文件名称
_GUICtrlListView_DeleteAllItems($ListView1);删除当前列表项目内容
_FTP_DirSetCurrent($ftp_connect,$FileName);设置目录
$NewlistView = _Ftp_ListToArray($ftp_connect,0,$INTERNET_FLAG_RESYNCHRONIZE);获取该目录内的文件列表
For $ii = 1 To $NewlistView[0];for 循环开始
GUICtrlCreateListViewItem ( $NewlistView[$ii],$ListView1);将新的列表更新到列表
Next;for循环结束
GUICtrlSetData($Label10,"状态:进入《" & $DQMLU_Name & "/" & $FileName & " 》文件夹")
;$DQMLU_Name2 =_FTP_DirGetCurrent($ftp_connect);记录当前用户进入目录后所处的目录位置
Case $Button7;按下后退一步按键
$DQMLU_Name2 =_FTP_DirGetCurrent($ftp_connect);记录当前用户当前的位置
;If $DQMLU_Name <> $DQMLU_Name2 Then;对比目录路径
; _GUICtrlListView_DeleteAllItems($ListView1);删除当前列表项目内容
; _FTP_DirSetCurrent($ftp_connect, $DQMLU_Name);设置目录
;$BacklistView = _Ftp_ListToArray($ftp_connect);获取该目录内的文件列表
;For $iii = 1 To $BacklistView[0];for 循环开始
; GUICtrlCreateListViewItem ( $BacklistView[$iii],$ListView1);将新的列表更新到列表
; Next;for循环结束
;Else;否则执行下面的程序
Local $str, $strs;声明变量
$str = StringSplit($DQMLU_Name2, "/");将当前目录使用/进行字符串拆分,以便下面进行筛选
For $s = 1 To $str[0]-1;循环开始,不用最后一个目录名称
$strs = $strs & "/" & $str[$s];重组新的字符串
Next ;循环结束
$strss = StringTrimLeft ( $strs,1);整理新的字符串,使其生成正确的目录名称样式/test/test/....
If $strss = "" Then;判断路径是否退到根目录
$strss = "/";如果是,则将目录路径设定为/
EndIf;结束判断
_GUICtrlListView_DeleteAllItems($ListView1);删除当前列表项目内容
_FTP_DirSetCurrent($ftp_connect, $strss);设置目录
$BacklistViews = _Ftp_ListToArray($ftp_connect,0,$INTERNET_FLAG_RESYNCHRONIZE);获取该目录内的文件列表
For $iiii = 1 To $BacklistViews[0];for 循环开始
GUICtrlCreateListViewItem ( $BacklistViews[$iiii],$ListView1);将新的列表更新到列表
Next;for循环结束
GUICtrlSetData($Label10,"状态:进入《" & $strs & " 》文件夹")
$strs = "";用完后清除路径变量
Case $Button8;按下下载文件按钮
$DLS=_GUICtrlListView_GetSelectedCount($ListView1);检查当前被选择的项目数量
If $DLS <> 1 Then;判断数量,如果没有选择,则无动作
MsgBox(48,"提示!","请选择你要下载的文件")
ContinueLoop
EndIf;结束判断
$DQ_DQ_FileName =_FTP_DirGetCurrent($ftp_connect);获取当前目录路径
$DL_DQ = _GUICtrlListView_GetSelectedIndices($ListView1,True);检索选定项目的索引
$DL_DQ_Name = _GUICtrlListView_GetItemText($ListView1,$DL_DQ[1]);获取当前选择的文件名称
GUICtrlSetData($Label10,"状态:为要下载的文件选择储存路径");更新状态
$save_L_Name = FileSaveDialog( "选择您要保存的位置.", @DesktopDir & "", "所有文件(*.*)",18,$DL_DQ_Name);显示一个文件保存对话框
If @error Then;判断是否选择的有效路径
GUICtrlSetData($Label10,"状态:没有选择一个有效的保存路径,下载任务取消,服务器空闲");状态
ContinueLoop
EndIf;判断结束
GUICtrlSetData($Label10,"状态:正在下载文件《" &$DQ_DQ_FileName & "/" & $DL_DQ_Name & "》中,请等待...");状态
$Download = _FTP_ProgressDownload($ftp_connect, $save_L_Name, $DQ_DQ_FileName & "/" & $DL_DQ_Name,"_UpdateProgress");下载文件
If $Download = 1 Then;判断下载状态
MsgBox(64,"完成","下载完成",2)
ElseIf $Download = -1 Then
MsgBox(48,"提示","下载失败,无法创建本地文件")
ElseIf $Download = -2 Then
MsgBox(48,"提示","下载失败,不能获取远程文件大小")
ElseIf $Download = -3 Then
MsgBox(48,"提示","下载失败,打开远程文件失败")
ElseIf $Download = -4 Then
MsgBox(48,"提示","下载失败,读取远程文件失败")
ElseIf $Download = -5 Then
MsgBox(48,"提示","下载失败,关闭远程文件失败")
ElseIf $Download = -6 Then
MsgBox(48,"提示","下载失败,被调用函数返回的百分比下载失败")
ElseIf $Download = -7 Then
MsgBox(48,"提示","下载失败,本地文件写入失败")
EndIf;判断结束
GUICtrlSetData($Label10,"状态:文件下载完成,服务器空闲");更新状态
GUICtrlSetData($jindu,0);清理进度
Case $Button9;按下上传文件按钮
$DQMLU_Name3 =_FTP_DirGetCurrent($ftp_connect);获取当前目录路径
GUICtrlSetData($Label10,"状态:选择要上传的文件路径");更新状态
$Select_File =FileOpenDialog ( "请选择需要上传的文件", @DesktopDir & "", "所有文件(*.*)" );显示一个文件上传对话框
If @error Then;判断选择路径
GUICtrlSetData($Label10,"状态:没有选择一个有效的路径,任务取消,服务器空闲")
ContinueLoop
EndIf;结束判断
$Upload_FileName = _getfilename( $Select_File)
GUICtrlSetData($Label10,"状态:正在上传文件《" & $Select_File & " 》 请稍后")
$Upload = _FTP_ProgressUpload($ftp_connect, $Select_File,$DQMLU_Name3 & "/" & $Upload_FileName, "_UpdateProgress");开始上传
If $Upload = 1 Then;判断上传结果并给出提示
MsgBox(64,"提示","文件上传成功",2)
ElseIf $Upload = -3 Then
MsgBox(48,"提示","创建文件失败")
ElseIf $Upload = -4 Then
MsgBox(48,"提示","写文件失败 ")
ElseIf $Upload = -5 Then
MsgBox(48,"提示","关闭文件失败")
ElseIf $Upload = -6 Then
MsgBox(48,"提示","被调用函数返回的百分比下载失败 ")
EndIf ;判断结束
$DQMLU_Name10 =_FTP_DirGetCurrent($ftp_connect);记录当前用户所处的目录位置
_GUICtrlListView_DeleteAllItems($ListView1);删除当前列表项目内容
_FTP_DirSetCurrent($ftp_connect, $DQMLU_Name10);设置目录
$NewlistView10 = _Ftp_ListToArray($ftp_connect,0,$INTERNET_FLAG_RESYNCHRONIZE);获取该目录内的文件列表
For $ii10 = 1 To $NewlistView10[0];for 循环开始
GUICtrlCreateListViewItem ( $NewlistView10[$ii10],$ListView1);将新的列表更新到列表
Next;for循环结束
GUICtrlSetData($jindu,0);清理进度条
GUICtrlSetData($Label10,"状态:文件上传完成,服务器空闲");更新状态
Case $Button10;按下删除文件
$DLS4=_GUICtrlListView_GetSelectedCount($ListView1);检查当前被选择的项目数量
If $DLS4 <> 1 Then;判断数量,如果没有选择,则无动作
MsgBox(48,"提示!","请选择中您要删除的文件")
ContinueLoop
EndIf;结束判断
$DQMLU_Name4=_FTP_DirGetCurrent($ftp_connect);获取当前目录路径
$DL_DQ4 = _GUICtrlListView_GetSelectedIndices($ListView1,True);检索选定项目的索引
$DL_DQ_Name4 = _GUICtrlListView_GetItemText($ListView1,$DL_DQ4[1]);获取当前选择的文件名称
$delete_File =_FTP_FileDelete($ftp_connect, $DQMLU_Name4 & "/" & $DL_DQ_Name4);
If $delete_File = 0 Then
MsgBox(48,"提示!","删除远程服务器文件失败,重试")
GUICtrlSetData($Label10,"状态:删除《" & $DQMLU_Name4 & "/" & $DL_DQ_Name4 & "》失败");更新状态
Else
MsgBox(64,"提示","删除文件成功")
GUICtrlSetData($Label10,"状态:删除《" & $DQMLU_Name4 & "/" & $DL_DQ_Name4 & "》成功");更新状态
EndIf
$DQMLU_Name100 =_FTP_DirGetCurrent($ftp_connect);记录当前用户所处的目录位置
_GUICtrlListView_DeleteAllItems($ListView1);删除当前列表项目内容
_FTP_DirSetCurrent($ftp_connect, $DQMLU_Name100);设置目录
$NewlistView100 = _Ftp_ListToArray($ftp_connect,0,$INTERNET_FLAG_RESYNCHRONIZE);获取该目录内的文件列表
For $ii100 = 1 To $NewlistView100[0];for 循环开始
GUICtrlCreateListViewItem ( $NewlistView100[$ii100],$ListView1);将新的列表更新到列表
Next;for循环结束
Case $Button11;重命名文件
$DLS5=_GUICtrlListView_GetSelectedCount($ListView1);检查当前被选择的项目数量
If $DLS5 <> 1 Then;判断数量,如果没有选择,则无动作
MsgBox(48,"提示!","请选择中要重命名的文件")
ContinueLoop
EndIf;结束判断
$DQMLU_Name5=_FTP_DirGetCurrent($ftp_connect);获取当前目录路径
$DL_DQ5 = _GUICtrlListView_GetSelectedIndices($ListView1,True);检索选定项目的索引
$DL_DQ_Name5 = _GUICtrlListView_GetItemText($ListView1,$DL_DQ5[1]);获取当前选择的文件名称
$New_File_Names = InputBox("重命名", "输入新的名称,包含后缀名", "", "",280,140)
If @error Then
ContinueLoop
EndIf
$Rname = _FTP_FileRename($ftp_connect, $DQMLU_Name5 & "/" & $DL_DQ_Name5, $New_File_Names)
If @error Then
MsgBox(48,"提示","重命名失败")
Else
MsgBox(64,"提示","重命名成功")
EndIf
$DQMLU_Name100s =_FTP_DirGetCurrent($ftp_connect);记录当前用户所处的目录位置
_GUICtrlListView_DeleteAllItems($ListView1);删除当前列表项目内容
_FTP_DirSetCurrent($ftp_connect, $DQMLU_Name100s);设置目录
$NewlistView100s = _Ftp_ListToArray($ftp_connect,0,$INTERNET_FLAG_RESYNCHRONIZE);获取该目录内的文件列表
For $ii100s = 1 To $NewlistView100s[0];for 循环开始
GUICtrlCreateListViewItem ( $NewlistView100s[$ii100s],$ListView1);将新的列表更新到列表
Next;for循环结束
Case $Button4;按下下载目录
EndSwitch
WEnd
Func _UpdateProgress($Prozent)
GUICtrlSetData($jindu,$Prozent)
If _IsPressed("77") Then Return 0 ; Abbruch bei F8
Return 1 ; bei 1 Fortsetzen
EndFunc
Func _getfilename($spath, $sflag = 0)
If $sflag = 0 Then
$sflag = 0
Else
$sflag = 1
EndIf
If $sflag = 0 Then
$sFileName = StringRegExpReplace($spath, '.+\\', '')
Else
$sFileName = StringRegExpReplace($spath, '.+\\', '')
$sFileName = StringRegExpReplace($sFileName, '\.[^\.]*$', '')
EndIf
Return ($sFileName)
EndFunc
;Func quit()
; _FTP_Close($ftp_open)
;EndFunc
Func _EmptyMyScriptMem($PID)
Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $PID)
Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle[0])
DllCall("kernel32.dll" , 'int', 'CloseHandle', 'int', $ai_Handle[0])
EndFunc
$List=ProcessList()
For $x=1 to $List[0][0]
_EmptyMyScriptMem($List[$x][1])
Next