Ziemlich verzwicktes FTP-Problem

  • Folgender Code hat viele Fehler, die ich selbst nicht finde!

    Fehlerhafter Code
    [autoit]

    $dirname = guictrlread($Input1)&guictrlread($Input2)
    ConsoleWrite("3:"&@error&@CRLF)
    $dirname2 = guictrlread($Input1)&" "&guictrlread($Input2)
    ConsoleWrite("4:"&@error&@CRLF)
    _FTPMakeDir($Open, $dirname)
    ConsoleWrite("5:"&@error&@CRLF)
    _FileCreate(@tempdir&"post.pf")
    ConsoleWrite("6:"&@error&@CRLF)
    _FTPPutFile($Open, @tempdir&"post.pf", ""&$dirname&"/post.pf")
    ConsoleWrite("7:"&@error&@CRLF)
    _FTPGetFile($Open, "nm.pf", @tempdir&"\nm.pf")
    ConsoleWrite("8:"&@error&@CRLF)
    _FTPDelFile($Open, "nm.pf")
    ConsoleWrite("9:"&@error&@CRLF)
    $nmtemp = FileOpen(@tempdir&"\nm.pf",2)
    ConsoleWrite("10:"&@error&@CRLF)
    FileWriteLine($nmtemp, $dirname2)
    ConsoleWrite("11:"&@error&@CRLF)
    _FTPPutFile($Open, @tempdir&"\nm.pf", "nm.pf")
    ConsoleWrite("12:"&@error&@CRLF)
    _FTPGetFile($Open, "mnum.pf", @tempdir&"\mnum.pf")
    ConsoleWrite("13:"&@error&@CRLF)
    _FTPDelFile($Open, "mnum.pf")
    ConsoleWrite("14:"&@error&@CRLF)
    $mnumtemp = FileOpen(@tempdir&"\mnum.pf", 2)
    ConsoleWrite("15:"&@error&@CRLF)
    $e = FileReadLine($mnumtemp, 1)
    ConsoleWrite("16:"&@error&@CRLF)
    FileWriteLine($mnumtemp, $e+1)
    ConsoleWrite("17:"&@error&@CRLF)
    _FTPPutFile($Open, @tempdir&"\mnum.pf", "mnum.pf")
    ConsoleWrite("18:"&@error&@CRLF)

    [/autoit]


    Und hier die Ausgaben von den Consolewrite´s:

    Fehleroutput

    3:0
    4:0
    5:-1
    6:0
    7:-1
    8:-1
    9:-1
    10:0
    11:0
    12:-1
    13:-1
    14:-1
    15:0
    16:-1
    17:0
    18:-1


    und hier die erwendete FTP-UDF:

    FTP.au3
    [autoit]

    ;===============================================================================;; Function Name: _FTPOpen(); Description: Opens an FTP session.; Parameter(s): $s_Agent - Random name. ( like "myftp" ); $l_AccessType - I dont got a clue what this does.; $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; Author(s): Wouter van Kesteren.;;===============================================================================
    Func _FTPOpen($s_Agent, $l_AccessType = 1, $s_ProxyName = '', $s_ProxyBypass = '', $l_Flags = 0)
    Local $ai_InternetOpen = DllCall('wininet.dll', 'long', 'InternetOpen', 'str', $s_Agent, 'long', $l_AccessType, 'str', $s_ProxyName, 'str', $s_ProxyBypass, 'long', $l_Flags)If @error OR $ai_InternetOpen[0] = 0 ThenSetError(-1)Return 0EndIf
    Return $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_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_ServerPort = 0, $l_Service = 1, $l_Flags = 0, $l_Context = 0)
    Local $ai_InternetConnect = DllCall('wininet.dll', 'long', 'InternetConnect', 'long', $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 ThenSetError(-1)Return 0EndIf
    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('wininet.dll', 'int', 'FtpPutFile', 'long', $l_FTPSession, 'str', $s_LocalFile, 'str', $s_RemoteFile, 'long', $l_Flags, 'long', $l_Context)If @error OR $ai_FTPPutFile[0] = 0 ThenSetError(-1)Return 0EndIf
    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('wininet.dll', 'int', 'FtpDeleteFile', 'long', $l_FTPSession, 'str', $s_RemoteFile)If @error OR $ai_FTPPutFile[0] = 0 ThenSetError(-1)Return 0EndIf
    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('wininet.dll', 'int', 'FtpRenameFile', 'long', $l_FTPSession, 'str', $s_Existing, 'str', $s_New)If @error OR $ai_FTPRenameFile[0] = 0 ThenSetError(-1)Return 0EndIf
    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 file name to be deleted.; 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('wininet.dll', 'int', 'FtpCreateDirectory', 'long', $l_FTPSession, 'str', $s_Remote)If @error OR $ai_FTPMakeDir[0] = 0 ThenSetError(-1)Return 0EndIf
    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('wininet.dll', 'int', 'FtpRemoveDirectory', 'long', $l_FTPSession, 'str', $s_Remote)If @error OR $ai_FTPDelDir[0] = 0 ThenSetError(-1)Return 0EndIf
    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('wininet.dll', 'int', 'InternetCloseHandle', 'long', $l_InternetSession)If @error OR $ai_InternetCloseHandle[0] = 0 ThenSetError(-1)Return 0EndIf
    Return $ai_InternetCloseHandle[0]
    EndFunc ;==> _FTPClose()

    [/autoit] [autoit][/autoit] [autoit]

    ; ================================================= FTP Functions for UDF ==========================================================

    [/autoit] [autoit][/autoit] [autoit]

    Local Const $FTP_ASCII = 1Local Const $FTP_BINARY = 2Local Const $FTP_OVERWRITE = 0Local Const $FTP_DONTOVERWRIRE = -1Local Const $FTP_PASSIVE = 0x8000000Local Const $FTP_NONPASSIVE = 0

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;; 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 - 1; On Failure - 0; Author(s): Dick Bronsdijk;;===============================================================================

    [/autoit] [autoit][/autoit] [autoit]

    #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;#ceFunc _FTPFileFindFirst($l_FTPSession, $s_RemoteFile, ByRef $h_Handle, ByRef $l_DllStruct, $l_Flags = 0, $l_Context = 0)
    Local $str = "int;uint[2];uint[2];uint[2];int;int;int;int;char[256];char[14]" $l_DllStruct = DllStructCreate($str) if @error Then SetError(-2) Return "" endif
    Dim $a_FTPFileList[1] $a_FTPFileList[0] = 0
    Local $ai_FTPPutFile = DllCall('wininet.dll', 'int', 'FtpFindFirstFile', 'long', $l_FTPSession, 'str', $s_RemoteFile, 'ptr', DllStructGetPtr($l_DllStruct), 'long', $l_Flags, 'long', $l_Context)If @error OR $ai_FTPPutFile[0] = 0 Then SetError(-1) Return $a_FTPFileListEndIf $h_Handle = $ai_FTPPutFile[0] $FileName = DllStructGetData($l_DllStruct, 9)
    Dim $a_FTPFileList[12] $a_FTPFileList[0] = 12 $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 - 1; On Failure - 0; Author(s): Dick Bronsdijk;;===============================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func _FTPFileFindNext($h_Handle, $l_DllStruct)
    Dim $a_FTPFileList[1] $a_FTPFileList[0] = 0
    Local $ai_FTPPutFile = DllCall('wininet.dll', 'int', 'InternetFindNextFile', 'long', $h_Handle, 'ptr', DllStructGetPtr($l_DllStruct))If @error OR $ai_FTPPutFile[0] = 0 Then SetError(-1) Return $a_FTPFileListEndIf
    Dim $a_FTPFileList[12] $a_FTPFileList[0] = 12 $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: _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;;===============================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func _FTPFileFindClose($h_Handle, $l_DllStruct)
    ;~ DllStructDelete($l_DllStruct)
    Local $ai_FTPPutFile = DllCall('wininet.dll', 'int', 'InternetCloseHandle', 'long', $h_Handle)If @error OR $ai_FTPPutFile[0] = 0 Then SetError(-1) Return ""EndIf
    Return $ai_FTPPutFile[0]
    EndFunc;==> _FTPFileFindClose()
    ;===============================================================================;; Function Name: _FTPGetFile() - db Test; Description: Gets an file from an FTP server.; Parameter(s): $l_FTPSession - The Long from _FTPConnect(); $s_RemoteFile - The remote Location for the file.; $s_LocalFile - The local 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_Fail - Allow local file to be overwritten if it exists; - -1 Don't allow overwrite (default); - 0 Allow overwrite; $l_Attributes - Attributes for local file; $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 - 1; On Failure - 0; Author(s): Dick Bronsdijk;;===============================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func _FTPGetFile($l_FTPSession, $s_RemoteFile, $s_LocalFile, $l_Flags = 2, $l_Fail = -1, $l_Attributes = 0, $l_Context = 0)
    Local $ai_FTPGetFile = DllCall('wininet.dll', 'int', 'FtpGetFile', 'long', $l_FTPSession, 'str', $s_RemoteFile, 'str', $s_LocalFile, 'long', $l_Fail, 'long', $l_Attributes, 'long', $l_Flags, 'long', $l_Context) If @error OR $ai_FTPGetFile[0] = 0 Then SetError(-1) Return 0 EndIf
    Return $ai_FTPGetFile[0]
    EndFunc;==> _FTPGetFile()

    [/autoit]

    Danke für eure Hilfe!

    Einmal editiert, zuletzt von campweb (6. Mai 2011 um 22:04)

  • wenn Du es schaffst aus deinem Code-Schnipsel ein Script zu machen
    das zumindest im Ansatz lauffähig wäre,
    würde sich sicher auch jemand die Mühe machen und es Korrektur lesen ;)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    über mich...

    ich habe meine Erfahrungen hauptsächlich gesammelt in (grobe Übersicht):

    - RibbonBar Automation
    - MySQL Nutzung
    - GUIs in vielerlei Ausprägung
    - Nutzung von Powershell / Batch in AutoIt
    - Windows Automatisierung

    außerhalb von AutoIt:

    - Sprachen: PS, Batch, php, html(5), javascript, (perl eingeschränkt), vbs
    - Powershell (AD, WPF inkl. Multi-Threading, ...)
    - Deployment-Automatisierung ohne SCCM
    - Office-Nutzung mit COM-Object (AutoIt, PowerShell)
    - ActiveDirectory und alles was damit zusammenhängt
    - Hyper-V Clustering (Converged / Hyper Converged)
    - Serverhardware (Konfiguration, Aufbau, Architektur, Betrieb)

    Lieblingsthema:

    günstige Automatisierung von Vorgängen, für die andere Firmen viel Geld nehmen

    more to come ...

  • der fehler muss im syntax dieses schnipsels sein. Die verbindung wird korrekt aufgebaut, inzwischen habe ich alle Probleme behoben, außer _FTPGetFile() das funktioniert noch nicht. Die Standard Include kennt _WinAPI_GetLastError nicht, auch wenn WinAPIError und/oder WinAPI.au3 included ist, warum auch immer, der Rest des Scripts würde bei Veröffentlihcung gegen das Datenschutzgesetz verstoßen.

  • álso beim groben drüber schauen:

    [autoit]


    ConsoleWrite("5:"&@error&@CRLF)
    _FileCreate(@tempdir&"post.pf") ; da fehlt der '\'
    ConsoleWrite("6:"&@error&@CRLF)
    _FTPPutFile($Open, @tempdir&"post.pf", ""&$dirname&"/post.pf"); Leerzeichen in FTP-Ordnern , hmmm

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    über mich...

    ich habe meine Erfahrungen hauptsächlich gesammelt in (grobe Übersicht):

    - RibbonBar Automation
    - MySQL Nutzung
    - GUIs in vielerlei Ausprägung
    - Nutzung von Powershell / Batch in AutoIt
    - Windows Automatisierung

    außerhalb von AutoIt:

    - Sprachen: PS, Batch, php, html(5), javascript, (perl eingeschränkt), vbs
    - Powershell (AD, WPF inkl. Multi-Threading, ...)
    - Deployment-Automatisierung ohne SCCM
    - Office-Nutzung mit COM-Object (AutoIt, PowerShell)
    - ActiveDirectory und alles was damit zusammenhängt
    - Hyper-V Clustering (Converged / Hyper Converged)
    - Serverhardware (Konfiguration, Aufbau, Architektur, Betrieb)

    Lieblingsthema:

    günstige Automatisierung von Vorgängen, für die andere Firmen viel Geld nehmen

    more to come ...