_FTP_FileGetSize

  • Hallo Leute,

    ich muß einmal in der Woche Firmenintern auf über 100 Server zugreifen und die Größe einer Datei checken. Hab mir dazu ein script erstellt. Nur hab ich dabei ein kleines Problem

    _FTP_FileGetSize funzt nicht ganz. Im Gegensatz zu dem Befehl FileGetSize krieg ich irgendeine Zahlenkombination daher --> aber keine Kilobytes. Gibts da irgendeine Möglichkeit??

    lg

    Jogi
    ?( ;(

    Einmal editiert, zuletzt von JoGi (27. August 2010 um 18:36)

  • Hallo JoGi.
    _FTP_FileGetSize gibt eine Zahl zurück, das sind die Bytes.
    Kannst du mit Mathematik in KB, MB etc. umwandeln ;)

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Ich checks nicht.
    Wenn ich diese besagte Datei downloade und sie mit FILEGETSIZE überprüfe dann bekomme ich als Antwort 116224 (Das sind 116 kB). So soll es sein und so ist es auch. Greife ich aber mit _FTP_FileGetsize darauf zu bekomme ich immer 4294967295. Egal ob die Datei 116kB hat oder nur 100kB. Da läuft doch garantiert was falsch. Und garantiert bin ich dran schuld :rofl: Liegt doch immer am Programmierer. ?(

    Unten der besagte Auszug aus meinem Script
    Die Variablen habe ich vorher deklariert (username und passwort)
    Einzig die IP Adressen lese ich über FileReadLine aus einem txt File aus


  • Hi,
    das Ergebnis ist ein die Dateigröße als uint64.
    Aber das ist eigentlich nur unter mysql relevant.
    Kanst du net

    [autoit]

    FileGetSize

    [/autoit]

    nutzen?

    Oder du schaust mal unter Google was "Autoit uint64" zurückgibt.

    MfG
    Der_Doc

  • Sicher kann ich FILEGETSIZE benutzen. Nur wird es daher etwas umständlicher, da ich die Datei zuerst lokal downloaden muß um diesen Befehl anwenden zu können. Mit _FTP_FileGetSize hätt ich mir den Download erspart. Im AutoItScript.com Forum steht dass es mal einen Bug bei einer Version gegeben hat. Sollte aber bereinigt sein. Und das kann bei mir nicht sein da ich die aktuellste Version benutze. Aber wie gesagt ich verstehe es nicht......

  • Das was mich am meisten wundert ist die Größe der Datei mit 4294967295, das ist nämlich 0xFFFFFFFF, sehr ungewöhnlich, da der Server im Zweifelsfall als Größe 0 zurückgibt.
    Entweder benutzt du eine nicht aktuelle FTPex.AU3, oder sonst ist irgendetwas faul.
    Funktioniert das Beispielscript aus der Hilfe zu _FTP_FileGetSize?
    Dort wird die Dateigröße des (zuerst gefundenen Verzeichnisses "Contrib" ) auch mit 0 angegeben, aber die Dateigröße von der Datei "Public-Key" wird richtigerweise mit 2201 zurückgegeben.
    Ich gehe einfach mal davon aus, daß du die bei UNIX-Servern nötige Groß/Kleinschreibung beachtest.
    Das Beispiel aus der Hilfe:

    Spoiler anzeigen
    [autoit]

    #include <FTPEx.au3>
    #include <Array.au3>

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

    $server = 'ftp.csx.cam.ac.uk'
    $username = ''
    $pass = ''

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

    $Open = _FTP_Open('MyFTP Control')
    $Conn = _FTP_Connect($Open, $server, $username, $pass)

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

    $dirset=_FTP_DirSetCurrent($Conn, "/pub/software/programming/pcre/")
    $FileSize = _FTP_FileGetSize($Conn, "Public-Key")
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$FileSize' & @lf & @lf & 'Return:' & @lf & $FileSize) ;### Debug MSGBOX

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

    Local $h_Handle
    $aFile = _FTP_FindFileFirst($Conn, "/pub/software/programming/pcre/", $h_Handle)
    _arraydisplay($afile)
    ConsoleWrite('$Filename = ' & $aFile[10] & ' attribute = ' & $aFile[1] & ' -> Error code: ' & @error & ' extended: ' & @extended & @crlf)

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

    $dirset=_FTP_DirSetCurrent($Conn, "/pub/software/programming/pcre/")
    ConsoleWrite('$dirset = ' & $dirset & ' -> Error code: ' & @error & ' extended: ' & @extended & @crlf)

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

    $FileSize = _FTP_FileGetSize($Conn, $aFile[10])
    ConsoleWrite('$Filename = ' & $aFile[10] & ' size = ' & $FileSize & ' -> Error code: ' & @error & ' extended: ' & @extended & @crlf)

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

    Local $Err, $Message
    $FileSize = _FTP_GetLastResponseInfo($Err, $Message) ; error = Contrib: Not a regular file
    ConsoleWrite('$Message = ' & $Message & ' err = ' & $Err & ' -> Error code: ' & @error & ' extended: ' & @extended & @crlf)

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

    $aFile = _FTP_FindFileNext($h_Handle)
    ConsoleWrite('$FilenameNext1 = ' & $aFile[10] & ' attribute = ' & $aFile[1] & ' -> Error code: ' & @error & ' extended: ' & @extended & @crlf)

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

    $FileSize = _FTP_FileGetSize($Conn, $aFile[10])
    ConsoleWrite('$FilenameNext1 = ' & $aFile[10] & ' size = ' & $FileSize & ' -> Error code: ' & @error & ' extended: ' & @extended & @crlf)

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

    $FileSize = _FTP_GetLastResponseInfo($Err, $Message) ; no error
    ConsoleWrite('$Message = ' & $Message & ' err = ' & $Err & ' -> Error code: ' & @error & ' extended: ' & @extended & @crlf)

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

    $FindClose = _FTP_FindFileClose($h_Handle)

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

    $Ftpc = _FTP_Close($Open)

    [/autoit]
  • Also wenn ich das Hilfescript starte schreibt er mir in die Konsole:

    $Filename = Contrib attribute = 16 -> Error code: 0 extended: 0
    $dirset = 1 -> Error code: 0 extended: 0
    $Filename = Contrib size = 0 -> Error code: -1 extended: 12003
    $Message = 200 Type set to I
    200 PORT command successful
    550 Contrib: not a regular file
    550 Contrib: Not a regular file
    err = 0 -> Error code: 0 extended: 0
    $FilenameNext1 = Public-Key attribute = 128 -> Error code: 0 extended: 0
    $FilenameNext1 = Public-Key size = 2201 -> Error code: 0 extended: 0
    $Message = 226 Transfer complete.
    err = 0 -> Error code: 0 extended: 0

    2 Mal editiert, zuletzt von JoGi (26. August 2010 um 22:07) aus folgendem Grund: Edit

  • Hab den _FTP_GetFileSize Befehl mal getauscht gegen INETGetSize.
    Komischerweise krieg ich da auch die 4294967295 zurück !!

    Wird mir wohl nichts anderes übrig bleiben als das File downloaden -
    FileGetSize und löschen....

    Da kommt wieder einiges an Datenvolumen zusammen ;(

  • Probier mal folgendes:

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <FTPEx.au3>
    #include <Array.au3>

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

    $server = 'ftp.csx.cam.ac.uk'
    $username = ''
    $pass = ''

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

    $Open = _FTP_Open('MyFTP Control')
    $Conn = _FTP_Connect($Open, $server, $username, $pass)

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

    Local $h_Handle, $aFiles[1][2] = [[0, 0]], $i = 0
    $aFile = _FTP_FindFileFirst($Conn, "/pub/software/programming/pcre/", $h_Handle)

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

    Do
    ReDim $aFiles[$i + 1][2]
    $aFiles[$i][0] = $aFile[10]
    $aFiles[$i][1] = $aFile[9]
    $i += 1
    $aFile = _FTP_FindFileNext($h_Handle)
    Until @error

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

    _ArrayPrint($aFiles)
    ;~ _ArrayDisplay($aFiles)

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

    $FindClose = _FTP_FindFileClose($h_Handle)

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

    $Ftpc = _FTP_Close($Open)

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

    ; #Function# ===========================================================================================================================================
    ; Name............: _ArrayPrint
    ; Description.....: Prints a one or two dimensional array as a table into the console or just returns the table as string
    ; Syntax..........: _ArrayPrint($aArray)
    ; Parameters......:
    ; $aArray - The Array to print; with one or two dimensions
    ; $bConsole - [optional] If False the table will not be printed to the console and only returned
    ; Return values...:
    ; Success - The table as string
    ; Failure v
    ; -1 - $aArray is not an array
    ; -2 - $aArray has more than two dimensions
    ; Author .........: FichteFoll
    ; Modified........:
    ; Remarks ........:
    ; Related ........: __Max (or _Max from Math.au3)
    ; Link ...........;
    ; Example ........; _ArrayPrint(WinList())
    ; ======================================================================================================================================================
    Func _ArrayPrint($aArray, $bConsole = True)
    If Not IsArray($aArray) Then Return -1

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

    Switch UBound($aArray, 0)
    Case 1
    Local $sLine, $sOutput = ''
    Local $aiLenMax[2] = [__Max(StringLen(String(UBound($aArray, 1) - 1)), 3), 0], _
    $acFlag[2] = ['', ''] ; "Row" = 3

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

    For $i = 0 To UBound($aArray, 1) - 1
    $aiLenMax[1] = __Max(StringLen(String($aArray[$i])), $aiLenMax[1])
    If IsString($aArray[$i]) Then $acFlag[1] = '-'
    Next

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

    ; Header
    $sLine = StringFormat('+ %' & $acFlag[0] & $aiLenMax[0] & 's + %' & $acFlag[1] & $aiLenMax[1] & 's +', 'Row', 'Content')

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

    $sOutput &= $sLine
    If Not @Compiled Then $sLine = '- ' & $sLine
    If $bConsole Then ConsoleWrite($sLine & @CRLF)

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

    ; Lines
    For $i = 0 To UBound($aArray, 1) - 1
    $sLine = StringFormat('| %' & $acFlag[0] & $aiLenMax[0] & 'd | %' & $acFlag[1] & $aiLenMax[1] & 's +', $i, StringReplace(String($aArray[$i]), "'", "\'"))

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

    $sOutput &= @CRLF & $sLine
    If Not @Compiled Then $sLine = '> ' & $sLine
    If $bConsole Then ConsoleWrite($sLine & @CRLF)
    Next

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

    ; Footer
    $sLine = '+'
    For $i = 0 To 1
    $sLine &= '-'
    For $j = 1 To $aiLenMax[$i]
    $sLine &= '-'
    Next
    $sLine &= '-+'
    Next

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

    $sOutput &= @CRLF & $sLine
    If Not @Compiled Then $sLine = '- ' & $sLine
    If $bConsole Then ConsoleWrite($sLine & @CRLF)

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

    Return $sOutput

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

    Case 2
    Local $sExec, $sLine, $sOutput = ''
    Local $aiElmts[2] = [UBound($aArray, 1), UBound($aArray, 2)], _
    $aiLenMax[$aiElmts[1] + 1], _
    $acFlag[$aiElmts[1] + 1]
    $aiLenMax[0] = __Max(StringLen(String(UBound($aArray, 1) - 1)), 3) ; "Row" = 3
    $acFlag[0] = '-'

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

    For $j = 0 To $aiElmts[1] - 1
    $aiLenMax[$j + 1] = StringLen(String(UBound($aArray, 2) - 1)) + 4 ; "Col_" = 4
    Next
    For $i = 0 To $aiElmts[0] - 1
    For $j = 0 To $aiElmts[1] - 1
    $aiLenMax[$j + 1] = __Max(StringLen(String($aArray[$i][$j])), $aiLenMax[$j + 1])
    If IsString($aArray[$i][$j]) Then $acFlag[$j + 1] = '-'
    Next
    Next

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

    ; Header
    $sExec = "StringFormat('+ %" & $acFlag[0] & $aiLenMax[0] & "s"
    For $j = 0 To $aiElmts[1] - 1
    $sExec &= " + %" & $acFlag[$j + 1] & $aiLenMax[$j + 1] & "s"
    Next
    $sExec &= " +', 'Row'"
    For $j = 0 To $aiElmts[1] - 1
    $sExec &= ", 'Col_" & $j & "'"
    Next
    $sExec &= ")"
    $sLine = Execute($sExec)

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

    $sOutput &= $sLine
    If Not @Compiled Then $sLine = '- ' & $sLine
    If $bConsole Then ConsoleWrite($sLine & @CRLF)

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

    ; Lines
    For $i = 0 To $aiElmts[0] - 1
    $sExec = "StringFormat('| %" & $aiLenMax[0] & "d"
    For $j = 0 To $aiElmts[1] - 1
    $sExec &= " | %" & $acFlag[$j + 1] & $aiLenMax[$j + 1] & "s"
    Next
    $sExec &= " |', " & $i
    For $j = 0 To $aiElmts[1] - 1
    $sExec &= ", '" & StringReplace(String($aArray[$i][$j]), "'", "\'") & "'"
    Next
    $sExec &= ")"
    $sLine = Execute($sExec)

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

    $sOutput &= @CRLF & $sLine
    If Not @Compiled Then $sLine = '> ' & $sLine
    If $bConsole Then ConsoleWrite($sLine & @CRLF)
    Next

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

    ; Footer
    $sLine = '+'
    For $i = 0 To $aiElmts[1]
    $sLine &= '-'
    For $j = 1 To $aiLenMax[$i]
    $sLine &= '-'
    Next
    $sLine &= '-+'
    Next

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

    $sOutput &= @CRLF & $sLine
    If Not @Compiled Then $sLine = '- ' & $sLine
    If $bConsole Then ConsoleWrite($sLine & @CRLF)

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

    Return $sOutput
    Case Else

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

    EndSwitch

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

    Return -2
    EndFunc ;==>_ArrayPrint

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

    Func __Max($nNum1, $nNum2)
    If $nNum1 > $nNum2 Then Return $nNum1
    Return $nNum2
    EndFunc ;==>__Max

    [/autoit]

    Und vergleich die Dateigrößen in der Konsole mit den per HTML sichtbaren: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
    Bei mir funktioniert das super, wenn es bei dir nicht funktioniert, liegt es bestimmt an deiner FTPEx.au3 oder AutoIt Version.

    PS: _ArrayDisplay hat mich irgendwie dazu inspiriert _ArrayPrint zu basteln...

    Einmal editiert, zuletzt von FichteFoll (26. August 2010 um 23:46)

  • FichteFoll, wie du aus seinem geposteten Ergebnis beim _FTP_GetFileSize()-Beispielscript sehen kannst, werden ja die richtigen Ergebnisse (u.a. Dateigrößen) ermittelt!
    Ich kann nur nicht ganz nachvollziehen, wieso er bei einer x-beliebigen Datei aus dem Internet richtige Dateigrößen erhält, und bei seinen eigenen Dateien nicht...

  • Also ich benutze die Autoitversion 3.3.6.1 und mit diesem Skript

    Spoiler anzeigen
    [autoit]


    #include <FTPEx.au3>

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

    Dim $Datei = "test.txt" ; Datei auf dem FTP Server
    Dim $Ftppath = "/ftp/" ; Ordner auf dem FTPserver

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

    ;Dim $Pfad = "d:\autoit\update\"
    Dim $server = "server"
    Dim $user = "user"
    Dim $pass = "passwort"

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

    _ftp()
    Func _ftp()

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

    $FTP_open = _FTP_Open("myftp")
    If @error Then
    MsgBox(4096, "Fehler FTP Verbindung oeffnen", "Es ist ein Fehler beim Versuch einer FTP Verbindung aufgetreten." &@CRLF& _
    "Die Anwendung wird beendet!")
    Exit
    EndIf

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

    $FTP_Connect = _FTP_Connect($FTP_open, $server, $user, $pass)
    If @error Then
    MsgBox(4096, "Fehler FTP Verbindung", "Bitte überprüfen Sie Username, Passwort oder FTPServernamen." &@CRLF& _
    "Die Anwendung wird beendet!")
    Exit
    EndIf

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

    ; TrayTip("Auf Webseite", "Datei wird hochgeladen !", 1, 2) ;~ Erfolgreich erstellt Info anzeigen
    ; sleep(2000)
    ; if _FTP_FilePut($FTP_Connect, $Pfad & $Datei, $Ftppath& $Datei) = 0 then
    ; Msgbox(0,"Achtung","Die Datei wurde nicht hochgeladen!")
    ; Else
    ; TrayTip("Auf Webseite", "Datei erfolgreich hochgeladen !", 1, 1) ;~ Erfolgreich erstellt Info anzeigen
    ; sleep(2000)
    ; EndIf

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

    $size = _FTP_FileGetSize($FTP_Connect,$Ftppath& $Datei)
    if $size = 0 then
    Msgbox(0,"Achtung","FileGetSize Fehler")
    Else
    MsgBox(0,"Ergebnis", "Dateigrösse in Byte "&$size)
    EndIf

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

    _FTP_Close($FTP_open)

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

    EndFunc

    [/autoit]

    Bekomme ich eine Dateigrösse in Byte

    MfG
    Der_Doc

  • Erst mal Danke dass Ihr so zahlreich gepostet habt. Hab mir gestern Abend noch den Kopf zerbrochen.
    Ich wollte ursprünglich nur die Größe einer Datei haben, aber ich bekam ja immer nur den Wert 4294967295. Also hab ich mal eine andere Datei auf dem Server ausgewählt. Ergebnis 4294967295. Dann hab ich mal probiert mir das ganze in Funktion _FTP_ListToArray2D schreiben zu lassen. Und siehe da es klappte. Alle Dateien wurden aufgelistet mit der richtigen Größe. ABER: Wie kann ich aus diesem Array heraus, den Dateiname, die Dateigröße und die Erstellungszeit (_FTP_ListToArrayEx) in ein txt File schreiben und abspeichern? Der Befehl _ArrayToClip funktioniert nur bei 1 Dimensionalen Arrays. Und hinzu kommt das ich mich mit Array überhaupt nicht auskenn, nicht mal weiß was das ist. Bin ein totaler Anfänger mit Autoit. Hab zwar schon ein paar Programme gemacht, aber wenn ich die euch präsentiere klatscht ihr euch auf den Kopf da ich es etwas umständlich gemacht habe....

    @ Der_Doc: Zu meinem Bedauern muß ich feststellen dass ich bei deinem Script folgende Antwort kriege --> Size: 4294967295. Und das bei allen 5 Dateien die auf den Servern liegen

    FichteFoll: In deinem Array wird alles wunderbar angezeigt, mit der tatsächlichen Größe.

  • Zitat

    Und hinzu kommt das ich mich mit Array überhaupt nicht auskenn, nicht mal weiß was das ist

    Ein Array ist nichts aufregendes, nur eine "Sammlung" von Daten, auf die mit einem Index zugegriffen wird. Wie in einer Pizzeria, wenn du die Nummer 5 bestellst, dann backt dir der Pizzabäcker nicht eine 5, sondern eine Pizza mit Salami, Käse und Schinken.
    Das Array wäre in dem Fall die Speisekarte, die Nummern der jeweilige Index des Arrays, und die Gerichte der Wert oder der Inhalt des Arrayelementes.

    [autoit]

    dim $Pizza_array[Anzahl der Gerichte]
    $Pizza_array[1]="Pizza Tomaten und Käse"
    $Pizza_array[2]="Pizza Sardellen und Thunfisch"
    $Pizza_array[3]
    ...usw usf

    [/autoit]


    um jetzt auf die Daten zuzugreifen, sprichst du das Array mit dem Index an.

    [autoit]

    filewrite($file, $Pizza_array[22]) ;schreibt die Zutaten füpr die Pizza Nummer 22 in eine Datei

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

    for $i=0 to ubound($Pizza_array)-1 ;alle Elemente im array
    filewrite($file, $Pizza_array[$i] & @crlf) ;schreibt die Zutaten aller Pizzen in eine Datei
    next

    [/autoit]

    Wenn es keine Funktionen speziell für deinen Anwendungsfall gibt, dann musst du die Elemente des Arrays selbst auslesen und in eine Datei speichern. Bugfixens TUT sollte dir weiterhelfen (s.link oben)