H3x Posted July 28, 2009 Posted July 28, 2009 (edited) I've created an FTP client that uploads a specified file to my webserver. Though, if the file is a certain size the FTP fails. I've run it in binary mode and I've had the same result. I don't want to split the files since they're 600mb+ and it's not a limitation with my webserver because I have files uploaded that are a few gigabytes in size using Cute-FTP. Is there some kind of limitation to how big the files can be? Smaller files (25mb or so) upload just fine... Thanks in advance, - Hex @Jos: Sorry about that lol, frustration got the best of me. I looked up how to change the FTP connection from ASCII to binary by default and made the change in the header file itself, the rest of the code is posted below. P.S. Here's the edited copy of my script: expandcollapse popup#NoTrayIcon #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_icon=icons\UxTheme_IDI_UXTHEME.ico #AutoIt3Wrapper_UseUpx=n #AutoIt3Wrapper_Res_Description=File Uploader #AutoIt3Wrapper_Res_Fileversion=1.1.392.16 #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y #AutoIt3Wrapper_Res_LegalCopyright= #AutoIt3Wrapper_Res_Language=1033 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** $LastDIR = RegRead( "HKEY_CURRENT_USER\Software\UploadClient", "LastDIR" ) ;;;;;;;;;;;;;;;;===> ; FTP GLOBALS ;;;;;;;;;;;;;;;//--> Global $ServerConnect; Global $ServerOpen; Global $CMDBox ;NULL Declare CMD Box Global $UFile ;File to upload Global $RFile ; Remote file name Global $UDFileProgress ; Ctrl Progress Bar Definition Global $UDFileProgressNumber ; Ctrl Progress Number Definition ; 0-Error 1-Completed 2-Aborted Global $FTPUploadSuccessful = 0 Global $Aborted = 1 #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <ButtonConstants.au3> #include <Array.au3> #include <FTP_Ex.au3> #include <ProgressConstants.au3> #include <StructureConstants.au3> #include <WinAPI.au3> $Form1 = GUICreate("Upload Client", 534, 207, -1, -1, $WS_POPUP, bitor( $WS_EX_ACCEPTFILES, $WS_EX_TOPMOST ) ) GUISetFont(8, 400, 0, "Verdana") GUISetBkColor(0x000000) GUISetState(@SW_SHOW) $UploadFile_Filename = "" $EXT = GUICtrlCreateButton( "Exit", 492, 190, 40, 15 ) GUICtrlSetBkColor( -1, 0x111111 ) GUICtrlSetColor( -1, 0x16A3B9 ) $ALG1_left = 20 $ALG1_top = 50 $TXT1 = GUICtrlCreateLabel( "Upload a file:", 20, 35, 500, 13 ) GUICtrlSetColor( -1, 0xFFFFFF ) $INP_FilePath = GUICtrlCreateInput( "", $ALG1_left, $ALG1_top, 275, 15, $ES_AUTOHSCROLL, 0 ) GUICtrlSetFont(-1, 8, 400, 0, "Verdana") GUICtrlSetColor(-1, 0x666666) GUICtrlSetBkColor(-1, 0x111111 ) $BTN_GetFilePath = GUICtrlCreateButton( "Browse", $ALG1_left+280, $ALG1_top, 60, 15) GUICtrlSetBkColor( -1, 0x111111 ) GUICtrlSetColor( -1, 0x16A3B9 ) $BTN_StartUpload = GUICtrlCreateButton( "Begin Upload", $ALG1_left+350, $ALG1_top, 100, 15 ) GUICtrlSetBkColor( -1, 0x111111 ) GUICtrlSetColor( -1, 0x16A3B9 ) $CMDBox = GUICtrlCreateEdit("", 20, 70, 460, 110, BitOR($ES_READONLY,$ES_WANTRETURN,$ES_AUTOVSCROLL), 0 ) GUICtrlSetData(-1, "Console") GUICtrlSetBkColor( -1, 0x111111 ) GUICtrlSetColor( -1, 0x006600 ) $UDFileProgress = GUICtrlCreateProgress( 20, 185, 430, 15, $PBS_SMOOTH) GUICtrlSetColor(-1, 0x00BBFF ) GUICtrlSetBkColor(-1, 0x0F0F0F ) $UDFileProgressNumber = GUICtrlCreateLabel( "0%", 453, 185, 32, 12 ) GUICtrlSetColor( $UDFileProgressNumber, 0x00CC00 ) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $EXT If $Aborted == 1 Then Exit EndIf Case $BTN_GetFilePath If $LastDIR == 0 Then Else $INP_FileLoc = _WinAPI_GetOpenFileName( "Select a file", "Compressed 7z, cab, gz, iso, rar, tar, zip(*.7z;*.cab;*.gz;*.iso;*.rar;*.tar;*.zip)", $LastDIR ) If $INP_FileLoc[0] = 0 Then Else GUICtrlSetData( $INP_FilePath, $INP_FileLoc[1] & "\" & $INP_FileLoc[2] ) $UploadFile_Filename = $INP_FileLoc[2] RegWrite( "HKEY_CURRENT_USER\Software\UploadClient", "LastDIR", "REG_SZ", $INP_FileLoc[1] & "\" & $INP_FileLoc[2] ) EndIf EndIf Case $BTN_StartUpload If GUICtrlRead( $INP_FilePath ) == "" Then ;MsgBox( 0, "Unknown File path", "Please select a file." ) SendCmdBoxMsg( "Unknown File Path: Please select a valid file" ); Else FTPCenter() EndIf EndSwitch WEnd Func SendCmdBoxMsg( $Value ) GUICtrlSetData( $CMDBox, @CRLF & $Value, 0 ); EndFunc Func CheckFileExtension( $FileName ) $foundEx3 = StringRight($FileName, 3) $foundEx4 = StringRight($FileName, 4) If $foundEx3 == ".7z" Or $foundEx4 == ".cab" Or $foundEx3 == ".gz" Or $foundEx4 == ".iso" Or $foundEx4 == ".rar" Or $foundEx4 == ".tar" Or $foundEx4 == ".zip" Then return 1 Else return 0 EndIf EndFunc ;;->FTP Upload center Func FTPCenter() ;GUICtrlCreateLabel( "User Logged in as: " & $CurrentConfig[0], 5, 10, 200, 12 ); If CheckFileExtension( $UploadFile_Filename ) == 0 Then SendCmdBoxMsg( "Nice try but you're trying to upload an invalid file. "); SendCmdBoxMsg( "Try using the file browser instead of a direct file path. "); Else $Aborted = 0 SendCmdBoxMsg( "Attempting to connect to server..."); $ServerOpen = _FTPOpen( "MyFtp" ); $ServerConnect = _FTPConnect( $ServerOpen, "ftp.someserver.net", "randomname", "password" ); If $ServerOpen <> 0 Then SendCmdBoxMsg( "Connection Accepted" ) GUICtrlSetData( $EXT, "Abort" ) $UploadFile_Filename = StringReplace( $UploadFile_Filename, " ", "_") $UFile = GUICtrlRead( $INP_FilePath ) $RFile = "/public_html/somerandomlongstringhere" & $UploadFile_Filename SendCmdBoxMsg( "Attempting file upload" ) SendCmdBoxMsg( "From Client: " & $UFile & @CRLF ) SendCmdBoxMsg( "To Server: " & $RFile ) SendCmdBoxMsg( "-----------------------------------------" ) UFile_CtrlProgress( $UFile, $RFile ) If $FTPUploadSuccessful == 1 Then SendCmdBoxMsg( "Completed." ) $FTPUploadSuccessful = -1 GUICtrlSetData( $EXT, "Exit" ) ElseIf $FTPUploadSuccessful == 2 Then SendCmdBoxMsg( "FTP Upload aborted." ) $Aborted = 1 $FTPUploadSuccessful = -1 GUICtrlSetData( $EXT, "Exit" ) ElseIf $FTPUploadSuccessful == 0 Then If $ServerConnect == 0 Then SendCmdBoxMsg( "ERROR: Operation terminated due to error" ) $FTPUploadSuccessful = -1 $Aborted = 1 GUICtrlSetData( $EXT, "Exit" ) Else If GUICtrlRead( $UDFileProgressNumber ) == "100%" Then SendCmdBoxMsg( "Completed." & @CRLF & @CRLF ) SendCmdBoxMsg( "Specified URL: http://www.someserver.net/somerandomlongstringhere" & $UploadFile_Filename & @CRLF) _FTPClose( $ServerConnect ) $Aborted = 1 GUICtrlSetData( $EXT, "Exit" ) Else SendCmdBoxMsg( "Alert: Upload has completed, but with errors." & @CRLF & "The file upload was aborted." & @CRLF ); _FTPDelFile( $ServerConnect, $RFile ) _FTPClose( $ServerConnect ) $Aborted = 1 GUICtrlSetData( $EXT, "Exit" ) EndIf ;MsgBox( 0, "Complete", "File upload completed" ) EndIf Else EndIf Else SendCmdBoxMsg( "Connection Failed" ) EndIf EndIf EndFunc ;;FTP File Upload progress Func UFile_Progress( $From, $To ) ProgressOn( "Upload Client", "FTP File Upload", "File: " & $From & " -> " & $To ) _FTP_UploadProgress( $ServerConnect, $From, $To, 'UploadProg' ) ProgressOff() EndFunc Func UploadProg( $Percentage ) ; Update progress bar ProgressSet ( $Percentage & '%' ) Return 1 Endfunc ;;FTP File Download progress Func DFile_Progress( $From, $To ) ProgressOn( "Upload Client", "FTP File Download", "File: " & $From & " -> " & $To ) _FTP_DownloadProgress( $ServerConnect, $From, $To, 'DownloadProg' ) ProgressOff() EndFunc Func DownloadProg( $Percentage ) ; Update progress bar ProgressSet( $Percentage & '%' ) Return 1 EndFunc Func UFile_CtrlProgress( $From, $To ) _FTP_UploadProgress( $ServerConnect, $From, $To, 'UFile_CtrlProgressEx' ) $Aborted = 1 EndFunc Func UFile_CtrlProgressEx( $Percentage ) GUICtrlSetData( $UDFileProgress, $Percentage ) GUICtrlSetData( $UDFileProgressNumber, $Percentage & "%" ) Switch GUIGetMsg() Case $EXT SendCmdBoxMsg( "ALERT: FTP Upload progress aborted. Application attempted termination.") $FTPUploadSuccessful = 2 _FTPDelFile( $ServerConnect, $RFile ) GUICtrlSetData( $EXT, "Exit" ) $Aborted = 1 _FTPClose( $ServerConnect ) return -1 EndSwitch return 1 EndFunc And the FTP_Ex.au3 expandcollapse popup#include<array.au3> #include <Date.au3> #include <StructureConstants.au3> Global $GLOBAL_FTP_WININETHANDLE = -1 Global Const $INTERNET_OPEN_TYPE_DIRECT = 1 Global Const $INTERNET_OPEN_TYPE_PRECONFIG = 0 Global Const $INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY = 4 Global Const $INTERNET_OPEN_TYPE_PROXY = 3 Global Const $GENERIC_READ = 0x80000000 Global Const $GENERIC_WRITE = 0x40000000 Global Const $FTP_TRANSFER_TYPE_UNKNOWN = 0 ;Defaults to FTP_TRANSFER_TYPE_BINARY. Global Const $FTP_TRANSFER_TYPE_ASCII = 1 ;Transfers the file using FTP's ASCII (Type A) transfer method. Control and formatting information is converted to local equivalents. Global Const $FTP_TRANSFER_TYPE_BINARY = 2 ;Transfers the file using FTP's Image (Type I) transfer method. The file is transferred exactly as it exists with no changes. This is the default transfer method. Global Const $INTERNET_FLAG_PASSIVE = 0x08000000 Global Const $INTERNET_FLAG_TRANSFER_ASCII = 0x00000001 Global Const $INTERNET_FLAG_TRANSFER_BINARY = 0x00000002 Global Const $INTERNET_DEFAULT_FTP_PORT = 21 Global Const $INTERNET_SERVICE_FTP = 1 Global Const $tagWIN32_FIND_DATA = "DWORD dwFileAttributes; dword ftCreationTime[2]; dword ftLastAccessTime[2]; dword ftLastWriteTime[2]; DWORD nFileSizeHigh; DWORD nFileSizeLow; dword dwReserved0; dword dwReserved1; CHAR cFileName[260]; CHAR cAlternateFileName[14];" ; Could be called at the End of Script ; Closes the wininet.dll used for FTP-Functions Func _FTPUnInit() DllClose($GLOBAL_FTP_WININETHANDLE) $GLOBAL_FTP_WININETHANDLE = -1 EndFunc ;==>_FTPUnInit ;=============================================================================== ; ; Function Name: _FTPOpen() ; Description: Opens an FTP session. ; Parameter(s): $s_Agent - Random name. ( like "myftp" ) ; $l_AccessType - Set if proxy is used. ; $s_ProxyName - ProxyName. ; $s_ProxyBypass - ProxyByPasses's. ; $l_Flags - Special flags. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - Returns an indentifier. ; On Failure - 0 and sets @ERROR ; Remarks: Values for $l_AccessType ; $INTERNET_OPEN_TYPE_DIRECT -> no proxy ; $INTERNET_OPEN_TYPE_PRECONFIG -> Retrieves the proxy ; or direct configuration from the registry. ; $INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY ; -> Retrieves the proxy or direct configuration ; from the registry and prevents the use of a ; startup Microsoft JScript or Internet Setup (INS) file. ; $INTERNET_OPEN_TYPE_PROXY -> Passes requests to the ; proxy unless a proxy bypass list is supplied ; and the name to be resolved bypasses the proxy. ; Then no proxy is used. ; Author(s): Wouter van Kesteren. ; ;=============================================================================== Func _FTPOpen($s_Agent, $l_AccessType = 1, $s_ProxyName = '', $s_ProxyBypass = '', $l_Flags = 2) If $GLOBAL_FTP_WININETHANDLE = -1 Then ___FTPInit() Local $ai_InternetOpen = DllCall($GLOBAL_FTP_WININETHANDLE, 'hwnd', 'InternetOpen', 'str', $s_Agent, 'long', $l_AccessType, 'str', $s_ProxyName, 'str', $s_ProxyBypass, 'long', $l_Flags) If @error Or $ai_InternetOpen[0] = 0 Then SetError(-1) Return 0 EndIf Return SetError(0,0,$ai_InternetOpen[0]) EndFunc ;==>_FTPOpen ;=============================================================================== ; ; Function Name: _FTPConnect() ; Description: Connects to an FTP server. ; Parameter(s): $l_InternetSession - The Long from _FTPOpen() ; $s_ServerName - Server name/ip. ; $s_Username - Username. ; $s_Password - Password. ; $i_Passive - Passive mode?. ; $i_ServerPort - Server port ( 0 is default (21) ) ; $l_Service - I dont got a clue what this does. ; $l_Flags - Special flags. ; $l_Context - I dont got a clue what this does. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - Returns an indentifier. ; On Failure - 0 and sets @ERROR ; Author(s): Wouter van Kesteren ; ;=============================================================================== Func _FTPConnect($l_InternetSession, $s_ServerName, $s_Username, $s_Password, $i_Passive = 0, $i_ServerPort = 0, $l_Service = 1, $l_Flags = 0, $l_Context = 0) If $i_Passive == True Then $l_Flags = BitOR($l_Flags, 0x08000000) Local $ai_InternetConnect = DllCall($GLOBAL_FTP_WININETHANDLE, 'hwnd', 'InternetConnect', 'hwnd', $l_InternetSession, 'str', $s_ServerName, 'int', $i_ServerPort, 'str', $s_Username, 'str', $s_Password, 'long', $l_Service, 'long', $l_Flags, 'long', $l_Context) If @error Or $ai_InternetConnect[0] = 0 Then SetError(-1 - @error) Return 0 EndIf Return $ai_InternetConnect[0] EndFunc ;==>_FTPConnect ;=============================================================================== ; ; Function Name: _FTPPutFile() ; Description: Puts an file on an FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_LocalFile - The local file. ; $s_RemoteFile - The remote Location for the file. ; $l_Flags - Special flags. ; $l_Context - I dont got a clue what this does. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): Wouter van Kesteren ; ;=============================================================================== Func _FTPPutFile($l_FTPSession, $s_LocalFile, $s_RemoteFile, $l_Flags = 0, $l_Context = 0) Local $ai_FTPPutFile = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'FtpPutFile', 'hwnd', $l_FTPSession, 'str', $s_LocalFile, 'str', $s_RemoteFile, 'long', $l_Flags, 'long', $l_Context) If @error Or $ai_FTPPutFile[0] = 0 Then SetError(-1) Return 0 EndIf Return $ai_FTPPutFile[0] EndFunc ;==>_FTPPutFile ;=============================================================================== ; ; Function Name: _FTPDelFile() ; Description: Delete an file from an FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_RemoteFile - The remote Location for the file. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): Wouter van Kesteren ; ;=============================================================================== Func _FTPDelFile($l_FTPSession, $s_RemoteFile) Local $ai_FTPPutFile = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'FtpDeleteFile', 'hwnd', $l_FTPSession, 'str', $s_RemoteFile) If @error Or $ai_FTPPutFile[0] = 0 Then SetError(-1) Return 0 EndIf Return $ai_FTPPutFile[0] EndFunc ;==>_FTPDelFile ;=============================================================================== ; ; Function Name: _FTPRenameFile() ; Description: Renames an file on an FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_Existing - The old file name. ; $s_New - The new file name. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): Wouter van Kesteren ; ;=============================================================================== Func _FTPRenameFile($l_FTPSession, $s_Existing, $s_New) Local $ai_FTPRenameFile = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'FtpRenameFile', 'hwnd', $l_FTPSession, 'str', $s_Existing, 'str', $s_New) If @error Or $ai_FTPRenameFile[0] = 0 Then SetError(-1) Return 0 EndIf Return $ai_FTPRenameFile[0] EndFunc ;==>_FTPRenameFile ;=============================================================================== ; ; Function Name: _FTPMakeDir() ; Description: Makes an Directory on an FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_Remote - The Directory to Create. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): Wouter van Kesteren ; ;=============================================================================== Func _FTPMakeDir($l_FTPSession, $s_Remote) Local $ai_FTPMakeDir = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'FtpCreateDirectory', 'hwnd', $l_FTPSession, 'str', $s_Remote) If @error Or $ai_FTPMakeDir[0] = 0 Then SetError(-1) Return 0 EndIf Return $ai_FTPMakeDir[0] EndFunc ;==>_FTPMakeDir ;=============================================================================== ; ; Function Name: _FTPDelDir() ; Description: Delete's an Directory on an FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_Remote - The Directory to be deleted. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): Wouter van Kesteren ; ;=============================================================================== Func _FTPDelDir($l_FTPSession, $s_Remote) Local $ai_FTPDelDir = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'FtpRemoveDirectory', 'hwnd', $l_FTPSession, 'str', $s_Remote) If @error Or $ai_FTPDelDir[0] = 0 Then SetError(-1) Return 0 EndIf Return $ai_FTPDelDir[0] EndFunc ;==>_FTPDelDir ;=============================================================================== ; ; Function Name: _FTPClose() ; Description: Closes the _FTPOpen session. ; Parameter(s): $l_InternetSession - The Long from _FTPOpen() ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): Wouter van Kesteren ; ;=============================================================================== Func _FTPClose($l_InternetSession) Local $ai_InternetCloseHandle = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetCloseHandle', 'hwnd', $l_InternetSession) If @error Or $ai_InternetCloseHandle[0] = 0 Then SetError(-1) Return 0 EndIf Return $ai_InternetCloseHandle[0] EndFunc ;==>_FTPClose ;=============================================================================== ; ; Function Name: _FTPGetCurrentDir() ; Description: Get Current Directory on an FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - Directory Name ; On Failure - 0 ; Author(s): Beast ; ;=============================================================================== Func _FTPGetCurrentDir($l_FTPSession) Local $ai_FTPGetCurrentDir = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'FtpGetCurrentDirectory', 'hwnd', $l_FTPSession, 'str', "", 'long*', 260) If @error Or $ai_FTPGetCurrentDir[0] = 0 Then SetError(-1) Return 0 EndIf Return $ai_FTPGetCurrentDir[2] EndFunc ;==>_FTPGetCurrentDir ;=============================================================================== ; ; Function Name: _FtpSetCurrentDir() ; Description: Set Current Directory on an FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_Remote - The Directory to be set. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): Beast ; ;=============================================================================== Func _FtpSetCurrentDir($l_FTPSession, $s_Remote) Local $ai_FTPSetCurrentDir = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'FtpSetCurrentDirectory', 'hwnd', $l_FTPSession, 'str', $s_Remote) If @error Or $ai_FTPSetCurrentDir[0] = 0 Then SetError(-1) Return 0 EndIf Return $ai_FTPSetCurrentDir[0] EndFunc ;==>_FtpSetCurrentDir ;=============================================================================== ; ; Function Name: _FTPGetFile() ; Description: Get file from a FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_RemoteFile - The remote Location for the file. ; $s_LocalFile - The local file. ; $fFailIfExists - True: do not overwrite existing (default = False) ; $dwFlagsAndAttributes - special flags ; $l_Flags - Special flags. ; $l_Context - I dont got a clue what this does. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): Wouter van Kesteren ; ;=============================================================================== Func _FTPGetFile($l_FTPSession, $s_RemoteFile, $s_LocalFile, $fFailIfExists = False, $dwFlagsAndAttributes = 0, $l_Flags = 0, $l_Context = 0) Local $ai_FTPGetFile = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'FtpGetFile', 'hwnd', $l_FTPSession, 'str', $s_RemoteFile, 'str', $s_LocalFile, "int", $fFailIfExists, "DWORD", $dwFlagsAndAttributes, 'dword', $l_Flags, 'dword', $l_Context) If @error Or $ai_FTPGetFile[0] = 0 Then SetError(-1) Return 0 EndIf Return $ai_FTPGetFile[0] EndFunc ;==>_FTPGetFile ;=============================================================================== ; ; Function Name: _FTPGetFileSize() ; Description: Gets filesize of a file on the FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_FileName - The file name. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): J.o.a.c.h.i.m. d.e. K.o.n.i.n.g. ; ;=============================================================================== Func _FTPGetFileSize($l_FTPSession, $s_FileName) Local $ai_FTPGetSizeHandle = DllCall($GLOBAL_FTP_WININETHANDLE, 'hwnd', 'FtpOpenFile', 'hwnd', $l_FTPSession, 'str', $s_FileName, 'long', 0x80000000, 'long', 0x04000002, 'long', 0) Local $ai_FTPGetFileSize = DllCall($GLOBAL_FTP_WININETHANDLE, 'dword', 'FtpGetFileSize', 'long', $ai_FTPGetSizeHandle[0], 'dword*', 0) If @error Or $ai_FTPGetFileSize[0] = 0 Then SetError(-1) Return 0 EndIf DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetCloseHandle', 'hwnd', $ai_FTPGetSizeHandle[0]) ;~ Return $ai_FTPGetFileSize[0] Return BitOR(BitShift($ai_FTPGetFileSize[2], -32), BitAND($ai_FTPGetFileSize[0], 0xFFFFFFFF)) EndFunc ;==>_FTPGetFileSize ;=============================================================================== ; ; Function Name: _FtpFileListto2DArray() ; Description: Get Filenames and filesizes of current Directory. ; Parameter(s): ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 2D Array with Files ; On Failure - 0 ; Author(s): Prog@ndy ; ;=============================================================================== Func _FTPFilesListTo2DArray($l_FTPSession, $Return_Type = 0, $l_Flags = 0, $l_Context = 0) Local $WIN32_FIND_DATA Local $FileArray[1][2], $DirectoryArray[1][2], $DirectoryIndex = 0, $FileIndex = 0 If $Return_Type < 0 Or $Return_Type > 2 Then Return SetError(1, 0, $FileArray) Local $callFindFirst, $File $File = _FTPFileFindFirst($l_FTPSession, "", $callFindFirst, $WIN32_FIND_DATA, $l_Flags, $l_Context) If Not $callFindFirst Then Return SetError(1, 0, 0) EndIf Local $IsDir While 1 ;~ ConsoleWrite($File[10] & @CRLF) ;~ ConsoleWrite($File[11] & @CRLF) $IsDir = BitAND($File[1], 16) = 16 Select Case $IsDir And ($Return_Type <> 2) $DirectoryIndex += 1 ReDim $DirectoryArray[$DirectoryIndex + 1][2] $DirectoryArray[$DirectoryIndex][0] = $File[10] $DirectoryArray[$DirectoryIndex][1] = BitOR(BitShift($File[8], -32), BitAND($File[9], 0xFFFFFFFF)) Case Not $IsDir And $Return_Type <> 1 $FileIndex += 1 ReDim $FileArray[$FileIndex + 1][2] $FileArray[$FileIndex][0] = $File[10] $FileArray[$FileIndex][1] = BitOR(BitShift($File[8], -32), BitAND($File[9], 0xFFFFFFFF)) EndSelect $File = _FTPFileFindNext($callFindFirst, $WIN32_FIND_DATA) If @error <> 0 Then ExitLoop WEnd _FTPFileFindClose($callFindFirst, $WIN32_FIND_DATA) $DirectoryArray[0][0] = $DirectoryIndex $FileArray[0][0] = $FileIndex Switch $Return_Type Case 0 If $DirectoryArray[0][0] = 0 Then Return $FileArray ReDim $DirectoryArray[$DirectoryArray[0][0] + $FileArray[0][0] + 1][2] For $i = 1 To $FileIndex $DirectoryArray[$DirectoryArray[0][0] + $i][0] = $FileArray[$i][0] $DirectoryArray[$DirectoryArray[0][0] + $i][1] = $FileArray[$i][1] Next $DirectoryArray[0][0] += $FileArray[0][0] Return $DirectoryArray Case 1 Return $DirectoryArray Case 2 Return $FileArray EndSwitch EndFunc ;==>_FTPFilesListTo2DArray ;=============================================================================== ; ; Function Name: _FtpFileListtoArray() ; Description: Get Filenames, Directorys, or Both of a Directory. ; Parameter(s): $l_FTPSession - Long From _FileConnect ; $Return_type - 0 = Both Files and Directorys, 1 = Directorys, 2 = Files ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): Beast, Prog@ndy ; ;=============================================================================== Func _FTPFilesListToArray($l_FTPSession, $Return_Type = 0, $l_Flags = 0, $l_Context = 0) Local $WIN32_FIND_DATA, $FileTime Local $FileArray[1], $DirectoryArray[1], $DirectoryIndex = 0, $FileIndex = 0 If $Return_Type < 0 Or $Return_Type > 2 Then Return SetError(1, 0, $FileArray) ;~ $tagWIN32_FIND_DATA = "DWORD dwFileAttributes; uint64 ftCreationTime; uint64 ftLastAccessTime; uint64 ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; short dwReserved0; short dwReserved1; CHAR cFileName[260]; CHAR cAlternateFileName[14];" $WIN32_FIND_DATA = DllStructCreate($tagWIN32_FIND_DATA) Local $callFindFirst = DllCall($GLOBAL_FTP_WININETHANDLE, 'hwnd', 'FtpFindFirstFile', 'hwnd', $l_FTPSession, 'str', "", 'ptr', DllStructGetPtr($WIN32_FIND_DATA), 'long', $l_Flags, 'long', $l_Context) If Not $callFindFirst[0] Then Return SetError(1, 0, 0) EndIf Local $IsDir While 1 $IsDir = BitAND(DllStructGetData($WIN32_FIND_DATA, 1), 16) = 16 Select Case $IsDir And ($Return_Type <> 2) $DirectoryIndex += 1 ReDim $DirectoryArray[$DirectoryIndex + 1] $DirectoryArray[$DirectoryIndex] = DllStructGetData($WIN32_FIND_DATA, 9) Case Not $IsDir And $Return_Type <> 1 $FileIndex += 1 ReDim $FileArray[$FileIndex + 1] $FileArray[$FileIndex] = DllStructGetData($WIN32_FIND_DATA, 9) EndSelect Local $callFindNext = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetFindNextFile', 'hwnd', $callFindFirst[0], 'ptr', DllStructGetPtr($WIN32_FIND_DATA)) If Not $callFindNext[0] Then ExitLoop EndIf WEnd DllCall($GLOBAL_FTP_WININETHANDLE, "int", "InternetCloseHandle", "hwnd", $callFindFirst[0]) $DirectoryArray[0] = $DirectoryIndex $FileArray[0] = $FileIndex Switch $Return_Type Case 0 ReDim $DirectoryArray[$DirectoryArray[0] + $FileArray[0] + 1] For $i = 1 To $FileIndex $DirectoryArray[$DirectoryArray[0] + $i] = $FileArray[$i] Next $DirectoryArray[0] += $FileArray[0] Return $DirectoryArray Case 1 Return $DirectoryArray Case 2 Return $FileArray EndSwitch EndFunc ;==>_FTPFilesListToArray ;=============================================================================== ; ; Function Name: _FtpFileListtoArrayEx() ; Description: Get Filenames, Directorys, or Both of a Directory. ; Parameter(s): $l_FTPSession - Long From _FileConnect ; $Return_type - 0 = Both Files and Directorys, 1 = Directorys, 2 = Files ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): Beast, Prog@ndy ; ;=============================================================================== Func _FTPFilesListToArrayEx($l_FTPSession, $Return_Type = 0, $l_Flags = 0, $l_Context = 0) Local $WIN32_FIND_DATA, $ret, $FileTime, $IsDir Local $ArrayCount = 10 Local $FileArray[1][$ArrayCount], $DirectoryArray[1][$ArrayCount], $DirectoryIndex = 0, $FileIndex = 0 If $Return_Type < 0 Or $Return_Type > 2 Then Return SetError(1, 0, $FileArray) ;~ $array = _ArrayCreate($array) ;~ $array2d = _ArrayCreate($array2d) ;~ $str = "dword;int64;int64;int64;dword;dword;dword;dword;char[256];char[14]" ;~ $tagWIN32_FIND_DATA = "DWORD dwFileAttributes; uint64 ftCreationTime; uint64 ftLastAccessTime; uint64 ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; short dwReserved0; short dwReserved1; CHAR cFileName[260]; CHAR cAlternateFileName[14];" $WIN32_FIND_DATA = DllStructCreate($tagWIN32_FIND_DATA) Local $callFindFirst = DllCall($GLOBAL_FTP_WININETHANDLE, 'hwnd', 'FtpFindFirstFile', 'hwnd', $l_FTPSession, 'str', "", 'ptr', DllStructGetPtr($WIN32_FIND_DATA), 'long', $l_Flags, 'long', $l_Context) If Not $callFindFirst[0] Then Return SetError(1, 0, 0) EndIf $ret = "" While 1 $IsDir = BitAND(DllStructGetData($WIN32_FIND_DATA, 1), 16) = 16 If $IsDir And ($Return_Type <> 2) Then $DirectoryIndex += 1 ReDim $DirectoryArray[$DirectoryIndex + 1][$ArrayCount] $DirectoryArray[$DirectoryIndex][0] = DllStructGetData($WIN32_FIND_DATA, 9) $FileTime = DllStructCreate("dword;dword", DllStructGetPtr($WIN32_FIND_DATA, 2)) If (DllStructGetData($FileTime, 1) + DllStructGetData($FileTime, 2)) Then $DirectoryArray[$DirectoryIndex][1] = _Date_Time_FileTimeToStr($FileTime) $FileTime = DllStructCreate("dword;dword", DllStructGetPtr($WIN32_FIND_DATA, 3)) If (DllStructGetData($FileTime, 1) + DllStructGetData($FileTime, 2)) Then $DirectoryArray[$DirectoryIndex][2] = _Date_Time_FileTimeToStr($FileTime) $FileTime = DllStructCreate("dword;dword", DllStructGetPtr($WIN32_FIND_DATA, 4)) If (DllStructGetData($FileTime, 1) + DllStructGetData($FileTime, 2)) Then $DirectoryArray[$DirectoryIndex][3] = _Date_Time_FileTimeToStr($FileTime) If DllStructGetData($WIN32_FIND_DATA, 1) <> 128 Then $DirectoryArray[$DirectoryIndex][4] = __FileListToArrayEx_HasAttribute($WIN32_FIND_DATA, 2) ; Hidden $DirectoryArray[$DirectoryIndex][5] = __FileListToArrayEx_HasAttribute($WIN32_FIND_DATA, 1) ; Readonly EndIf ElseIf Not $IsDir And $Return_Type <> 1 Then $FileIndex += 1 ReDim $FileArray[$FileIndex + 1][$ArrayCount] $FileArray[$FileIndex][0] = DllStructGetData($WIN32_FIND_DATA, 9) $FileTime = DllStructCreate("dword;dword", DllStructGetPtr($WIN32_FIND_DATA, 2)) If (DllStructGetData($FileTime, 1) + DllStructGetData($FileTime, 2)) Then $FileArray[$FileIndex][1] = _Date_Time_FileTimeToStr($FileTime) $FileTime = DllStructCreate("dword;dword", DllStructGetPtr($WIN32_FIND_DATA, 3)) If (DllStructGetData($FileTime, 1) + DllStructGetData($FileTime, 2)) Then $FileArray[$FileIndex][2] = _Date_Time_FileTimeToStr($FileTime) $FileTime = DllStructCreate("dword;dword", DllStructGetPtr($WIN32_FIND_DATA, 4)) If (DllStructGetData($FileTime, 1) + DllStructGetData($FileTime, 2)) Then $FileArray[$FileIndex][3] = _Date_Time_FileTimeToStr($FileTime) If DllStructGetData($WIN32_FIND_DATA, 1) <> 128 Then $FileArray[$FileIndex][4] = __FileListToArrayEx_HasAttribute($WIN32_FIND_DATA, 2) ; Hidden $FileArray[$FileIndex][5] = __FileListToArrayEx_HasAttribute($WIN32_FIND_DATA, 1) ; Readonly EndIf EndIf Local $callFindNext = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetFindNextFile', 'hwnd', $callFindFirst[0], 'ptr', DllStructGetPtr($WIN32_FIND_DATA)) If Not $callFindNext[0] Then ExitLoop EndIf WEnd DllCall($GLOBAL_FTP_WININETHANDLE, "int", "InternetCloseHandle", "hwnd", $callFindFirst[0]) $DirectoryArray[0][0] = $DirectoryIndex $FileArray[0][0] = $FileIndex ;~ ConsoleWrite($DirectoryIndex & @CRLF) ;~ ConsoleWrite($FileIndex & @CRLF) Switch $Return_Type Case 0 ReDim $DirectoryArray[$DirectoryArray[0][0] + $FileArray[0][0] + 1][$ArrayCount] For $i = 1 To $FileIndex $DirectoryArray[$DirectoryArray[0][0] + $i][0] = $FileArray[$i][0] $DirectoryArray[$DirectoryArray[0][0] + $i][1] = $FileArray[$i][1] $DirectoryArray[$DirectoryArray[0][0] + $i][2] = $FileArray[$i][2] $DirectoryArray[$DirectoryArray[0][0] + $i][3] = $FileArray[$i][3] $DirectoryArray[$DirectoryArray[0][0] + $i][4] = $FileArray[$i][4] $DirectoryArray[$DirectoryArray[0][0] + $i][5] = $FileArray[$i][5] Next $DirectoryArray[0][0] += $FileArray[0][0] Return $DirectoryArray Case 1 Return $DirectoryArray Case 2 Return $FileArray EndSwitch EndFunc ;==>_FTPFilesListToArrayEx Func __FileListToArrayEx_HasAttribute(ByRef $WIN32_FIND_DATA, $attib) Return (BitAND(DllStructGetData($WIN32_FIND_DATA, 1), $attib) = $attib) EndFunc ;==>__FileListToArrayEx_HasAttribute ;=============================================================================== ; ; Function Name: _FTPCommand() ; Description: Sends a command to an FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPOpen() ; $s_FTPCommand - Commad string to send to FTP Server ; $l_ExpectResponse - Data socket for response in Async mode ; $s_Context - A pointer to a variable that contains an application-defined ; value used to identify the application context in callback operations ; $s_Handle - A pointer to a handle that is created if a valid data socket is opened. ; The $s_ExpectResponse parameter must be set to TRUE for phFtpCommand to be filled. ; -> Parameter removed, is returned as @extended ; ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - Returns an indentifier. ; On Failure - 0 and sets @ERROR ; Author(s): Bill Mezian ; ; Command Examples: depends on server syntax. The following is for ; Binary transfer, ASCII transfer, Passive transfer mode (used with firewalls) ; 'type I' 'type A' 'pasv' ; ;=============================================================================== Func _FTPCommand($l_FTPSession, $s_FTPCommand, $l_Flags = 0x00000001, $l_ExpectResponse = 0, $l_Context = 0) Local $ai_FTPCommand = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'FtpCommand', 'hwnd', $l_FTPSession, 'long', $l_ExpectResponse, 'long', $l_Flags, 'str', $s_FTPCommand, 'ulong', $l_Context, 'dword*', 0) If @error Or $ai_FTPCommand[0] = 0 Then SetError(-1) Return 0 EndIf ;Return $s_return SetExtended($ai_FTPCommand[6]) Return $ai_FTPCommand[0] EndFunc ;==>_FTPCommand ;====================================================================================================== ; ; Function Name: _FTPPutFolderContents() ; Description: Puts an folder on an FTP server. Recursivley if selected ; Parameter(s): $l_InternetSession - The Long from _FTPConnect() ; $s_LocalFolder - The local folder i.e. "c:\temp". ; $s_RemoteFolder - The remote folder i.e. '/website/home'. ; $b_RecursivePut - Recurse through sub-dirs. 0=Non recursive, 1=Recursive ; Requirement(s): DllCall, wininet.dll ; Author(s): Stumpii ; ;====================================================================================================== Func _FTPPutFolderContents($l_InternetSession, $s_LocalFolder, $s_RemoteFolder, $b_RecursivePut) If StringRight($s_LocalFolder,1) == "\" Then $s_LocalFolder = StringTrimRight($s_LocalFolder,1) ; Shows the filenames of all files in the current directory. $search = FileFindFirstFile($s_LocalFolder & "\*.*") ; Check if the search was successful If $search = -1 Then Return SetError(1, 0, 0) ;~ MsgBox(0, "Error", "No files/directories matched the search pattern") ;~ Exit EndIf While 1 $File = FileFindNextFile($search) If @error Then ExitLoop If StringInStr(FileGetAttrib($s_LocalFolder & "\" & $File), "D") Then _FTPMakeDir($l_InternetSession, $s_RemoteFolder & "/" & $File) If $b_RecursivePut Then _FTPPutFolderContents($l_InternetSession, $s_LocalFolder & "\" & $File, $s_RemoteFolder & "/" & $File, $b_RecursivePut) EndIf Else _FTPPutFile($l_InternetSession, $s_LocalFolder & "\" & $File, $s_RemoteFolder & "/" & $File, 0, 0) EndIf WEnd ; Close the search handle FileClose($search) Return 1 EndFunc ;==>_FTPPutFolderContents #Region Internal ;Internal Func, DO NOT USE YOURSELF Func ___FTPInit() $GLOBAL_FTP_WININETHANDLE = DllOpen('wininet.dll') EndFunc ;==>___FTPInit #EndRegion Internal ;=============================================================================== ; ; Function Name: _FTP_UploadProgress() ; Description:: Uploadsd a file in Binary Mode and shows Progress in Tooltip or by Calling a User defined Function ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_LocalFile - The local file. ; $s_RemoteFile - The remote Location for the file. ; $FunctionToCall - [Optional] A function which can update a Progressbar and ; react on UserInput like Click on Abort or Close App. ; (More info in the end of this comment) ; Requirement(s): ?? ; Return Value(s): Success: 1 ; Error: 0 and @error: ; -3 -> Create File failed ; -4 -> Write to file failed ; -5 -> Close File failed ; Upload aborted by PercentageFunc: ; ReturnValue: Return of Called Function ; And @error -6 ; Author(s): limette, Prog@ndy ; ; Information about $FunctionToCall: ; Parameter: $Percentage - The Percentage of Progress ; Return Values: Continue Download - 1 ; Abort Download - 0 Or negative ; These Return Values are returned by _FTP_UploadProgress, too, ; so you can react on different Actions like Aborting by User, closing App or TimeOut of whatever ; Examples: ;~ Func _UpdateProgress($Percentage) ;~ ProgressSet($percent,$percent &"%") ;~ If _IsPressed("77") Then Return 0 ; Abort on F8 ;~ Return 1 ; bei 1 Fortsetzten ;~ Endfunc ; ;~ Func _UpdateProgress($Percentage) ;~ GUICtrlSetData($ProgressBarCtrl,$percent) ;~ Switch GUIGetMsg() ;~ Case $GUI_EVENT_CLOSE ;~ Return -1 ; _FTP_UploadProgress Aborts with -1, so you can exit you app afterwards ;~ Case $Btn_Cancel ;~ Return 0 ; Just Cancel, without special Return value ;~ EndSwitch ;~ Return 1 ; Otherwise contine Upload ;~ Endfunc ; ;=============================================================================== ; Func _FTP_UploadProgress($l_FTPSession, $s_LocalFile, $s_RemoteFile, $FunctionToCall = "") #Region Declaration Local $ai_ftpopenfile, $ai_InternetCloseHandle, $fhandle, $glen, $last, $x, $parts, $buffer, $ai_ftpwrite, $result, $out, $i #EndRegion Declaration #Region OpenFile Local $ai_ftpopenfile = DllCall($GLOBAL_FTP_WININETHANDLE, 'ptr', 'FtpOpenFile', 'hwnd', $l_FTPSession, 'str', $s_RemoteFile, 'dword', 0x40000000, 'dword', 0x02, 'dword', 0) If @error Or $ai_ftpopenfile[0] = 0 Then SetError(-3) Return 0 EndIf #EndRegion OpenFile If $FunctionToCall = "" Then ProgressOn("FTP Upload", "Uploading " & $s_LocalFile) #Region DataSend Local $fhandle = FileOpen($s_LocalFile, 16) $glen = FileGetSize($s_LocalFile) $last = Mod($glen, 100) $x = ($glen - $last) / 100 ;~ If $x = 0 Then $x = 1 If $x = 0 Then $x = $last $parts = 1 ElseIf $last > 0 Then $parts = 101 Else $parts = 100 EndIf If $x < $last Then $buffer = DllStructCreate("byte[" & $last & "]") Else $buffer = DllStructCreate("byte[" & $x & "]") EndIf ;~ Dim $out, $i = 0, $result For $i = 1 To $parts Select Case $i = 101 And $last > 0 $x = $last EndSelect DllStructSetData($buffer, 1, FileRead($fhandle, $x)) Local $ai_ftpwrite = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetWriteFile', 'ptr', $ai_ftpopenfile[0], 'ptr', DllStructGetPtr($buffer), 'int', $x, 'dword*', $out) If @error Or $ai_ftpwrite[0] = 0 Then $ai_InternetCloseHandle = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetCloseHandle', 'ptr', $ai_ftpopenfile[0]) FileClose($fhandle) SetError(-4) Return 0 EndIf Switch $FunctionToCall Case "" ProgressSet($i) Case Else Select Case $parts = 1 $result = 100 Case $i = 101 $result = 100 Case Else $result = $i EndSelect $ret = Call($FunctionToCall, $result) Select Case $ret <= 0 $ai_InternetCloseHandle = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetCloseHandle', 'ptr', $ai_ftpopenfile[0]) DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'FtpDeleteFile', 'hwnd', $l_FTPSession, 'str', $s_RemoteFile) FileClose($fhandle) SetError(-6) Return $ret EndSelect EndSwitch Sleep(10) Next FileClose($fhandle) #EndRegion DataSend If $FunctionToCall = "" Then ProgressOff() #Region disconnect $ai_InternetCloseHandle = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetCloseHandle', 'ptr', $ai_ftpopenfile[0]) If @error Or $ai_InternetCloseHandle[0] = 0 Then SetError(-5) Return 0 EndIf #EndRegion disconnect Return 1 EndFunc ;==>_FTP_UploadProgress ;=============================================================================== ; ; Function Name: _FTP_DownloadProgress() ; Description:: Downloads a file in Binary Mode and shows Progress in Tooltip or by Calling a User defined Function ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_LocalFile - The local file to create. ; $s_RemoteFile - The remote source file. ; $FunctionToCall - [Optional] A function which can update a Progressbar and ; react on UserInput like Click on Abort or Close App. ; (More info in the end of this comment) ; Requirement(s): ?? ; Return Value(s): Success: 1 ; Error: 0 and @error: ; -1 -> Local file couldn't be created ; -3 -> Open RemoteFile failed ; -4 -> Read from Remotefile failed ; -5 -> Close RemoteFile failed ; Download aborted by PercentageFunc: ; ReturnValue: Return of Called Function ; And @error -6 ; Author(s): limette, Prog@ndy ; ; Information about $FunctionToCall: ; Parameter: $Percentage - The Percentage of Progress ; Return Values: Continue Download - 1 ; Abort Download - 0 Or negative ; These Return Values are returned by _FTP_DownloadProgress, too, ; so you can react on different Actions like Aborting by User, closing App or TimeOut of whatever ; Examples: ;~ Func _UpdateProgress($Percentage) ;~ ProgressSet($percent,$percent &"%") ;~ If _IsPressed("77") Then Return 0 ; Abort on F8 ;~ Return 1 ; bei 1 Fortsetzten ;~ Endfunc ; ;~ Func _UpdateProgress($Percentage) ;~ GUICtrlSetData($ProgressBarCtrl,$percent) ;~ Switch GUIGetMsg() ;~ Case $GUI_EVENT_CLOSE ;~ Return -1 ; _FTP_UploadProgress Aborts with -1, so you can exit you app afterwards ;~ Case $Btn_Cancel ;~ Return 0 ; Just Cancel, without special Return value ;~ EndSwitch ;~ Return 1 ; Otherwise contine Upload ;~ Endfunc ; ;=============================================================================== ; Func _FTP_DownloadProgress($l_FTPSession, $s_LocalFile, $s_RemoteFile, $FunctionToCall = "") #Region Declaration Local $ai_ftpopenfile, $ai_InternetCloseHandle, $fhandle, $glen, $last, $x, $parts, $buffer, $ai_FTPread, $result, $out, $i #EndRegion Declaration #Region OpenFile Local $fhandle = FileOpen($s_LocalFile, 18) If @error Then SetError(-1) Return 0 EndIf Local $ai_ftpopenfile = DllCall($GLOBAL_FTP_WININETHANDLE, 'ptr', 'FtpOpenFile', 'hwnd', $l_FTPSession, 'str', $s_RemoteFile, 'dword', 0x80000000, 'dword', 0x02, 'dword', 0) If @error Or $ai_ftpopenfile[0] = 0 Then SetError(-3) Return 0 EndIf #EndRegion OpenFile If $FunctionToCall = "" Then ProgressOn("FTP Download", "Downloading " & $s_LocalFile) #Region DataSend Local $ai_FTPGetFileSize = DllCall($GLOBAL_FTP_WININETHANDLE, 'dword', 'FtpGetFileSize', 'ptr', $ai_ftpopenfile[0], 'dword*', 0) $glen = BitOR(BitShift($ai_FTPGetFileSize[2], -32), BitAND($ai_FTPGetFileSize[0], 0xFFFFFFFF)) ;FileGetSize($s_LocalFile) $last = Mod($glen, 100) $x = ($glen - $last) / 100 ;~ If $x = 0 Then $x = 1 If $x = 0 Then $x = $last $parts = 1 ElseIf $last > 0 Then $parts = 101 Else $parts = 100 EndIf If $x < $last Then $buffer = DllStructCreate("byte[" & $last & "]") Else $buffer = DllStructCreate("byte[" & $x & "]") EndIf ;~ Dim $out, $i = 0, $result For $i = 1 To $parts Select Case $i = 101 And $last > 0 $x = $last EndSelect Local $ai_FTPread = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetReadFile', 'ptr', $ai_ftpopenfile[0], 'ptr', DllStructGetPtr($buffer), 'int', $x, 'dword*', $out) If @error Or $ai_FTPread[0] = 0 Then $ai_InternetCloseHandle = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetCloseHandle', 'ptr', $ai_ftpopenfile[0]) FileClose($fhandle) SetError(-4) Return 0 EndIf FileWrite($fhandle, BinaryMid(DllStructGetData($buffer, 1), 1, $ai_FTPread[4])) Switch $FunctionToCall Case "" ProgressSet($i) Case Else Select Case $parts = 1 $result = 100 Case $i = 101 $result = 100 Case Else $result = $i EndSelect $ret = Call($FunctionToCall, $result) Select Case $ret <= 0 $ai_InternetCloseHandle = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetCloseHandle', 'ptr', $ai_ftpopenfile[0]) ;~ DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'FtpDeleteFile', 'hwnd', $l_FTPSession, 'str', $s_RemoteFile) FileClose($fhandle) FileDelete($s_LocalFile) SetError(-6) Return $ret EndSelect EndSwitch Sleep(10) Next FileClose($fhandle) #EndRegion DataSend If $FunctionToCall = "" Then ProgressOff() #Region disconnect $ai_InternetCloseHandle = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetCloseHandle', 'ptr', $ai_ftpopenfile[0]) If @error Or $ai_InternetCloseHandle[0] = 0 Then SetError(-5) Return 0 EndIf #EndRegion disconnect Return 1 EndFunc ;==>_FTP_DownloadProgress ;=============================================================================== ; Function Name: _FTPOpenFile() ; Description: Initiates access to a remote file on an FTP server for reading or writing. Use _FTPCloseFile() ; to close the ftp file. ; Parameter(s): $hConnect - The long from _FTPConnect() ; $lpszFileName - String of the ftp file to open ; $dwAccess - GENERIC_READ or GENERIC_WRITE (Default is GENERIC_READ) ; $dwFlags - Settings for the transfer see notes below (Default is 2 for FTP_TRANSFER_TYPE_BINARY) ; $dwContext - (Not Used) See notes below ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - Returns the handle to ftp file for read/write with _FTPReadFile() ; On Failure - 0 and Sets @error = -1 ;Notes: ;~ hConnect ;~ [in] Handle to an FTP session. ;~ lpszFileName ;~ [in] Pointer to a null-terminated string that contains the name of the file to be accessed. ;~ dwAccess ;~ [in] File access. This parameter can be GENERIC_READ or GENERIC_WRITE, but not both. ;~ dwFlags ;~ [in] Conditions under which the transfers occur. The application should select one transfer type and any of ; the flags that indicate how the caching of the file will be controlled. ;~ The transfer type can be one of the following values. ;~ FTP_TRANSFER_TYPE_ASCII Transfers the file using FTP's ASCII (Type A) transfer method. Control and ; formatting information is converted to local equivalents. ;~ FTP_TRANSFER_TYPE_BINARY Transfers the file using FTP's Image (Type I) transfer method. The file is ; transferred exactly as it exists with no changes. This is the default transfer method. ;~ FTP_TRANSFER_TYPE_UNKNOWN Defaults to FTP_TRANSFER_TYPE_BINARY. ;~ INTERNET_FLAG_TRANSFER_ASCII Transfers the file as ASCII. ;~ INTERNET_FLAG_TRANSFER_BINARY Transfers the file as binary. ;~ The following values are used to control the caching of the file. The application can use one or more of these values. ;~ INTERNET_FLAG_HYPERLINK Forces a reload if there was no Expires time and no LastModified time returned from the server ; when determining whether to reload the item from the network. ;~ INTERNET_FLAG_NEED_FILE Causes a temporary file to be created if the file cannot be cached. ;~ INTERNET_FLAG_RELOAD Forces a download of the requested file, object, or directory listing from the origin server, ; not from the cache. ;~ INTERNET_FLAG_RESYNCHRONIZE Reloads HTTP resources if the resource has been modified since the last time it was ; downloaded. All FTP and Gopher resources are reloaded. ;~ dwContext ;~ [in] Pointer to a variable that contains the application-defined value that associates this search with any ; application data. This is only used if the application has already called InternetSetStatusCallback to set ; up a status callback function. ; Function from http://www.autoitscript.com/forum/index.php?s=&showtopic=12473&view=findpost&p=331340 ; modified by Prog@ndy ;=============================================================================== Func _FTPOpenFile($hConnect, $lpszFileName, $dwAccess = 0x80000000, $dwFlags = 2, $dwContext = 0) Local $ai_ftpopenfile = DllCall($GLOBAL_FTP_WININETHANDLE, 'hwnd', 'FtpOpenFile', _ 'hwnd', $hConnect, _ ;HINTERNET hConnect 'str', $lpszFileName, _ ;LPCTSTR lpszFileName 'udword', $dwAccess, _ ;DWORD dwAccess 'dword', $dwFlags, _ ;DWORD dwFlags 'dword', $dwContext) ;DWORD_PTR dwContext If @error Or $ai_ftpopenfile[0] == 0 Then SetError(-1) Return 0 EndIf Return $ai_ftpopenfile[0] EndFunc ;==>_FTPOpenFile ;=============================================================================== ; Function Name: _FTPReadFile() ; Description: Reads data from a handle opened by _FTPOpenFile() ; Parameter(s): $h_File - Handle returned by _FTPOpenFile to the ftp file ; $dwNumberOfBytesToRead - Number of bytes to read ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - Returns the binary/string read. ; On Failure - 0 and Sets @error = -1 for end-of-file, @error = 1 for other errors ;Notes: (InternetReadFile() parameters) ;~ hFile ;~ [in] Handle returned from a previous call to InternetOpenUrl, FtpOpenFile, GopherOpenFile, or HttpOpenRequest. ;~ lpBuffer ;~ [out] Pointer to a buffer that receives the data. ;~ dwNumberOfBytesToRead ;~ [in] Number of bytes to be read. ;~ lpdwNumberOfBytesRead ;~ [out] Pointer to a variable that receives the number of bytes read. InternetReadFile sets this value to zero before doing any work or error checking. ; Function from http://www.autoitscript.com/forum/index.php?s=&showtopic=12473&view=findpost&p=331340 ; modified by Prog@ndy ;=============================================================================== Func _FTPReadFile($h_File, $dwNumberOfBytesToRead) Local $s_FileRead = "" Local $lpBuffer = DllStructCreate("byte[" & $dwNumberOfBytesToRead & "]") Local $ai_FTPReadFile = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetReadFile', _ 'hwnd', $h_File, _ ;HINTERNET hFile 'ptr', DllStructGetPtr($lpBuffer), _ ;LPVOID lpBuffer 'dword', $dwNumberOfBytesToRead, _ ;DWORD dwNumberOfBytesToRead 'dword*', 0) ;LPDWORD lpdwNumberOfBytesRead If @error Then $lpBuffer = 0 $lpdwNumberOfBytesRead = 0 Return SetError(1, 0, 0) EndIf Local $lpdwNumberOfBytesRead = $ai_FTPReadFile[4] If $lpdwNumberOfBytesRead == 0 And $ai_FTPReadFile[0] == 1 Then $lpBuffer = 0 Return SetError(-1, 0, 0) ElseIf $ai_FTPReadFile[0] == 0 Then $lpBuffer = 0 Return SetError(2, 0, 0) EndIf If $dwNumberOfBytesToRead > $lpdwNumberOfBytesRead Then $s_FileRead = BinaryMid(DllStructGetData($lpBuffer, 1), 1, $lpdwNumberOfBytesRead) ;index is omitted so the entire array is written into $s_FileRead as a BinaryString Else $s_FileRead = DllStructGetData($lpBuffer, 1) ;index is omitted so the entire array is written into $s_FileRead as a BinaryString EndIf $lpBuffer = 0 $lpdwNumberOfBytesRead = 0 SetExtended($lpdwNumberOfBytesRead) Return $s_FileRead EndFunc ;==>_FTPReadFile ;=============================================================================== ; Function Name: _FTPCloseFile() ; Description: Closes the Handle returned by _FTPOpenFile. ; Parameter(s): $l_InternetSession - The handles from _FTPOpenFile.() ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 Sets @error = -1 ; Function from http://www.autoitscript.com/forum/index.php?s=&showtopic=12473&view=findpost&p=331340 ; modified by Prog@ndy ;=============================================================================== Func _FTPCloseFile($l_InternetSession) Local $ai_InternetCloseHandle = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetCloseHandle', 'hwnd', $l_InternetSession) If @error Or $ai_InternetCloseHandle[0] = 0 Then SetError(-1) Return 0 EndIf Return $ai_InternetCloseHandle[0] EndFunc ;==>_FTPCloseFile #cs typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[MAX_PATH]; TCHAR cAlternateFileName[14]; } WIN32_FIND_DATA; typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME; HINTERNET FtpFindFirstFile( HINTERNET hConnect, LPCTSTR lpszSearchFile, LPWIN32_FIND_DATA lpFindFileData, DWORD dwFlags, DWORD_PTR dwContext ); #ce ;=============================================================================== ; ; Function Name: _FTPFileFindFirst() ; Description: Find First File on an FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_RemoteFile - The remote Location for the file. ; $l_Flags - use the dwFlags parameter to specify 1 for transferring the file in ASCII (Type A transfer method) or 2 for transferring the file in Binary (Type I transfer method). ; $l_Context - lContext is used to identify the application context when using callbacks. Since we’re not using callbacks we’ll pass 0. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - an array with element [0] = 11 ; On Failure - array with element [0] = 0 ; Author(s): Dick Bronsdijk ; Modified: Prog@ndy ; ; ReturnArray: ; [0] - Number of elements ; [1] - File Attributes ; [2] - Creation Time Low ; [3] - Creation Time Hi ; [4] - Access Time Low ; [5] - Access Time Hi ; [6] - Last Write Low ; [7] - Last Write Hi ; [8] - File Size High ; [9] - File Size Low ; [10] - File Name ; [11] - Altername ; ;=============================================================================== Func _FTPFileFindFirst($l_FTPSession, $s_RemotePath, ByRef $h_Handle, ByRef $l_DllStruct, $l_Flags = 0, $l_Context = 0);flag = 0 changed to 2 to see if stops hanging ;~ Local $str = "int;uint[2];uint[2];uint[2];dword;dword;dword;dword;char[256];char[14]" ;~ $l_DllStruct = DllStructCreate($str) $l_DllStruct = DllStructCreate($tagWIN32_FIND_DATA) If @error Then SetError(-2) Return "" EndIf Local $a_FTPFileList[1] $a_FTPFileList[0] = 0 Local $ai_FTPFirstFile = DllCall($GLOBAL_FTP_WININETHANDLE, 'hwnd', 'FtpFindFirstFile', 'hwnd', $l_FTPSession, 'str', $s_RemotePath, 'ptr', DllStructGetPtr($l_DllStruct), 'long', $l_Flags, 'long', $l_Context) If @error Or $ai_FTPFirstFile[0] = 0 Then SetError(-1) Return $ai_FTPFirstFile EndIf $h_Handle = $ai_FTPFirstFile[0] ;~ $FileName = DllStructGetData($l_DllStruct, 9) ;~ ConsoleWrite($FileName & @CRLF) Local $a_FTPFileList[12] $a_FTPFileList[0] = 11 $a_FTPFileList[1] = DllStructGetData($l_DllStruct, 1) ; File Attributes $a_FTPFileList[2] = DllStructGetData($l_DllStruct, 2, 1) ; Creation Time Low $a_FTPFileList[3] = DllStructGetData($l_DllStruct, 2, 2) ; Creation Time High $a_FTPFileList[4] = DllStructGetData($l_DllStruct, 3, 1) ; Access Time Low $a_FTPFileList[5] = DllStructGetData($l_DllStruct, 3, 2) ; Access Time High $a_FTPFileList[6] = DllStructGetData($l_DllStruct, 4, 1) ; Last Write Low $a_FTPFileList[7] = DllStructGetData($l_DllStruct, 4, 2) ; Last Write High $a_FTPFileList[8] = DllStructGetData($l_DllStruct, 5) ; File Size High $a_FTPFileList[9] = DllStructGetData($l_DllStruct, 6) ; File Size Low $a_FTPFileList[10] = DllStructGetData($l_DllStruct, 9); File Name $a_FTPFileList[11] = DllStructGetData($l_DllStruct, 10) ; Altername Return $a_FTPFileList EndFunc ;==>_FTPFileFindFirst ;=============================================================================== ; ; Function Name: _FTPFileFindNext() ; Description: Find Next File on an FTP server. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect() ; $s_RemoteFile - The remote Location for the file. ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - WIN32_FIND_DATA as array, see above ; On Failure - 0 and @error = -1 ; Author(s): Dick Bronsdijk ; Modified: Prog@ndy ; ;=============================================================================== Func _FTPFileFindNext($h_Handle, ByRef $l_DllStruct) Local $a_FTPFileList[1] $a_FTPFileList[0] = 0 Local $ai_FTPPutFile = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetFindNextFile', 'hwnd', $h_Handle, 'ptr', DllStructGetPtr($l_DllStruct)) If @error Or $ai_FTPPutFile[0] = 0 Then SetError(-1) Return $a_FTPFileList EndIf Local $a_FTPFileList[12] $a_FTPFileList[0] = 11 $a_FTPFileList[1] = DllStructGetData($l_DllStruct, 1) ; File Attributes $a_FTPFileList[2] = DllStructGetData($l_DllStruct, 2, 1) ; Creation Time Low $a_FTPFileList[3] = DllStructGetData($l_DllStruct, 2, 2) ; Creation Time High $a_FTPFileList[4] = DllStructGetData($l_DllStruct, 3, 1) ; Access Time Low $a_FTPFileList[5] = DllStructGetData($l_DllStruct, 3, 2) ; Access Time High $a_FTPFileList[6] = DllStructGetData($l_DllStruct, 4, 1) ; Last Write Low $a_FTPFileList[7] = DllStructGetData($l_DllStruct, 4, 2) ; Last Write High $a_FTPFileList[8] = DllStructGetData($l_DllStruct, 5) ; File Size High $a_FTPFileList[9] = DllStructGetData($l_DllStruct, 6) ; File Size Low $a_FTPFileList[10] = DllStructGetData($l_DllStruct, 9); File Name $a_FTPFileList[11] = DllStructGetData($l_DllStruct, 10) ; Altername Return $a_FTPFileList EndFunc ;==>_FTPFileFindNext ;=============================================================================== ; ; Function Name: _FTPFileTimeLoHiToStr() ; Description: Get FileTime String ; Parameter(s): ; Requirement(s): DllCall, date.au3 ; Return Value(s): On Success - Date ; On Failure - "" (empty String) ; Author(s): Prog@ndy ; ;=============================================================================== Func _FTPFileTimeLoHiToStr($LoDWORD, $HiDWORD) Local $FileTime = DllStructCreate("dword;dword") If Not $LoDWORD And Not $HiDWORD Then Return SetError(1, 0, "") DllStructSetData($FileTime, 1, $LoDWORD) DllStructSetData($FileTime, 2, $HiDWORD) Local $date = _Date_Time_FileTimeToStr($FileTime) Return SetError(@error, @extended, $date) EndFunc ;==>_FTPFileTimeLoHiToStr ;=============================================================================== ; ; Function Name: _FTPFileSizeLoHi() ; Description: Get FileSize ; Parameter(s): ; Return Value(s): Size ; Author(s): Prog@ndy ; ;=============================================================================== Func _FTPFileSizeLoHi($LoDWORD, $HiDWORD) Return BitOR(BitShift($LoDWORD, -32), BitAND($HiDWORD, 0xFFFFFFFF)) EndFunc ;==>_FTPFileSizeLoHi ;=============================================================================== ; ; Function Name: _FTPFileFindClose() ; Description: Delete FindFile Structure. ; Parameter(s): ; Requirement(s): DllCall, wininet.dll ; Return Value(s): On Success - 1 ; On Failure - 0 ; Author(s): Dick Bronsdijk ; Modified: Prog@ndy ; ;=============================================================================== Func _FTPFileFindClose($h_Handle, ByRef $l_DllStruct) $l_DllStruct = 0 Local $ai_FTPPutFile = DllCall($GLOBAL_FTP_WININETHANDLE, 'int', 'InternetCloseHandle', 'hwnd', $h_Handle) If @error Or $ai_FTPPutFile[0] = 0 Then SetError(-1) Return "" EndIf Return $ai_FTPPutFile[0] EndFunc ;==>_FTPFileFindClose Edited July 28, 2009 by H3x
Developers Jos Posted July 28, 2009 Developers Posted July 28, 2009 You haven't explained how you actually do the upload. SciTE4AutoIt3 Full installer Download page  - Beta files    Read before posting   How to post scriptsource   Forum etiquette Forum Rules  Live for the present, Dream of the future, Learn from the past.Â
H3x Posted July 28, 2009 Author Posted July 28, 2009 Anyone? Anything? I just need to know if there's something wrong with my code or if there's a limit to the file sizes for _FTP() =/
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now