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

      Beim Kompilieren mit dem Obfuscator erhalte ich folgende Fehlermeldung.
      Parameter: /sf 1 /sv 1

      Es ist die Zeile 941 von der FTP_Ex.aus die Ihm Probleme macht.
      @Progandy Hast du eine Ahnung an was es liegen könnte?
      - Iteration 1 Strip Functions result: Output 2030 lines and stripped 4692 lines
      - Iteration 2 Strip Variables result: Output 780 lines and stripped 1186 lines
      - Iteration 3 Strip Variables result: Output 760 lines and stripped 20 lines
      - Iteration 4 Start the actual Obfuscation.
      -### Obfuscation Error: Found Call() statement using unsolvable Func, which will/could lead to problems running your obfuscated script.
      >### current Func: _FTP_DownloadProgress
      C:\Users\NUNOAN~1\AppData\Local\Temp\OBs201C.tmp(298,1) Warning for line:$ret = Call($FunctionToCall, $result)

      -#############################################################################################
      -#### Obfuscator Found 1 Error(s)!!!! This means your script could have problems running properly. ####
      -#############################################################################################
      +> Source 20100 lines 427337 Characters.
      +> Stripped 5898 Func/Var lines and 13395 comment lines, Total 1075323 Characters.
      +> Saved 95% lines 251% Characters.
      +> Obfuscator v1.0.25.0 finished obfuscating 922 lines, created:D:\AutoIt\SiNVR\RemoteUpdate\RemoteUpdate_Obfuscated.au3

      In der Zeile wird mit Call eine Funktion aufgerufen. Die wird über eine Variable an die Funktion übergeben. Daher weiß der Obfuscator nicht, welche Funktion er einsetzen muss. Daher musst du, wenn du _FTP_DownloadProgress oder _FTP_UploadProgress verwendest, den Funktionsname, den du angibst von der Verschlüsselung ausschließen:

      AutoIt-Quellcode

      1. #Obfuscator_Ignore_Funcs= PROGRESSFUNC

      Dann kannst du die Warnung ignorieren. (Erst aber das Skript testen ;) )

      "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"
      Antworten auf Hilfegesuche per PN werden nicht garantiert.
      hallo ich habe ein problem und zwar will ich eine einfache txt auf einen ftp server hochladen
      (keine grafischen darstellungen des uploadprozesses)
      und habe bis jetzt nur

      servername
      user
      passwort
      hochzuladene datei

      ich hoffe ihr könnt mir das ein bischen erklären oder vielleicht sogar eine vorlage coden

      Spoiler anzeigen

      AutoIt-Quellcode

      1. #include <FTP_EX.au3>
      2. $s_ServerName = "ftpname"
      3. $s_Username = "user"
      4. $s_Password = "passwort"
      5. $s_LocalFile = "hochzuladene datei"
      6. Call ("_FTPOpen")
      7. Call ("_FTPConnect")
      8. Call ("_FTPPutFile")

      sc4ry schrieb:

      wie siehts denn mit secure connection und ssl/tls support aus? =)

      Das ist mit den Windows-Funktionen leider nicht möglich. Daher unterstützt das die UDF auch nicht und ich werd da auch nichts machen.

      "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"
      Antworten auf Hilfegesuche per PN werden nicht garantiert.
      leute, kann mir jemand sagen warum die funktion _FTP_DownloadProgress() nicht funktioniert?
      erhalte immer den fehler 0

      AutoIt-Quellcode

      1. #include <GUIConstantsEx.au3>
      2. #include <WindowsConstants.au3>
      3. #include <String.au3>
      4. #include <Array.au3>
      5. #include <FTP_Ex.au3>
      6. Global $fileFindNext[100]
      7. GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
      8. $listview = GUICtrlCreateListView("Files | Size (in Kb)", 10, 10, 200, 150)
      9. $button = GUICtrlCreateButton("Download", 75, 170, 70, 20)
      10. $host = ""
      11. $username = ""
      12. $pass = ""
      13. $Open = _FTPOpen('Giannis FTP')
      14. $Conn = _FTPConnect($Open, $host, $username, $pass)
      15. $setDir = _FtpSetCurrentDir($Conn, "")
      16. $fileList = _FTPFilesListToArray($Conn, 0)
      17. For $i = 1 To $fileList[0]
      18. $items = GUICtrlCreateListViewItem($fileList[$i] & "|" & Int (_FTPGetFileSize($Conn, $fileList[$i]) / 10000), $listview)
      19. Next
      20. GUISetState()
      21. While 1
      22. $msg = GUIGetMsg()
      23. Select
      24. Case $msg = $button
      25. $readList = GUICtrlRead(GUICtrlRead($listview))
      26. $stringExplode = _StringExplode ($readList, "|", -1)
      27. ;~ ProgressOn("Download","Downloading file",'', -1 , @DesktopHeight / 2 - 100)
      28. $fileSize = _FTPGetFileSize($Conn, $stringExplode[0])
      29. $download = _FTP_DownloadProgress($Conn, $stringExplode[0], @ScriptDir & "\" & $stringExplode[0])
      30. ;~ ProgressSet(100)
      31. ;~ ProgressOff()
      32. ;~ If $download = 1 Then
      33. ;~ MsgBox(0, "", "Successfull")
      34. ;~ Else
      35. MsgBox(0, "", $download)
      36. ;~ EndIf
      37. ;~ MsgBox(0, "listview", $stringExplode[0])
      38. Case $msg = $listview
      39. ;~ $download = _FTPGetFile($Conn, $s
      40. EndSelect
      41. WEnd
      42. ; ...
      43. $Ftpc = _FTPClose($Open)


      Wenn ich GENAU das gleiche mit _FTPGetFile() mache, funktioniert es..

      Grüsse
      +>22:27:44 Starting AutoIt3Wrapper v.2.0.0.1 Environment(Language:0407 Keyboard:00000407 OS:WIN_VISTA/Service Pack 2 CPU:X64 OS:X86)
      >Running AU3Check (1.54.14.0) from:C:\Program Files\AutoIt3
      C:\Program Files\AutoIt3\Include\FTP_Ex.au3(10,34) : ERROR: $GENERIC_READ previously declared as a 'Const'
      Global $GENERIC_READ = 0x80000000
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
      C:\Program Files\AutoIt3\Include\FTP_Ex.au3(11,35) : ERROR: $GENERIC_WRITE previously declared as a 'Const'
      Global $GENERIC_WRITE = 0x40000000
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
      F:\Selfcoded\quellcode\Silkroad Starter.au3 - 2 error(s), 0 warning(s)
      !>22:27:44 AU3Check ended.rc:2
      +>22:27:44 AutoIt3Wrapper Finished
      >Exit code: 0 Time: 0.418


      den fehler bekomme ich...

      AutoIt-Quellcode

      1. Global Const $GENERIC_READ = 0x80000000
      2. Global Const $GENERIC_WRITE = 0x40000000


      so stehen die beiden in der udf....T.T
      Welche AutoIt-Version? Welche Includes? Hin und wieder werden eben neue Konstanten in die Standard-Includes aufgenommen, die man dann in den UDFs entfernen muss.
      In der Beta 3.3.1.1 ist die UDF übrigens unter dem Namen FTPEx.au3 enthalten. Die Funktionen haben aber alle Unterstriche bekommen (z.B. _FTP_Open statt _FTPOpen).

      "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"
      Antworten auf Hilfegesuche per PN werden nicht garantiert.
      also ich komm mit dem ftp immer noch nicht klar

      ich hab ordner in denen files sind

      AutoIt-Quellcode

      1. #include <Array.au3>
      2. #include <FTP_Ex.au3>
      3. $serv = "xxx"
      4. $user = "xxx"
      5. $pass = "xxx"
      6. $open = _FTPOpen("TEST")
      7. $Conn = _FTPConnect($open,$serv,$user,$pass,1)
      8. $folders=_FTPFilesListToArray($Conn,1)
      9. _ArrayDisplay($folders)
      10. ;Folderwalk
      11. for $i=3 to $folders[0] ;Bei meinem ftp server sind die ersten 2 Ordner unsichtbar und unlöschbar deswegen fang ich bei 3 an
      12. _FTPSetCurrentDir($Conn, $folders[$i])
      13. $Files=_FTPFilesListToArray($Conn,2)
      14. _ArrayDisplay($Files)
      15. Next

      und damit bekomme ich erst alle ordner und danach 10 mal die selben files nur aus dem ersten ordner angezeigt

      was hab ich falsch gemacht?
      Hallo zusammen.

      Also ich komme, wenn es nur ein oder zwei Dateien sind die ich mal hoch laden möchte mit folgendem Script sehr gut klar. Nur wenn es denn mehr Dateien sind, dann habe ich das Problem, das es hiermit nicht gerade sehr schnell geht. Hier wäre eine Anpassung evtl. notwendig.

      Aber teste mal ob damit evtl. funktioniert.

      Spoiler anzeigen

      AutoIt-Quellcode

      1. #include<Misc.au3>
      2. #include<GUIConstantsEx.au3>
      3. $server = "home.******.dk"
      4. $user = "*****************"
      5. $password = "**************" ; !!!!!!!!!!!!!!!!!!
      6. ; Datei 1 hoch laden
      7. ProgressOn("Upload","Uploading file [Cancel with F8]")
      8. $x = _FTP_Upload( $server, $user, $password, 'public_html/testdatei.jpg' , 'E:\testdatei.jpg') ; !!!!!!!!!!!!!!!!!!
      9. ProgressSet(100,"Return: " & $x & @CRLF & "Error: " & @error)
      10. Sleep(2000)
      11. ProgressOff()
      12. ; Datei 2 hoch laden
      13. ProgressOn("Upload","Uploading file [Cancel with F8]")
      14. $x = _FTP_Upload( $server, $user, $password, 'public_html/testdatei2.jpg' , 'E:\testdatei2.jpg') ; !!!!!!!!!!!!!!!!!!
      15. ProgressSet(100,"Return: " & $x & @CRLF & "Error: " & @error)
      16. Sleep(2000)
      17. ProgressOff()
      18. Func _UpdateParts($percent)
      19. ProgressSet($percent,$percent &"%")
      20. If _IsPressed("77") Then Return 0
      21. ;~ Switch GUIGetMsg()
      22. ;~ Case $GUI_EVENT_CLOSE
      23. ;~ Return -1 ; In Upload einn Abbruch einbauen, der negative Werte als Return angibt :) dann im Haupt-Programm testen.
      24. ;~ Case $Cancel
      25. ;~ Return 0 ; bei 0 Abbruch
      26. ;~ EndSwitch
      27. Return 1 ; bei 1 Fortsetzten
      28. Endfunc
      29. Func _FTP_Upload( $server, $user, $password, $file,$FileLocal ,$FunctionToCall="")
      30. #Region connect
      31. Local $aiWinInetDLL = DllOpen("wininet.dll"), $ai_InternetCloseHandle,$parts
      32. Local $ai_InternetOpen = DllCall($aiWinInetDLL, 'long', 'InternetOpen', 'str', 'PicTransfer', 'long', 1, 'str', '', 'str', '', 'long', 0)
      33. If @error Or $ai_InternetOpen[0] = 0 Then
      34. DllClose($aiWinInetDLL)
      35. SetError(-1)
      36. Return 0
      37. EndIf
      38. Local $i_ServerPort = 0, $l_Service = 1, $l_Context = 0, $l_InternetSession = $ai_InternetOpen[0]
      39. Local $ai_InternetConnect = DllCall($aiWinInetDLL , 'long', 'InternetConnect', 'long', $l_InternetSession, 'str', $server, 'int', $i_ServerPort, 'str', $user, 'str', $password, 'long', $l_Service, 'long', 0x08000000, 'long', $l_Context)
      40. If @error Or $ai_InternetConnect[0] = 0 Then
      41. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
      42. DllClose($aiWinInetDLL)
      43. SetError(-2)
      44. Return 0
      45. EndIf
      46. Local $ai_ftpopenfile = DllCall( $aiWinInetDLL , 'long', 'FtpOpenFile', 'long', $ai_InternetConnect[0], 'str', $file, 'dword', 0x40000000, 'dword', 0x02, 'dword', 0 )
      47. If @error Or $ai_ftpopenfile[0] = 0 Then
      48. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetConnect[0])
      49. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
      50. DllClose($aiWinInetDLL)
      51. SetError(-3)
      52. Return 0
      53. EndIf
      54. #EndRegion
      55. #Region DataSend
      56. Local $fhandle = FileOpen($FileLocal,16)
      57. ;~ $buffer = FileRead( $fhandle )
      58. $glen = FileGetSize($FileLocal)
      59. $last = Mod($glen,100)
      60. $x = ($glen-$last)/100
      61. ;~ If $x = 0 Then $x = 1
      62. If $x = 0 Then
      63. $x = $last
      64. $parts = 1
      65. ElseIf $last > 0 Then
      66. $parts = 101
      67. Else
      68. $parts = 100
      69. EndIf
      70. $buffer = DllStructCreate("byte[" & $x & "]")
      71. Dim $out, $i = 0, $result
      72. For $i = 1 To $parts
      73. Select
      74. Case $i = 101 And $last > 0
      75. $x = $last
      76. EndSelect
      77. DllStructSetData($buffer,1,FileRead($fhandle,$x))
      78. Local $ai_ftpwrite = DllCall( $aiWinInetDLL , 'int', 'InternetWriteFile', 'long', $ai_ftpopenfile[0], 'ptr', DllStructGetPtr($buffer), 'int', $x, 'dword*', $out )
      79. $result += $ai_ftpwrite[4]
      80. If @error Or $ai_ftpwrite[0] = 0 Then
      81. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_ftpopenfile[0])
      82. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetConnect[0])
      83. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
      84. FileClose($fhandle)
      85. DllClose($aiWinInetDLL)
      86. SetError(-4)
      87. Return 0
      88. EndIf
      89. Switch $FunctionToCall
      90. Case ""
      91. ToolTip( $i )
      92. Case Else
      93. $Ret = Call($FunctionToCall,$i)
      94. Select
      95. Case $Ret <= 0
      96. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_ftpopenfile[0])
      97. DllCall($aiWinInetDLL, 'int', 'FtpDeleteFile', 'long', $ai_InternetConnect[0], 'str', $file)
      98. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetConnect[0])
      99. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
      100. FileClose($fhandle)
      101. DllClose($aiWinInetDLL)
      102. SetError(-6)
      103. Return $Ret
      104. EndSelect
      105. EndSwitch
      106. Sleep( 20 )
      107. Next
      108. FileClose($fhandle)
      109. #EndRegion
      110. #region disconnect
      111. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_ftpopenfile[0])
      112. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetConnect[0])
      113. $ai_InternetCloseHandle = DllCall($aiWinInetDLL , 'int', 'InternetCloseHandle', 'long', $ai_InternetOpen[0])
      114. If @error Or $ai_InternetCloseHandle[0] = 0 Then
      115. DllClose($aiWinInetDLL)
      116. SetError(-5)
      117. Return 0
      118. EndIf
      119. #EndRegion
      120. DllClose($aiWinInetDLL)
      121. Return 1
      122. EndFunc
      Lieben Gruß,

      Alina.


      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      Ich verwendet derzeitig die AutoIt-Version 3.3.12.0 und die
      Beta 3.3.11.5. Ich habe die Deutsche Hilfe auf meinem PC und
      OrganizeIncludes ist beim Scripten mein bester Freund.

      Okay? ;)
      Das:

      progandy schrieb:

      setze mal den 3. Parameter der FileList-Funktion auf $INTERNET_FLAG_RELOAD = 0x80000000 ;)

      AutoIt-Quellcode

      1. $INTERNET_FLAG_RELOAD = 0x80000000
      2. $array = _FTPFilesListTo2DArray($FTPServer,0, $INTERNET_FLAG_RELOAD)

      "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"
      Antworten auf Hilfegesuche per PN werden nicht garantiert.
      Ich habe ein Problem mit der Funktion _FTPDelFile.
      Wenn die Datei auf dem FTP 0 Byte groß ist, dann wird die Datei nicht gelöscht. Dateien die größer als 0 Byte sind, werden ganz normal gelöscht.

      Kann mir jemand weiterhelfen? Die Funktion "FtpDeleteFile" die über die UDF aufgerufen wird, hat nur 2 Parameter und keine Flags mit denen man was erreichen könnte.

      RE: _FTPDelFile

      scu schrieb:

      Ich habe ein Problem mit der Funktion _FTPDelFile.
      Wenn die Datei auf dem FTP 0 Byte groß ist, dann wird die Datei nicht gelöscht. Dateien die größer als 0 Byte sind, werden ganz normal gelöscht.

      Kann mir jemand weiterhelfen? Die Funktion "FtpDeleteFile" die über die UDF aufgerufen wird, hat nur 2 Parameter und keine Flags mit denen man was erreichen könnte.

      Da kann man nichts machen. Auch die Windows-Funktion hat keine weiteren Parameter. Als Workaround kannst du ja eine 1byte große Datei mit dem gleichen Namen hochladen und anschließend löschen ;)

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

      RE: RE: _FTPDelFile

      progandy schrieb:

      Da kann man nichts machen. Auch die Windows-Funktion hat keine weiteren Parameter. Als Workaround kannst du ja eine 1byte große Datei mit dem gleichen Namen hochladen und anschließend löschen ;)

      Hmm... Daran hatte ich bereits selbst gedacht, aber bin davon ausgegangen es geht eleganter. Naja, besser als keine Lösung. Danke für den Hinweis.

      Bei der Durchführung des obigen Workarounds bin ich auf ein neues Problem gestoßen:

      Auf meinem FTP liegen 5 ZIP-Dateien.
      file1: 142 bytes
      file2: 142 bytes
      file3: 0 bytes
      file4: 142 bytes
      file5: 142 bytes

      Eine Schleife die lediglich die Größen in die Console schreibt gibt folgendes aus:
      filesize1: 142
      filesize2: 142
      filesize3: 0
      filesize4: -1
      filesize5: -1

      Der Quellcode sieht so aus:

      Quellcode

      1. $downloading_file_max = $filelist[0]
      2. For $i = 1 to $downloading_file_max
      3. Local $filesize = _FTPGetFileSize($connection, $settings_ftp_path & $filelist[$i])
      4. ConsoleWriteError("filesize" & $i & ": " & $filesize & @CR)
      5. Next


      Der Fehler liegt in der Funktion _FTPGetFileSize. Wenn der Fall Eintritt, dass die Datei 0 bytes groß ist, wird der Handle nicht geschlossen.
    autoit.de Webutation