Gibt es InetGetDate oder vergleichbares?

  • Hallo Zusammen,

    mit InetGetSize kann man ja die Größe einer Datei ermitteln, egal ob http oder ftp, und mit InetGet kann ich die Datei runterladen.

    Ich würde aber gerne anschliessend das Dateidatum auf das Datum umsetzen, was sie auf dem FTP-Server hat.

    In der neuen Beta-Version 3.3.5.1 habe ich auch nichts gefunden. Gibt es sowas nicht und wenn nein, kann ich das irgendwie anders realisieren?

    Besten Dank im voraus!
    R@iner

    Einmal editiert, zuletzt von skyteddy (7. Februar 2010 um 19:41)

  • Genau das ist ja das Problem, daß die heruntergeladene Datei das Datum hat, zu dem Zeitpunkt, wo der Download abgeschlossen wurde.

    Ich muß irgendwie das Datum/Uhrzeit der Datei auf dem Server "auslesen" und dann die runtergeladene Datei mit FileSetTime umsetzen.

    Happy computing!
    R@iner

  • datum und uhrzeit steht im header habs dir eben fertig gemacht war easy

    Spoiler anzeigen
    [autoit]

    Func _HTTPGetDate($Host = 'www.google.de', $TimeOutLimit = 10000)
    TCPStartup()
    Local $Win[2]
    Local $Net[2]
    Local $Respones
    Local $Head = 'HEAD / HTTP/1.1' & @CRLF & _
    'Host: ' & $Host & @CRLF & _
    'Connection: keep-alive' & @CRLF & _
    'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0' & @CRLF & @CRLF

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

    If Ping($Host, 2000) <= 0 Then
    $Win[0] = @MDAY & '.' & @MON & '.' & @YEAR
    $Win[1] = @HOUR & ':' & @MIN & ':' & @SEC
    Return $Win
    EndIf

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

    $Socket = TCPConnect(TCPNameToIP($Host), 80)
    If $Socket = -1 Then
    TCPCloseSocket($Socket)
    Return SetError(1, 0, -1)
    EndIf

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

    $SendHead = TCPSend($Socket, $Head)
    If @error Or $SendHead = 0 Then Return SetError(2, 1, 0)

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

    $InitTimer = TimerInit()
    Do
    $CurrentRvLine = TCPRecv($Socket, 16)
    If $CurrentRvLine <> '' Then $Respones &= $CurrentRvLine
    Until @error <> 0 Or TimerDiff($InitTimer) >= $TimeOutLimit
    TCPCloseSocket($Socket)
    TCPShutdown()

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

    $sRespones = StringSplit($Respones, @CRLF, 2)
    If Not IsArray($sRespones) Then Return SetError(3, 2, 0)

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

    For $i = 0 To UBound($sRespones) -1
    If StringInStr($sRespones[$i], 'Date:') Then
    $siRespones = StringSplit($sRespones[$i], ' ', 2)
    $Net[0] = $siRespones[2] & '.' & $siRespones[3] & '.' & $siRespones[4]
    $Net[1] = $siRespones[5]
    ExitLoop
    EndIf
    Next

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

    Return $Net
    EndFunc

    [/autoit]

    gibt ein array zurück
    und wenn keine internet verbindung vorhanden ist gibt er die system zeit zurück
    ps hab dein beitrag nicht verstanden ich denk aber das du das meinst^^

    Einmal editiert, zuletzt von dpjeezy89 (6. Februar 2010 um 01:39)

  • Hallo,

    danke für Deinen Code, aber das funktioniert leider nicht.

    Mein Wunsch ist ne Funktion, die mir das FileDatum der Datei auf dem Server zurück liefert.

    Also FileGetSize() liefert mir die Größe der Datei und ich hätte gerne das vergleichbar mit "FileGetDate()", oder wie die Funktion auch immer heissen mag :)

    Machen wir es anhand von 2 konkreten Beispielen:

    FTP:
    Geh auf folgende Seite: ftp://ftp.avm.de/fritz.box/frit…rmware/deutsch/
    Jetzt siehst Du 2 Dateien, die Firmware und die info.txt

    Local $erg = _HTTPGetDate("ftp://ftp.avm.de/fritz.box/fritzbox.fon_wlan_7270/firmware/deutsch/FRITZ.Box_Fon_WLAN_7270.54.04.80.image")
    _ArrayDisplay($erg) ; Sollte folgendes irgendwie rauskommen: 15.12.2009, 10:16:00


    HTTP:
    Geh auf folgende Seite: http://download.avm.de/fritz.box/frit…rmware/deutsch/
    Jetzt siehst Du ebenfalls 2 Dateien, die Firmware und die info.txt

    Local $erg = _HTTPGetDate("http://download.avm.de/fritz.box/fritzbox.fon_wlan_7270/firmware/deutsch/FRITZ.Box_Fon_WLAN_7270.54.04.80.image")
    Auch ohne http:// funktioniert es nicht.
    Local $erg = _HTTPGetDate("download.avm.de/fritz.box/fritzbox.fon_wlan_7270/firmware/deutsch/FRITZ.Box_Fon_WLAN_7270.54.04.80.image")
    _ArrayDisplay($erg) ; Sollte folgendes irgendwie rauskommen: 15.12.2009, 11:16:00 (Achtung: +1 Stunde)


    Alle Arrays zeigen mir das aktuelle Datum an, nicht aber das gewünschte Datum/Uhrzeit der Datei auf dem Server.

    Besten Dank und viele Grüße!
    R@iner

  • hm
    müsste doch über _INetGetSource machbar sein
    dann einfach denn datum raus filtern
    is jz nicht die beste methode aber wohl die einfachste
    müsste man für jeden ftp server neu machen

    was auch geht is die dll von nBit (nBit easy ftp) Referencen sind dabei
    funkt dann halt bei jedem server^^

    für die _INetGetSource variante könnte ich dir auf die schnelle n beispiel machen
    mit der nBit dll eher morgen

  • ftp_ex.au3 von prog@ndy, da ist alles benötigte drin

    [autoit]


    $FileInfo = _FtpFileFindFirst($ftpConnect, "test.exe", $handle, $DllRect) ;datei auf dem server

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

    $date_serverfile = filedatenumber(_FTPFileTimeLoHiToStr($FileInfo[6], $FileInfo[7])) ;datum serverfile

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

    Func filedatenumber($time) ;wandelt 23.04.2007 23:12:55 in 20070423231256 als zahl (kein string!)
    $numbertime = Number(StringMid($time, 7, 4) & StringMid($time, 1, 2) & StringMid($time, 4, 2) & StringMid($time, 12, 2) & StringMid($time, 15, 2) & StringMid($time, 18, 2))
    Return $numbertime
    EndFunc ;==>filedatenumber

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

    ;===============================================================================
    ;
    ; Function Name: _FTPFileTimeLoHiToStr()
    ; Description: Get FileTime String
    ; Parameter(s):
    ; Requirement(s): DllCall, date.au3
    ; Return Value(s): On Success - Date
    ; On Failure - "" (empty String)
    ; Author(s): Prog@ndy
    ;
    ;===============================================================================
    Func _FTPFileTimeLoHiToStr($LoDWORD, $HiDWORD)
    Local $FileTime = DllStructCreate("dword;dword")
    If Not $LoDWORD And Not $HiDWORD Then Return SetError(1, 0, "")
    DllStructSetData($FileTime, 1, $LoDWORD)
    DllStructSetData($FileTime, 2, $HiDWORD)
    Local $date = _Date_Time_FileTimeToStr($FileTime)
    Return SetError(@error, @extended, $date)
    EndFunc ;==>_FTPFileTimeLoHiToStr

    [/autoit]
  • Das ist jetzt auch bei AutoIt direkt dabei:

    [autoit]

    #include <FTPEx.au3>
    ...
    Dim $handle
    $aFile = _FTP_FindFileFirst($ftpConnection, "dateiname", $handle)
    _FTP_FindFileClose($handle)
    ;$aFile hat jetzt die Datei-Infos
    MsgBox(0,"Datum", _FTP_FileTimeLoHiToStr($aFile[2], $aFile[3], 1))
    ...

    [/autoit]


    (Der Code ist unvollständig, du musst noch die FTP-Verbindung aufbauen und wieder schließen, die Hilfe bringt dich weiter)

  • Hallo,

    besten Dank, damit könnte ich den Teil mit ftp-Files lösen. Wie kann ich das bei http-Links machen? Gibt es da auch eine Lösung oder ne Idee,

    Besten Dank und viele Grüße!
    R@iner

  • Für HTTP musst du es selbst auslesen: Müsste die Zeile mit Last-Modified sein ;)

    Spoiler anzeigen
    [autoit]

    ConsoleWrite(_InetGetHeader('http://mirrors.kernel.org/gentoo/releases/amd64/10.1/livedvd-amd64-multilib-10.1.iso') & @CR)

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

    Func _InetGetHeader($sURL)
    ; Author: MrCreatoR ( http://www.autoitscript.com/forum/index.ph…ndpost&p=770895 )
    ; Modified: Prog@ndy
    TCPStartup()
    Local $sHost = StringRegExpReplace($sURL, ".*://(.*?)/.*", "\1")
    Local $sPage = StringRegExpReplace($sURL, ".*://.*?(/.*)", "\1")
    Local $sName_To_IP = TCPNameToIP($sHost)
    Local $iSocket = TCPConnect($sName_To_IP, 80)
    If $iSocket = -1 Then
    TCPShutdown()
    Return SetError(1, 0, "")
    EndIf
    Local $sCommand = "HEAD " & $sPage & " HTTP/1.1" & @CRLF
    $sCommand &= "Host: " & $sHost & @CRLF
    $sCommand &= "User-Agent: AutoIt/" & @AutoItVersion & " (Windows; U; Windows NT 5.1; en-US; rv:1.8.1)" & @CRLF
    $sCommand &= "Referer: " & $sHost & @CRLF
    $sCommand &= "Connection: close" & @CRLF & @CRLF
    Local $BytesSent = TCPSend($iSocket, $sCommand)
    If $BytesSent = 0 Then
    TCPShutdown()
    Return SetError(2, @error, 0)
    EndIf
    Local $sRecv = "", $sCurrentRecv
    While 1
    $sCurrentRecv = TCPRecv($iSocket, 512)
    If @error <> 0 Or StringRight($sRecv,4)=@CRLF&@CRLF Then ExitLoop
    If $sCurrentRecv <> "" Then $sRecv &= $sCurrentRecv
    WEnd
    TCPCloseSocket($iSocket)
    TCPShutdown()
    Return $sRecv
    EndFunc ;==>_InetGetSizeEx

    [/autoit]
  • Hallo Andy,

    hab mich heute mal dem Thema angenommen und Deinen Beispiel-Code genommen.

    Bei Downloads via http vom AVM-Server bekomme ich brav das Last-Modification-Date und ich kann das auch rausfiltern.
    Beispiel-File: http://www.avm.de/de/Service/Ser…labor-16352.zip

    Wenn ich jetzt aber eine Datei via http vom Telekom-Server runterladen will, werden mir die Infos im Header erst garnicht angezeigt :(
    Beispiel-File: http://hilfe.telekom.de/dlp/eki/downlo…v34.04.57.image

    Muss der Aufruf/Header irgendwie modifiziert werden?

    Besten Dank schon mal!
    R@iner

  • Jeder Server liefert unterschiedliche Header. Du kannst da gar nichts machen. Folgendes bekomme ich bei deiner Testdatei:

    Zitat

    HTTP/1.1 302 Found
    Date: Thu, 25 Feb 2010 15:36:24 GMT
    Server: Apache
    Location: http://www.t-home.de/dlp/eki/downlo…v34.04.57.image
    Content-Type: text/html; charset=iso-8859-1
    Connection: close


    Folge ich dem Location-Header, gibt es das: (Der Location-header im Zusammenhang mit Status 302:Found gibt an, dass der Server die Datei unter einem anderen Namen gefunen hat und der browser die neue Adresse aufrufen muss)

  • Wie sagst Du so schön in Deinem Footer:

    "Jetzt, wo ich weiß wie es geht, versteh ich auch die Gebrauchsanleitung"

    Dass da ein unterschiedlicher Link drin steht fällt mir jetzt erst auf.

    VIelen Dank Andy und viele Grüße!
    R@iner

    PS: In dem "Thanks to:" meines Programmes biste eh schon lange aufgeführt!