Funktion _FTPPutFolderContents()

  • Hallo zusammen,


    blöde frage am Rande, hat jemand mal die Funktion _FTPPutFolderContents() überprüft?

    Bin ich blond oder stimmt da was net?

    Egal wie ich die FUnktion aufrufe es funktioniert nicht.

    Z.b so

    $Ftpp = _FTPPutFolderContents($Conn,"C:\Program Files\", "\",1) oder so

    $Ftpp = _FTPPutFolderContents($Conn,"C:\Program Files\", "/",1)


    es klappt einfach nicht. Hat jemand eine Idee?

  • Das ist die Funktion:

    [autoit]

    Func _FTPPutFolderContents($l_InternetSession, $s_LocalFolder, $s_RemoteFolder, $b_RecursivePut)
    Local $search, $file
    ; Shows the filenames of all files in the current directory.
    $search = FileFindFirstFile($s_LocalFolder & "\*.*")

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

    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    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)
    EndFunc ;==>_FTPPutFolderContents

    [/autoit]


    Ich denke das Problem liegt hier:

    _FTPPutFile($l_InternetSession, $s_LocalFolder & "\" & $file, $s_RemoteFolder & "/" & $file, 0, 0)

    z.b so: $Ftpp = _FTPPutFolderContents($Conn,"C:\Program Files\asd\asd.txt", "/neu/",1)

    WEnn Ich die Funktion _FTPPutFile() einzeln aufrufe (sprich Ohne die obere Funktion) und einen Ordner mitgebe funktioniert das nicht.


    Hier nochmals die Funktion PutFile()

    [autoit]

    Func _FTPPutFile($l_FTPSession, $s_LocalFile, $s_RemoteFile, $l_Flags = 0, $l_Context = 0)

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

    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 Then
    SetError(-1)
    Return 0
    EndIf

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

    Return $ai_FTPPutFile[0]

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

    EndFunc ;==>_FTPPutFile

    [/autoit]
  • [autoit]

    Func _FTPPutFolderContents($l_InternetSession, $s_LocalFolder, $s_RemoteFolder, $b_RecursivePut)

    [/autoit]
    Zitat

    Egal wie ich die FUnktion aufrufe es funktioniert nicht.
    Z.b so
    $Ftpp = _FTPPutFolderContents($Conn,"C:\Program Files\", "\",1) oder so
    $Ftpp = _FTPPutFolderContents($Conn,"C:\Program Files\", "/",1)


    ...kann auch nicht...

    [autoit]

    $search = FileFindFirstFile($s_LocalFolder & "\*.*")

    [/autoit]


    Hast du den Local Folder schon mal ohne das abschließende "\" eingegeben?

  • das habe ich auch schon festgestellt.

    Nur mal so ne frage, funktioniert die FUnktion bei jemanden???

  • Hallo nochmals,

    also ich habe folgendes herausgefunden:

    wenn ich z.b im FTP Root bin und dort einen order anlege, z.b neu

    und dann die Funktion MakeDir aufrufe und dann sage Ordner erstelle ASD in neu dann macht er es nicht.

    WEnn ich zuvor sage, SetCurrentdir(neu) und dann nur mit Makedir das ASD verzeichnis erstelle geht es.

    Das heißt ich müsste immer mit SetCurrentdir das aktuelle verzeichnis laden und dann den unterordner erstellen.

    vllt hilft es jemanden.....

    das ganze ist mir auch mit PutFile aufgefallen..

    Befinde ich mich z.b im Root und möchte eine Datei unter /neu/asd/ reinschieben dann geht es nicht.

    Wenn ich zuvor ein Setcurrentdir mache und dann die Datei hochlade mit /test.txt (ohen Pfad) funktioniert es...

  • Hallo,

    Zitat

    WEnn ich zuvor sage, SetCurrentdir(neu) und dann nur mit Makedir das ASD verzeichnis erstelle geht es.

    Das heißt ich müsste immer mit SetCurrentdir das aktuelle verzeichnis laden und dann den unterordner erstellen.


    Ja, das ist das Vorgehen beim Erstellen von Unterverzeichnissen in dieser Funktion zzt. Aber das schöne an einer Programmiersprache ist, daß man die Funktionen nach seinen eigenen Bedürfnissen ändern kann. Also los und ändere die Funktion so, daß auch mehrere bisher nicht vorhandene Unterverzeichnisse erstellt werden :thumbup:
    Das "rekursiv"-Flag ist ja schon vorhanden ;)

    ciao
    .Andy

  • Ok keiner will mir helfen schnief,

    naja also ich hab mich jetzt mal hingesetzt und habe alles überprüft und ein paar Fehler in der Funktion gefunden.

    Hier meine Funktion:

    [autoit]

    Func _FTPPutFolderContents($l_InternetSession, $s_LocalFolder, $s_RemoteFolder, $b_RecursivePut)
    Local $search, $file
    ; Shows the filenames of all files in the current directory.
    $search = FileFindFirstFile($s_LocalFolder & "\*.*")

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

    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($s_LocalFolder & "\" & $file), "D") Then
    _FTPMakeDir($l_InternetSession, $file)
    If $b_RecursivePut Then
    _FtpSetCurrentDir($l_InternetSession, $file)
    _FTPPutFolderContents($l_InternetSession, $s_LocalFolder & "\" & $file, "/", $b_RecursivePut)
    _FtpSetCurrentDir($l_InternetSession, "../")

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

    EndIf
    Else
    _FTPPutFile($l_InternetSession, $s_LocalFolder & "\" & $file, $file, 0, 0)
    EndIf
    WEnd
    ; Close the search handle
    FileClose($search)
    EndFunc ;==>_FTPPutFolderContents

    [/autoit]


    Überprüft doch mal bitte ob da alles i.O ist.

    Zumindest legt er mal die Ordner so an wie die original strucktur! Juhu

  • Hallo,
    So funktioniert es (auch mit leeren Ordnern)

    Spoiler anzeigen
    [autoit]

    $s_LocalFolder = @ScriptDir & "\test" ; Quelle: enthält mehrere Ordner + Dateien und auch leere Ordner
    $s_RemoteFolder = "//daten/testordner" ;Ziel: Verzeichnis auf FTP-Server
    _FTPPutFolderContents($ftpconnect, $s_LocalFolder, $s_RemoteFolder, 1)
    Exit

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

    Func _FTPPutFolderContents($l_InternetSession, $s_LocalFolder, $s_RemoteFolder, $b_RecursivePut)
    Local $search, $file
    ; 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) ; "No files/directories matched the search pattern or empty directory",3)
    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 ;==>_FTPPutFolderContents2

    [/autoit]


    ciao
    .Andy