Erweiterte FTP-Funktionen - FTP.au3 / FTP_Ex.au3

      Erweiterte FTP-Funktionen - FTP.au3 / FTP_Ex.au3

      Diese UDFs sind eine Sammlung von Funktionen zur Arbeit mit FTP - Servern.
      Seit AutoIt v3.3.2.0 ist diese UDF in abgewandelter Form als FTPEx.au3 enthalten.

      Aus diesem Thread: [ gelöst ] FTPUpload per InternetWriteFile hat sich eine erweiterte FTP.au3 entwickelt. Ich nenne sie mal FTP_Ex.au3 :)
      Sie basiert auf der More_FTP.au3
      und bringt eine neue Funktion _FTP_UploadProgress() mit.
      _FTP_UploadProgress() wurde von limette für TextDateien geschrieben und von mir auf beliebige Dateien angepasst
      Beispiel

      AutoIt-Quellcode

      1. #include <Misc.au3>
      2. #include "FTP_Ex.au3"
      3. $serv = "ftp.site.de"
      4. $user = "user"
      5. $pass = "passwort"
      6. $FTP = _FTPOpen("AutoIt v3")
      7. $FTPServer = _FTPConnect($FTP,$serv,$user,$pass,1)
      8. ProgressOn("Upload","Uploading file [Cancel with F8]")
      9. $x = _FTP_UploadProgress($FTPServer, "D:\Dokumente\Dateien von Andreas\Eigene Bilder\1.jpg", 'testdatei.jpg', "_UpdateParts")
      10. ProgressSet(100,"Return: " & $x & @CRLF & "Error: " & @error)
      11. Sleep(2000)
      12. ProgressOff()
      13. _FTPClose($FTPServer)
      14. _FTPClose($FTP)
      15. Func _UpdateParts($percent)
      16. ProgressSet($percent,$percent &"%")
      17. If _IsPressed("77") Then Return 0
      18. Return 1 ; bei 1 Fortsetzten
      19. Endfunc

      Beschreibung

      AutoIt-Quellcode

      1. ;===============================================================================
      2. ;
      3. ; Function Name: _FTP_UploadProgress()
      4. ; Description:: Uploadsd a file in Binary Mode and shows Progress in Tooltip or by Calling a User defined Function
      5. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect()
      6. ; $s_LocalFile - The local file.
      7. ; $s_RemoteFile - The remote Location for the file.
      8. ; $FunctionToCall - [Optional] A function which can update a Progressbar and
      9. ; react on UserInput like Click on Abort or Close App.
      10. ; (More info in the end of this comment)
      11. ; Requirement(s): ??
      12. ; Return Value(s): Success: 1
      13. ; Error: 0 and @error:
      14. ; -3 -> Create File failed
      15. ; -4 -> Write to file failed
      16. ; -5 -> Close File failed
      17. ; Upload aborted by PercentageFunc:
      18. ; ReturnValue: Return of Called Function
      19. ; And @error -6
      20. ; Author(s): limette, Prog@ndy
      21. ;
      22. ; Information about $FunctionToCall:
      23. ; Parameter: $Percentage - The Percentage of Progress
      24. ; Return Values: Continue Download - 1
      25. ; Abort Download - 0 Or negative
      26. ; These Return Values are returned by _FTP_UploadProgress, too,
      27. ; so you can react on different Actions like Aborting by User, closing App or TimeOut of whatever
      28. ; Examples:
      29. ;~ Func _UpdateProgress($Percentage)
      30. ;~ ProgressSet($percent,$percent &"%")
      31. ;~ If _IsPressed("77") Then Return 0 ; Abort on F8
      32. ;~ Return 1 ; bei 1 Fortsetzten
      33. ;~ Endfunc
      34. ;
      35. ;~ Func _UpdateProgress($Percentage)
      36. ;~ GUICtrlSetData($ProgressBarCtrl,$percent)
      37. ;~ Switch GUIGetMsg()
      38. ;~ Case $GUI_EVENT_CLOSE
      39. ;~ Return -1 ; _FTP_UploadProgress Aborts with -1, so you can exit you app afterwards
      40. ;~ Case $Btn_Cancel
      41. ;~ Return 0 ; Just Cancel, without special Return value
      42. ;~ EndSwitch
      43. ;~ Return 1 ; Otherwise contine Upload
      44. ;~ Endfunc
      45. ;
      46. ;===============================================================================
      47. ;
      _FTP_DownloadProgress

      AutoIt-Quellcode

      1. ;===============================================================================
      2. ;
      3. ; Function Name: _FTP_DownloadProgress()
      4. ; Description:: Downloads a file in Binary Mode and shows Progress in Tooltip or by Calling a User defined Function
      5. ; Parameter(s): $l_FTPSession - The Long from _FTPConnect()
      6. ; $s_LocalFile - The local file to create.
      7. ; $s_RemoteFile - The remote source file.
      8. ; $FunctionToCall - [Optional] A function which can update a Progressbar and
      9. ; react on UserInput like Click on Abort or Close App.
      10. ; (More info in the end of this comment)
      11. ; Requirement(s): ??
      12. ; Return Value(s): Success: 1
      13. ; Error: 0 and @error:
      14. ; -1 -> Local file couldn't be created
      15. ; -3 -> Open RemoteFile failed
      16. ; -4 -> Read from Remotefile failed
      17. ; -5 -> Close RemoteFile failed
      18. ; Download aborted by PercentageFunc:
      19. ; ReturnValue: Return of Called Function
      20. ; And @error -6
      21. ; Author(s): limette, Prog@ndy
      22. ;
      23. ; Information about $FunctionToCall:
      24. ; Parameter: $Percentage - The Percentage of Progress
      25. ; Return Values: Continue Download - 1
      26. ; Abort Download - 0 Or negative
      27. ; These Return Values are returned by _FTP_DownloadProgress, too,
      28. ; so you can react on different Actions like Aborting by User, closing App or TimeOut of whatever
      29. ; Examples:
      30. ;~ Func _UpdateProgress($Percentage)
      31. ;~ ProgressSet($percent,$percent &"%")
      32. ;~ If _IsPressed("77") Then Return 0 ; Abort on F8
      33. ;~ Return 1 ; bei 1 Fortsetzten
      34. ;~ Endfunc
      35. ;
      36. ;~ Func _UpdateProgress($Percentage)
      37. ;~ GUICtrlSetData($ProgressBarCtrl,$percent)
      38. ;~ Switch GUIGetMsg()
      39. ;~ Case $GUI_EVENT_CLOSE
      40. ;~ Return -1 ; _FTP_UploadProgress Aborts with -1, so you can exit you app afterwards
      41. ;~ Case $Btn_Cancel
      42. ;~ Return 0 ; Just Cancel, without special Return value
      43. ;~ EndSwitch
      44. ;~ Return 1 ; Otherwise contine Upload
      45. ;~ Endfunc
      46. ;
      47. ;===============================================================================
      48. ;


      //Edit: > Das DllOPen ist in dieser FTP.au3 schon fest integriert, wodurch auch die Funktionen (warscheinlich nur messbar) schneller werden sollte
      //Edit: > Bugfix in _FTPGetCurrentDir, thxknuddelgrisu (sven)
      //Edit: > Bugfix: FTPFileGetSize funktionierte nicht.
      ......... > Hinzugefügt: _FTP_DownloadProgress
      //Edit: _FTPFile funktionen :)
      //Edit: _FTPFileListTo2D Array gefixt :)
      //Edit: 5.12.08: _FTPFindFile... besser dokumentiert und 2 neue funktionen:
      ..... _FTPFileSizeLoHi()
      ..... _FTPFileTimeLoHiToStr()
      //Edit: 7.12.08: _FTPGetFile hatte falsche Parameter
      ........ vergessen Variable nach Copy&Paste zu ändern :(
      //Edit: 13.02.09: Ein paar bugs gefixt.
      //Edit: 16.02.09: Ein paar bugs gefixt.
      //Edit: ein paar Stichworte für die Suche: FTP_Ex, FTPEx, FTP

      Seit AutoIt v3.3.2.0 ist diese UDF in abgewandelter Form als FTPEx.au3 enthalten.
      (Für die, die es immer nich nicht verstanden haben: Der Download ist nur für ältere AutoIt-Versionen geeignet. Durch die Integration der UDF in das AutoIt-Paket ist dieser Download nicht mehr kompatibel.)

      alte Downloads: 391 mal heruntergeladen
      Dateien
      • FTP_Ex.au3

        (55,8 kB, 2.481 mal heruntergeladen, zuletzt: )

      "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"
      Antworten auf Hilfegesuche per PN werden nicht garantiert.

      Dieser Beitrag wurde bereits 16 mal editiert, zuletzt von „progandy“ ()

      _FTP_UploadProgress() wurde von limette für TextDateien geschrieben


      Das hört sich ja an als wäre das Absicht gewesen, dass das nur mit Textdateien läuft ;)
      Nett formuliert =)

      mfg limette
      There are only 10 types of people in the world:
      Those who understand binary - and those who don't.
      Hi.

      Habe da en Problem mi deiner UDF. Wenn ich die benutze bekomme ich folgenden Fehler.

      C:\Program Files\AutoIt3\Include\FTP_Ex.au3(1261,32) : WARNING: $File: possibly used before declaration.

      Bei der vorherigen Version hatte ich den Fehler nicht.

      Edit: Fehler kommt bei deinem Beispielscript von dem Beitrag [ offen ] FTPconnect
      MfG Raupi

      Meine UDF´S:
      WM_Notify per Funktion UDF zum Anzeigen von Hilfetexten und einer Uhr in der Statusbar.Anzeige einer Uhr in der Menüzeile
      GIF,JPG und BMP Dateien aus Resource laden.
      Array aus Dll-Datei laden UDF zum schreiben und lesen von Array´s in(aus) ein(em) INI-File
      LUA Script zum erstellen eines Funktionsheaders.
      Tipp: Zum bearbeiten von DLL Dateien kann man den XN Resource Editor benutzen, ist besser als Reshacker

      Sokrates schrieb:

      "Wer weiß, dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß."

      Werner Krauß schrieb:

      Der Witz ist das Erdgeschoss des Humors, die Satire der Erste Stock, die Ironie der Zweite, der Sarkasmus das Mansardenstübchen.
      Ja. jetzt gehts wieder :thumbup: . Ist auch eine Super UDF nur mal so nebenbei bemerkt. :thumbup: :thumbsup: Mach weiter so.
      MfG Raupi

      Meine UDF´S:
      WM_Notify per Funktion UDF zum Anzeigen von Hilfetexten und einer Uhr in der Statusbar.Anzeige einer Uhr in der Menüzeile
      GIF,JPG und BMP Dateien aus Resource laden.
      Array aus Dll-Datei laden UDF zum schreiben und lesen von Array´s in(aus) ein(em) INI-File
      LUA Script zum erstellen eines Funktionsheaders.
      Tipp: Zum bearbeiten von DLL Dateien kann man den XN Resource Editor benutzen, ist besser als Reshacker

      Sokrates schrieb:

      "Wer weiß, dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß."

      Werner Krauß schrieb:

      Der Witz ist das Erdgeschoss des Humors, die Satire der Erste Stock, die Ironie der Zweite, der Sarkasmus das Mansardenstübchen.
      hallo zusammen,

      suche schon länger eine möglichkeit daten per ftp von einem server zu holen und lokal zu speichern!
      da auf diesem server, im verzeichnis xy minütlich daten geschrieben werden, muss dass abholen über eine file liste gesteuert werden!

      praktisch über ftp_filelisttoarray!

      theoretisch würde ich es so machen --> mit server verbinden --> downloadpfad übergeben --> dateien in array lesen --> dateien, die im array stehen downloaden --> nach erfolgreichem download file vom server löschen!

      benutze gerade die ftp.au3 und habe mal folgend angefangen!
      bekomme hier aber keine files aufgelistet, sondern nur die msgbox: "Folder Empty", "No Files Found "

      Spoiler anzeigen

      AutoIt-Quellcode

      1. #include <Misc.au3>
      2. ;#include <FTP_Ex.au3>
      3. #include <array.au3>
      4. #include <FTP.au3>
      5. $server = 'xxxxxxxx'
      6. $username = 'xxxx'
      7. $pass = 'xxxx'
      8. $path = '/Data/www/'
      9. $Open = _FTPOpen('FTP')
      10. $Conn = _FTPConnect($Open, $server, $username, $pass, 1)
      11. MsgBox(0,"",$Conn)
      12. $setdir = _FTPSetCurrentDir($Conn, $path)
      13. MsgBox(0,"",$setdir)
      14. $Dirlist = _FTPFilesListToArray($Conn, 1)
      15. _ArrayDisplay($Dirlist, 'Directorys List')
      16. $Ftpc = _FTPClose($Open)
      17. $Open = _FTPOpen('FTP')
      18. $Conn = _FTPConnect($Open, $server, $username, $pass, 1)
      19. $setdir = _FTPSetCurrentDir($Conn, $path)
      20. $Fileslist = _FTPFilesListToArray($Conn, 2)
      21. _ArrayDisplay($Fileslist, 'Files List')
      22. $Ftpc = _FTPClose($Open)
      23. $Open = _FTPOpen('FTP')
      24. $Conn = _FTPConnect($Open, $server, $username, $pass, 1)
      25. $setdir = _FTPSetCurrentDir($Conn, $path)
      26. $DirFileslist = _FTPFilesListToArray($Conn, 0)
      27. _ArrayDisplay($DirFileslist, 'Directorys & Files List')
      28. $Ftpc = _FTPClose($Open)
      29. Exit




      hast einer idee bzw. lösung!

      im unteren spoiler habe ich änderungen vorgenommen und bekomme jetzt auch eine verbindung!
      der pfad wird aber noch nicht übergeben!

      Spoiler anzeigen

      AutoIt-Quellcode

      1. $path = "/Data/www/"
      2. $Open = _FTPOpen('FTP')
      3. $Conn = _FTPConnect($Open, $server, $username, $pass, 0) ; hab hier aus der 1 eine 0 gemacht
      4. MsgBox(0,"ftp connect",$Conn & @CRLF & "verbindung hergestellt")
      5. $setdir = _FTPSetCurrentDir($Conn, $path)
      6. MsgBox(0,"set dir",$setdir)
      7. $Dirlist = _FTPFilesListToArray($Conn, 1)
      8. _ArrayDisplay($Dirlist, 'Directorys List')
      9. $Ftpc = _FTPClose($Open)
      10. $Open = _FTPOpen('FTP')
      11. $Conn = _FTPConnect($Open, $server, $username, $pass, 1)
      12. $setdir = _FTPSetCurrentDir($Conn, $path)
      13. $Fileslist = _FTPFilesListToArray($Conn, 2)
      14. _ArrayDisplay($Fileslist, 'Files List')
      15. $Ftpc = _FTPClose($Open)
      16. $Open = _FTPOpen('FTP')
      17. $Conn = _FTPConnect($Open, $server, $username, $pass, 1)
      18. $setdir = _FTPSetCurrentDir($Conn, $path)
      19. $DirFileslist = _FTPFilesListToArray($Conn, 0)
      20. _ArrayDisplay($DirFileslist, 'Directorys & Files List')
      21. $Ftpc = _FTPClose($Open)
      22. Exit



      danke

      gruß gmmg
      sooo,

      bekomme jetzt die verzeichnisse angezeigt!
      es lag am passiven ftp mode!

      AutoIt-Quellcode

      1. $Open = _FTPOpen('FTP')
      2. $Conn = _FTPConnect($Open, $server, $username, $pass, 0,1,0x08000000) ; 0x08000000 setzt passiven mode
      3. MsgBox(0,"ftp connect",$Conn & @CRLF & "verbindung hergestellt")


      _FTPSetCurrentDir --> funktioniert aber bei _ArrayDisplay werden die ersten 3 buchstaben abgeschnitten! wie kann man dies beheben! etwa in der ftp.au3?
      files werden auch nur abgeschnitten aufgelistet!

      und wie kann ich denn dann die files aus dem array mit _FTPGetFile zum download ansprechen?

      vielleicht so:

      AutoIt-Quellcode

      1. For $i = 1 To $Fileslist[0]
      2. MsgBox(0,"files ++++",$Fileslist[$i])
      3. _FTPGetFile($Conn, $Fileslist[$i], "c:\test\" & $Fileslist[$i])
      4. Next

      die msgbox gibt mir die einzelnen dateien aus, wie aber schon oben erwähnt fehlt da ein teil des namens!

      bitte um hilfe .... :!:

      danke

      gruß gmmg

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „gmmg“ ()

      verwendest du jetzt meine UDF? bei mir funktioniert _FTPFilesListToArray jedenfalls.
      Spoiler anzeigen

      AutoIt-Quellcode

      1. #include<FTP/FTP_EX.au3>
      2. $server = '...'
      3. $username ='...'
      4. $pass = '...'
      5. $path = '/15/'
      6. $Open = _FTPOpen('AutoIt v3')
      7. $Conn = _FTPConnect($Open, $server, $username, $pass, 1)
      8. MsgBox(0,"",$Conn)
      9. $setdir = _FTPSetCurrentDir($Conn, $path)
      10. $Dirlist = _FTPFilesListToArray($Conn, 1)
      11. _ArrayDisplay($Dirlist, 'Directorys List')
      12. $Dirlist = _FTPFilesListToArray($Conn, 2)
      13. _ArrayDisplay($Dirlist, 'File List')
      14. $Dirlist = _FTPFilesListToArray($Conn, 0)
      15. _ArrayDisplay($Dirlist, 'Complete List')
      16. _FTPClose($Conn)
      17. _FTPClose($Open)

      //Edit: der Ordnername ist natürlich nicht in der Liste enthalten, genau so wie bei _FileListToArray in AutoIt

      "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"
      Antworten auf Hilfegesuche per PN werden nicht garantiert.
      hallo und danke für die schnelle antwort!

      probiere deine morgen vormittag mal aus!
      bekommst du denn die namen der files mit _ArrayDisplay kommplett angezeigt?
      in meiner jetzigen version "ftp.au3", hat er ja was vom namen abgeschnitten!

      und wie benutze ich denn dann die ftpgetfile? so wie ich das schon versucht habe?

      gruß gmmg
      Ich bekomme komplette namen mit meiner Version.
      Und _FTPGetFile sollte so funktionieren wie du es geschrieben hast. Wenn du eine Progressbar für die einzelnen Dateien willst, kannst du _FTP_DownloadProgress verwenden.

      "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"
      Antworten auf Hilfegesuche per PN werden nicht garantiert.
      hallo progandy,

      bekomme mit deiner version auch die kompletten namen angezeigt!
      aber ich muss bei der verbindung, bei passive mode ein true schreiben (siehe quelltext), bei einer 1 hat er zwar die verbindung hergestellt, aber nicht s aufgelistet!
      Spoiler anzeigen

      AutoIt-Quellcode

      1. #include <Misc.au3>
      2. #include <FTP_Ex.au3>
      3. #include <array.au3>
      4. $server = 'xxxxxxxxx'
      5. $username = 'xxxxxx'
      6. $pass = 'xxxxxxx'
      7. $path = '/data/www/xxxxxxxxxxx/images/'
      8. $Open = _FTPOpen('AutoIt v3')
      9. $Conn = _FTPConnect($Open, $server, $username, $pass, true)
      10. MsgBox(0,"",$Conn)
      11. $setdir = _FTPSetCurrentDir($Conn, $path)
      12. MsgBox(0,"set dir",$setdir)
      13. ;$Dirlist = _FTPFilesListToArray($Conn, 1)
      14. ;_ArrayDisplay($Dirlist, 'Directorys List')
      15. $Dirlist = _FTPFilesListToArray($Conn, 2)
      16. _ArrayDisplay($Dirlist, 'File List')
      17. For $i = 1 To $Dirlist[0]
      18. MsgBox(0,"files ++++",$Dirlist[$i])
      19. _FTPGetFile($Conn, $Dirlist[$i], "c:\test\" & $Dirlist[$i])
      20. Next
      21. ;$Dirlist = _FTPFilesListToArray($Conn, 0)
      22. ;_ArrayDisplay($Dirlist, 'Complete List')
      23. _FTPClose($Conn)
      24. _FTPClose($Open)


      hab noch folgende anforderungen:
      - wie kann ich es machen, dass eine logdatei von den heruntergeladenen dateien geschrieben wird
      - dateigröße vor download prüfen und zum file in die logdatei schreiben
      hier mal meine lösung,!
      wäre schön, wenn er täglich eine neue logdatei erstellen würde!

      Spoiler anzeigen

      AutoIt-Quellcode

      1. #include <Misc.au3>
      2. #include <FTP_Ex.au3>
      3. #include <array.au3>
      4. $strLogFilePath = ("c:\test\")
      5. $strLogFile = "bbi.log"
      6. $strLogPath = ($strLogFilePath & $strLogFile)
      7. $server = 'xxxxxxxxxxx'
      8. $username = 'xxxxxxxxxxxx'
      9. $pass = 'xxxxxxxxxxxx'
      10. $path = '/data/www/xxxxxxxxxxxxxxxxx/images/'
      11. $Open = _FTPOpen('AutoIt v3')
      12. $Conn = _FTPConnect($Open, $server, $username, $pass, true)
      13. ;MsgBox(0,"",$Conn)
      14. $setdir = _FTPSetCurrentDir($Conn, $path)
      15. ;MsgBox(0,"set dir",$setdir)
      16. ;$Dirlist = _FTPFilesListToArray($Conn, 1)
      17. ;_ArrayDisplay($Dirlist, 'Directorys List')
      18. $Dirlist = _FTPFilesListToArray($Conn, 2)
      19. ;_ArrayDisplay($Dirlist, 'File List')
      20. For $i = 1 To $Dirlist[0]
      21. ;MsgBox(0,"files ++++",$Dirlist[$i])
      22. _FTPGetFile($Conn, $Dirlist[$i], "c:\test\" & $Dirlist[$i])
      23. $filesize = _FTPGetFileSize($Conn, $Dirlist[$i])
      24. $filesizekb = ($filesize / 1024)
      25. $fskb = StringLeft($filesizekb, 5)
      26. $file = FileOpen($strLogPath, 1)
      27. FileWrite($file, $Dirlist[$i] & " -- " & $fskb & " kb" & @CR )
      28. FileClose($file)
      29. Next
      30. ;$Dirlist = _FTPFilesListToArray($Conn, 0)
      31. ;_ArrayDisplay($Dirlist, 'Complete List')
      32. _FTPClose($Conn)
      33. _FTPClose($Open)


      - die dateien nach erfolgreichen download vom ftp server löschen
      - wenn keine files zum download vorhanden, soll er auch nichts machen!
      - filegröße --> wenn 0 kb, dann fehler ausgeben! (würde ich per smtp lösen)

      hast du da einen lösungsansatz?
      für andere ist das bestimmt auch interessant :)

      danke und grüsse

      gmmg

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „gmmg“ ()

      hallo,
      hab einige probleme!

      $Dirlist = _FTPFilesListToArray($Conn, 2)
      _ArrayDisplay($Dirlist, 'File List')

      liefert die folgenden werte obwohl ftp verzeichnis leer ist!

      [0]|5
      [1]|00072423.dat
      [2]|00072437.dat
      [3]|00072438.dat
      [4]|00072439.dat
      [5]|12795251.dat

      andere unterverzeichnisse des ftp werden richtig aufgelöst!

      Fehler gefunden --> Browsercache gelöscht und schon hat er es wieder richtig angezeigt
      wie kann man zukünftig solch ein problem verhindern?

      gruß gmmg

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „gmmg“ ()

      Ich weiß nicht, wie man das mit dem browsercache verhindern kann.
      Zu deinen Fragen: Mit _NowCalcDate() kannst du jeden Tag das Datum in den DAteinamen mit einbauen.
      _FTPFilesListTo2DArray fibt ein 2D-Array mit Dateiname und Dateigröße aus.
      _FTPGetFile gibt bei Erfolg 1 zurück. Dann gibt es _FTPDelFile ;)
      und den 0-byte-Fehler kannst du ja selbst einbauen ;)

      "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"
      Antworten auf Hilfegesuche per PN werden nicht garantiert.
      so,

      hier mal meine geänderte version mit mail benachrichtigung!

      Spoiler anzeigen

      AutoIt-Quellcode

      1. #include <Misc.au3>
      2. #include <FTP_Ex.au3>
      3. #include <array.au3>
      4. #include <Date.au3>
      5. $strLogFilePath = ("c:\test\bbi\logs\")
      6. $strLogFile = "bbi_" & _NowDate() & ".log"
      7. $strLogPath = ($strLogFilePath & $strLogFile)
      8. If Not FileExists($strLogFilePath) Then DirCreate ($strLogFilePath)
      9. $server = 'xxxxxxx'
      10. $username = 'xxxxxxx'
      11. $pass = 'xxxxxxxxx'
      12. $path = '/data/www/xxxxxxxxxx/'
      13. $Open = _FTPOpen('AutoIt v3')
      14. $Conn = _FTPConnect($Open, $server, $username, $pass, true)
      15. ;MsgBox(0,"",$Conn)
      16. $setdir = _FTPSetCurrentDir($Conn, $path)
      17. ;MsgBox(0,"set dir",$setdir)
      18. ;$Dirlist = _FTPFilesListToArray($Conn, 1)
      19. ;_ArrayDisplay($Dirlist, 'Directorys List')
      20. $Dirlist = _FTPFilesListTo2DArray($Conn, 2)
      21. ;MsgBox(0,"files vorhanden?",$Dirlist[0])
      22. ;_ArrayDisplay($Dirlist, 'File List')
      23. If $Dirlist = 0 Then
      24. MsgBox(0,"", "keine Files vorhanden",1)
      25. Exit
      26. EndIf
      27. For $i = 1 To $Dirlist[0][0]
      28. ;MsgBox(0,"files ++++",$Dirlist[$i][0])
      29. IF $Dirlist[$i][1] = 0 Then ;prüfung auf fehler
      30. ;MsgBox(0,"ERROR",$Dirlist[$i][1])
      31. Sendmail() ; mail benachrichtigung bei fehler
      32. $file = FileOpen($strLogPath, 1)
      33. FileWrite($file, $Dirlist[$i][0] & " -- " & $Dirlist[$i][1] & " Byte -- ERROR" & @CR )
      34. FileClose($file) ; schließt logfile
      35. Else
      36. _FTPGetFile($Conn, $Dirlist[$i][0], "c:\test\bbi\" & $Dirlist[$i][0]) ; lädt file vom ftp server
      37. $filesizekb = ($Dirlist[$i][1] / 1024) ; rechnet in kbyte um
      38. $kilobyte = StringLeft($filesizekb, 5) ; formatiert zahl
      39. $file = FileOpen($strLogPath, 1)
      40. FileWrite($file, $Dirlist[$i][0] & " -- " & $kilobyte & " kb" & @CR )
      41. _FTPDelFile($Conn, $Dirlist[$i]) ; löscht file vom ftp server
      42. EndIf
      43. Next
      44. FileClose($file) ; schließt logfile
      45. ;$Dirlist = _FTPFilesListToArray($Conn, 0)
      46. ;_ArrayDisplay($Dirlist, 'Complete List')
      47. _FTPClose($Conn)
      48. _FTPClose($Open)
      49. Func Sendmail()
      50. Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc_1")
      51. ;##################################
      52. ; Variables
      53. ;##################################
      54. $s_SmtpServer = "10.xxxxxxx" ; address for the smtp-server to use - REQUIRED
      55. $s_FromName = @UserName ; name from who the email was sent
      56. $s_FromAddress = @UserName&"@xxxx.de" ; address from where the mail should come
      57. $s_ToAddress = "xxxx@xxxxx.de" ; destination address of the email - REQUIRED
      58. $s_Subject = "FTP BBI Download ERROR" ; subject from the email - can be anything you want it to be
      59. $as_Body = "Folgende Datei hat 0 Byte:" & @CR & @CR & $Dirlist[$i][0] ; the messagebody from the mail - can be left blank but then you get a blank mail
      60. $s_AttachFiles = "" ; the file you want to attach- leave blank if not needed
      61. $s_CcAddress = " " ; address for cc - leave blank if not needed
      62. $s_BccAddress = " " ; address for bcc - leave blank if not needed
      63. $s_Username = "xxxx" ; username for the account used from where the mail gets sent - Optional (Needed for eg GMail)
      64. $s_Password = "xxxxxxx" ; password for the account used from where the mail gets sent - Optional (Needed for eg GMail)
      65. $IPPort = 25 ; port used for sending the mail
      66. $ssl = 0 ; enables/disables secure socket layer sending - put to 1 if using httpS
      67. ;~ $IPPort=465 ; GMAIL port used for sending the mail
      68. ;~ $ssl=1 ; GMAILenables/disables secure socket layer sending - put to 1 if using httpS
      69. ;##################################
      70. ; Script
      71. ;##################################
      72. Global $oMyRet[2]
      73. Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc_1")
      74. $rc = _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body, $s_AttachFiles, $s_CcAddress, $s_BccAddress, $s_Username, $s_Password, $IPPort, $ssl)
      75. If @error Then
      76. MsgBox(0, "Error sending message", "Error code:" & @error & " Description:" & $rc)
      77. EndIf
      78. EndFunc ;==>Sendmail
      79. Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Username = "", $s_Password = "",$IPPort=25, $ssl=0)
      80. $objEmail = ObjCreate("CDO.Message")
      81. $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
      82. $objEmail.To = $s_ToAddress
      83. Local $i_Error = 0
      84. Local $i_Error_desciption = ""
      85. If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
      86. If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
      87. $objEmail.Subject = $s_Subject
      88. If StringInStr($as_Body,"<") and StringInStr($as_Body,">") Then
      89. $objEmail.HTMLBody = $as_Body
      90. Else
      91. $objEmail.Textbody = $as_Body & @CRLF
      92. EndIf
      93. If $s_AttachFiles <> "" Then
      94. Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
      95. For $x = 1 To $S_Files2Attach[0]
      96. $S_Files2Attach[$x] = _PathFull ($S_Files2Attach[$x])
      97. If FileExists($S_Files2Attach[$x]) Then
      98. $objEmail.AddAttachment ($S_Files2Attach[$x])
      99. Else
      100. $i_Error_desciption = $i_Error_desciption & @lf & 'File not found to attach: ' & $S_Files2Attach[$x]
      101. SetError(1)
      102. return 0
      103. EndIf
      104. Next
      105. EndIf
      106. $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
      107. $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
      108. $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
      109. ;Authenticated SMTP
      110. If $s_Username <> "" Then
      111. $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
      112. $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
      113. $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
      114. EndIf
      115. If $Ssl Then
      116. $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
      117. EndIf
      118. ;Update settings
      119. $objEmail.Configuration.Fields.Update
      120. ; Sent the Message
      121. $objEmail.Send
      122. If @error Then
      123. SetError(2)
      124. return $oMyRet[1]
      125. EndIf
      126. EndFunc ;==>_INetSmtpMailCom



      :P

      gruß
      gmmg

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „gmmg“ ()

      Erstmal vielen für die geniale UDF :thumbup:

      Nun zu meiner Frage:
      Ich verwende in einer Batch Datei den ftp befehl "mget *.log"
      So lädt mir FTP alle log Dateien im aktuellen Verzeichnis herunter.

      Jetzt möchte ich mit dieser UDF den gesammten Fortschritt anzeigen.

      Ich weis aber nicht wie ich es genau machen soll :(

      Ich vermute mal das ich es irgendwie mit "_FtpFileListto2DArray()" machen muss, dann den array nach log dateien durchsuchen und die grösse zusammen zählen.

      Aber wie mache ich dann weiter...
      Ich würde das in etwa so machen:
      zuerst mit _FtpFileListto2DArray die Dateiliste holen
      dann in ein neues Array die log-Dateien raussuchen
      Nun eine GUI mit 2 progressbars machen. Die erste zeigt die fertig gestellten Dateien an und die zweite den Fortschritt der aktuellen Datei.
      Daher zum Downlaod _FTP_DownloadProgress verwenden.

      Du kannst statt _FtpFileListto2DArray auch mit _FTPFileFind... - Funktionen wie mit FileFindFirstFile arbeiten ;)
      (Tipp: _FTPFileFindFirst($FTPVerbindung, "mget *.log", ...) )
      Schau dir dazu an, wie es in der _FtpFileListto2DArray gemacht wird.

      "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"
      Antworten auf Hilfegesuche per PN werden nicht garantiert.
      Ich habe mir was zusammengebastelt.
      Komplizierter gehts vermutlich kaum ;(
      Leider sieht es komisch aus wenn die Dateien unterschiedlich gross sind.
      Die Progressbar macht dann komische Sprünge :wacko:

      Werde es morgen wieder in Angriff nehmen.

      @progandy deinen Tipp verstehe ich jetzt überhaupt nicht 8|
      Könntest du mir genauer sagen wie das funktionert?

      AutoIt-Quellcode

      1. #include <Array.au3>
      2. #include <FTP_Ex.au3>
      3. $serv = "127.0.0.1"
      4. $user = "ADMIN"
      5. $pass = "admin"
      6. $FTP = _FTPOpen("TEST")
      7. $FTPServer = _FTPConnect($FTP,$serv,$user,$pass,1)
      8. _FtpSetCurrentDir($FTPServer,'logging2')
      9. ProgressOn("Download","Downloading *.log files",'', -1 , @DesktopHeight / 2 - 100)
      10. $file2Darray = _FTPFilesListTo2DArray($FTPServer)
      11. Global $filesizetot=0, $filename[1], $filesize[1], $filecount=0, $filesizeprogress=0
      12. For $i=3 To $file2Darray[0][0]
      13. If StringInStr($file2Darray[$i][0],'.log')<>0 Then
      14. $filesizetot+=$file2Darray[$i][1]
      15. _ArrayAdd($filename,$file2Darray[$i][0])
      16. _ArrayAdd($filesize,$file2Darray[$i][1])
      17. $filecount+=1
      18. EndIf
      19. Next
      20. DirCreate('logging')
      21. For $i=1 To $filecount
      22. $x=_FTP_DownloadProgress($FTPServer,'logging\' & $filename[$i],$filename[$i],'_updateprogress')
      23. Next
      24. ProgressSet(100)
      25. _FTPClose($FTPServer)
      26. _FTPClose($FTP)
      27. Sleep(2000)
      28. ProgressOff()
      29. Func _updateprogress($percent)
      30. $filesizeprogress = Round(100 / $filesizetot * ($filesizeprogress + ($filesize[$i] /100 * $percent)) + (100 / $filecount * $i),0)
      31. ProgressSet($filesizeprogress, $filename[$i] & ' ' & $percent & '%' )
      32. Return 1
      33. Endfunc

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sayen“ ()

      Sayen schrieb:

      Ich habe mir was zusammengebastelt.
      Komplizierter gehts vermutlich kaum ;(
      Leider sieht es komisch aus wenn die Dateien unterschiedlich gross sind.
      Die Progressbar macht dann komische Sprünge :wacko:

      Werde es morgen wieder in Angriff nehmen.

      @progandy deinen Tipp verstehe ich jetzt überhaupt nicht 8|
      Könntest du mir genauer sagen wie das funktionert?
      Ich dachte an so etwas:
      Spoiler anzeigen

      AutoIt-Quellcode

      1. #include <Array.au3>
      2. #include <WindowsConstants.au3>
      3. #include <FTP_Ex.au3>
      4. $serv = "127.0.0.1"
      5. $user = "ADMIN"
      6. $pass = "admin"
      7. $FTP = _FTPOpen("TEST")
      8. $FTPServer = _FTPConnect($FTP,$serv,$user,$pass,1)
      9. _FtpSetCurrentDir($FTPServer,'logging2')
      10. ; Progress erstellen
      11. $hGUI = GUICreate("FTP Dowwnload", 400, 200)
      12. $lblInfo = GUICtrlCreateLabel("Downloading *.log files", 10, 10, 380, 20)
      13. GUICtrlSetFont(-1,12,800)
      14. GUICtrlCreateLabel("Overall Progress:", 10, 40, 380, 16)
      15. GUICtrlSetFont(-1,10)
      16. $progAllFiles = GUICtrlCreateProgress(10, 60, 380, 20)
      17. GUICtrlCreateLabel("Current file:", 10, 90, 380, 15)
      18. GUICtrlSetFont(-1,10)
      19. $progCurrentFile = GUICtrlCreateProgress(10, 110, 380, 20)
      20. $lblDetails = GUICtrlCreateLabel("etset", 10, 140, 380, 50)
      21. GUICtrlSetFont(-1,10)
      22. GUISetState()
      23. ; Ende Progress
      24. $file2Darray = _FTPFilesListTo2DArray($FTPServer)
      25. Global $filesizetot=0, $filename[1], $filecount=0
      26. For $i=3 To $file2Darray[0][0]
      27. If StringInStr($file2Darray[$i][0],'.log')<>0 Then
      28. _ArrayAdd($filename,$file2Darray[$i][0])
      29. $filecount+=1
      30. EndIf
      31. Next
      32. DirCreate('logging')
      33. For $i=1 To $filecount
      34. GUICtrlSetData($progAllFiles, ($i/$filecount)*100)
      35. $x=_FTP_DownloadProgress($FTPServer,'logging\' & $filename[$i],$filename[$i],'_updateprogress')
      36. Next
      37. GUICtrlSetData($progAllFiles, 100)
      38. GUICtrlSetData($progCurrentFile,0)
      39. GUICtrlSetData($lblDetails, "Done.")
      40. _FTPClose($FTPServer)
      41. _FTPClose($FTP)
      42. Sleep(2000)
      43. ProgressOff()
      44. Func _updateprogress($percent)
      45. GUICtrlSetData($progCurrentFile,$percent)
      46. GUICtrlSetData($lblDetails, $filename[$i] & ' ' & $percent & '%' )
      47. Return 1
      48. Endfunc

      "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"
      Antworten auf Hilfegesuche per PN werden nicht garantiert.
      Habe es vor kurzem auch so ähnlich gelöst.

      Deine Lösung sieht aber viel besser aus weil es zwei progress bars hat.

      Werde deine Lösung verwenden.
      VIELEN Dank für das super Beispiel :thumbup:

      Hier noch das wo ich vor paar minuten gemacht habe falls es dich interessiert.
      Es hat nur eine Progress bar für die total Anzeige, und für die prozentanzeige pro datei wird als text ausgegeben.

      Spoiler anzeigen

      AutoIt-Quellcode

      1. #include <Array.au3>
      2. #include <FTP_Ex.au3>
      3. $serv = "127.0.0.1"
      4. $user = "ADMIN"
      5. $pass = "admin"
      6. $FTP = _FTPOpen("TEST")
      7. $FTPServer = _FTPConnect($FTP,$serv,$user,$pass,1)
      8. _FtpSetCurrentDir($FTPServer,'logging2')
      9. ProgressOn("Download","Downloading *.log files",'', -1 , @DesktopHeight / 2 - 100)
      10. $file2Darray = _FTPFilesListTo2DArray($FTPServer)
      11. Global $filename[1], $filesize[1], $filecount=0
      12. For $i=3 To $file2Darray[0][0]
      13. If StringInStr($file2Darray[$i][0],'.log')<>0 Then
      14. _ArrayAdd($filename,$file2Darray[$i][0])
      15. $filecount+=1
      16. EndIf
      17. Next
      18. DirCreate('logging')
      19. For $i=1 To $filecount
      20. $x=_FTP_DownloadProgress($FTPServer,'logging\' & $filename[$i],$filename[$i],'_updateprogress')
      21. Next
      22. ProgressSet(100)
      23. _FTPClose($FTPServer)
      24. _FTPClose($FTP)
      25. Sleep(1000)
      26. ProgressOff()
      27. Func _updateprogress($percent)
      28. ProgressSet(100/$filecount*$i,$percent & '% of ' & $filename[$i])
      29. Return 1
      30. Endfunc
      Habs rausgefunden :D

      Ich hatte verschiedenes versucht: '../logging3' oder 'cd ..' und noch ein paar andere idiotische gedanken die ich lieber nicht sage ;)

      Habe es aber jetzt hinbekommen:

      AutoIt-Quellcode

      1. _FtpSetCurrentDir($FTPServer,'logging2')
      2. _FtpSetCurrentDir($FTPServer,' ..')
      3. _FtpSetCurrentDir($FTPServer,'logging3')
    autoit.de Webutation