InetGet() Problem mit Cache?

  • Hallo zusammen.

    Ich habe folgendes Problem:
    Auf einem Server habe ich eine Textdatei (http://fractal.ohost.de/worker.ini)
    Mein Skript soll nun diese Datei herunterladen, die erste 0 die es findet in eine 1 verwandeln und wieder hochladen.
    Außerdem lasse ich mir die Zeile geben in welcher die Null gefunden wurde.
    Das klappt soweit auch astrein. Beim ersten Versuch wird die Zeile 1 angegeben.
    Führe ich es dann wieder aus, wird aber wieder Zeile 1 angegeben. Auf dem Server ist die Datei jedoch schon längst neu hochgeladen(im Browser und über
    Filezilla einsehbar) und es sollte natürlich beim zweiten Ausführen Zeile 2 angegeben werden. Das passiert aber erst, wenn ich das Skript 5-6 mal ausgeführt habe. Oder manchmal
    muss ich noch öfter. Nun hab ich mich auf Fehlersuche gemacht und festgestellt, dass zwar die Datei so wie es soll auf dem Server vorliegt, dass die erste Zeile direkt nach beenden des Skripts 1|1 heißt,
    aber via InetGet() wird eine Datei heruntergeladen in der die erste Zeile 1|0 heißt, also quasi die alte Version. Kann es sein, dass da auf eine art Cache zugegriffen wird?

  • ich kann dieses problem bestätigen und habe dann einfach abhilfe geschaffen, in dem ich einfach einen zufallswerte anhänge... das sieht das so aus:

    [autoit]

    $random = Random(1000, 9999, 1)
    InetGet("http://meinserver.de/?pidget=1"&"&login="&$eMail&"&pass="&$Password&"&cache="&$random, @TempDir & "\file.txt", 1, 0)

    [/autoit]

  • Auch dir würde ich das Lesen der Hilfe empfehlen. :D

    na ja, wie du an meinem befehl siehst, habe ich den parameter zum erneuten laden angegeben ... das meinst du doch sicher:
    "1 = Erzwingt ein erneutes Laden von der Remote-Seite"
    das hat bei mir nie funktioniert ... zumindest in der 3.3.6 irgendwas ... bei 3.3.8.1 hab ich noch nicht getestet ob es da anders ist.

  • na ja, wie du an meinem befehl siehst, habe ich den parameter zum erneuten laden angegeben


    Ok, sorry, den Parameter habe ich übersehen...
    Dann funktioniert das ja vielleicht wirklich nicht, würde mich nicht wundern.

    Edit: So gesehen ist die Idee mit der Variable mit dem zufälligen Inhalt natürlich super. :thumbup:

  • Okay, dann hier mal der Quelltext:


    [autoit]


    #include <File.au3>
    #include <FTP.au3>

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

    Global $server = 'xxxx' ; Server Login Zeugs
    Global $username = 'xxxx'
    Global $pass = 'xxxx'
    Global $path = @ScriptDir&'\'

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

    Global $ini = 'worker.ini'
    InetGet("http://fractal.ohost.de/"&$ini,$ini,1,0) ; Datei herunterladen
    $fileread = FileOpen(@ScriptDir&'\'&$ini,0)

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

    If @Error = -1 Then
    MsgBox (0,"Error", 'Could not open worker.ini. Make sure you still have it in your program folder.')
    EndIf

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

    ; Richtige Zeile finden
    $eval = 0
    $line = 1
    Tooltip("1")
    While $eval = 0
    If StringRight(FileReadLine($fileread,$line),1)==0 Then
    $eval = 1
    Elseif FileReadLine($fileread,$line)='' Then
    MsgBox(0,"Oh My!","All Frames are reservated or finished rendering.")
    $eval = 1
    Else
    $line = $line+1
    EndIf
    WEnd
    FileClose($fileread)
    MsgBox(0,'Test',$line) ; Überprüfen ob die richtige Line gefunden wurde

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

    $filewrite = @ScriptDir&'\'&$ini
    _FileWriteToLine($filewrite,$line,($line &'|'& '1'),1) ; Zeile auf x|1 setzen.

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

    ; Neue Version auf Server laden
    $Open = _FTPOpen('MyFTP Control')
    $Conn = _FTPConnect($Open, $server, $username, $pass)
    $Ftpp = _FtpPutFile($Conn, $path&$ini, '/'&$ini)
    $Ftpc = _FTPClose($Open)

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

    ; Lokale Datei löschen
    FileDelete($path&$ini)

    [/autoit][autoit][/autoit][autoit][/autoit]
  • okay, dein problem ist mit meinem workaround nicht zu lösen, da du direkt runterlädtst .... ich hab noch php dazwischen..... was spricht bei dir dagegen die datei vor dem laden einmal mit filedelete zu löschen ?

  • Also ich starte mein Skript im Moment und die Datei wird dann heruntergeladen, dann entsprechend bearbeitet, hochgeladen
    und wie in der letzten Zeile zu sehen ist lokal gelöscht. Wo genau liegt sie denn noch, dass ich sie lokal löschen könnte?

  • im arbeitsspeicher evtl... aber versuch mal das:

    [autoit]

    #include <File.au3>
    #include <FTP.au3>

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

    Global $server = 'xxxx' ; Server Login Zeugs
    Global $username = 'xxxx'
    Global $pass = 'xxxx'
    Global $path = @ScriptDir&'\'
    ;&"&cashe="&$random
    Global $ini = 'worker.ini'
    $random = Random(1000, 9999, 1)
    $rini = $random&$ini
    InetGet("http://fractal.ohost.de/"&$ini,$rini,1,0) ; Datei herunterladen
    $fileread = FileOpen(@ScriptDir&'\'&$rini,0)

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

    If @Error = -1 Then
    MsgBox (0,"Error", 'Could not open worker.ini. Make sure you still have it in your program folder.')
    EndIf

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

    ; Richtige Zeile finden
    $eval = 0
    $line = 1
    Tooltip("1")
    While $eval = 0
    If StringRight(FileReadLine($fileread,$line),1)==0 Then
    $eval = 1
    Elseif FileReadLine($fileread,$line)='' Then
    MsgBox(0,"Oh My!","All Frames are reservated or finished rendering.")
    $eval = 1
    Else
    $line = $line+1
    EndIf
    WEnd
    FileClose($fileread)
    MsgBox(0,'Test',$line) ; Überprüfen ob die richtige Line gefunden wurde

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

    $filewrite = @ScriptDir&'\'&$rini
    _FileWriteToLine($filewrite,$line,($line &'|'& '1'),1) ; Zeile auf x|1 setzen.

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

    ; Neue Version auf Server laden
    $Open = _FTPOpen('MyFTP Control')
    $Conn = _FTPConnect($Open, $server, $username, $pass)
    $Ftpp = _FtpPutFile($Conn, $path&$rini, '/'&$ini)
    $Ftpc = _FTPClose($Open)

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

    ; Lokale Datei löschen
    FileDelete($path&$rini)

    [/autoit]
  • Danke erstmal, klappt aber leider auch nicht. Scheinbar wird die Datei wirklich irgendwo für eine Weile gehalten.

  • versuch mal das hier in dein original einzubauen (einfach irgendwo am anfang reinkopieren :(

    [autoit]

    $ClearID = "8"
    Run("RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess " & $ClearID)

    [/autoit]

    wenn es dann geht, dann ist es definitiv ein cache problem (wie vermutet)

  • Das hatte ich in einem anderen Forum auch gefunden aber das nützt leider auch nichts. :s

  • dann bin ich überfragt .... ich würde tippen, dass der IE im cache (arbeitsspeicher) schaut, sobald eine URL identisch einer zuvor aufgerufenen ist ... könntest du deine URL individualisieren (wie ich es anfangs vorgeschlagen hab bzw es selber mache), hättest du das problem nicht.
    ich sehe folgende lösungen:
    1. server auf PHP umstellen und machen wie ich
    2. rausfinden was es mit dem IE cache im ram auf sich hat und schauen ob man den irgendwie beeinflussen kann wie den cache der auf der platte anfällt.
    3. benutzen einer anderen methode: gibt es nicht sowas wie _FTPGetFile ??? (keine Ahnung) oder ähnliches um dateien zu saugen ?
    4. jemand verrät das geheimnis der inetget - funktion ;)

    Einmal editiert, zuletzt von WhiteLion (25. März 2013 um 13:05)

  • Meine Vermutung ist, dass die Datei noch nicht geschrieben wurde nach dem download. Deshalb empfehle ich mal ein Sleep(5000) auszuprobieren.

    InetGet("http://fractal.ohost.de/"&$ini,$rini,1,0) ; Datei herunterladen
    Sleep(5000) ; oder auch länger
    $fileread = FileOpen(@ScriptDir&'\'&$rini,0)