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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • 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

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)