Warten bis (fremde) Datei fertig heruntergeladen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Warten bis (fremde) Datei fertig heruntergeladen

    Guten Tag,

    ich möchte meinen Tagesablauf etwas vereinfachen, dort muss ich öfters Dokumente herunterladen..

    Nun möchte ich mein Programm warten lassen, bis alle Dateien in einem Verzeichnis fertig heruntergeladen sind.
    Da ich den Download aber nicht selber ausführen kann, kann ich somit auch kein Webclient etc. nutzen um zu überprüfen ob diese fertig gedownloadet sind.

    Gibt es eine andere Möglichkeit dies auszulesen? Wird dies ggf. in der Datei gespeichert?

    Ansonsten könnte ich mir nur noch vorstellen, dass ich in nem Intervall prüfe, ob sich die Dateigröße geändert hat, falls nicht, dann ist die Datei wohl fertig geladen.

    Lg!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    @Rootbob91 Beim Downloaden wird manchmal eine temporäre Datei mit einer signifikanten Extension neben der Zieldatei angelegt.
    Du könntest im Sekundentakt das Vorhandensein solcher Dateien abfragen und das Ende signalisieren, wenn länger als T keine solche Datei existierte.
    Du kannst die Längen der geladenen Dateien überwachen usw.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Meine Ansatz: Jede Datei im Verzeichnis öffnen, um zu prüfen, ob ein Prozess diese blockiert.

    Habs jetzt mal quick & dirty gelöst:

    VB.NET-Quellcode

    1. Public Function CheckDownloadsFinished() As Boolean
    2. For Each filepath As String In IO.Directory.GetFiles("D:\Downloads")
    3. Try
    4. Dim fs As New IO.FileStream(filepath, IO.FileMode.Open, IO.FileAccess.ReadWrite, IO.FileShare.None)
    5. fs.Close()
    6. Catch ex As Exception
    7. Return False
    8. End Try
    9. Next
    10. Return True
    11. End Function


    Experimentell mit meinen Downloadverzeichnis und einem Chrome Download getestet, scheint zu funktionieren.
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    Dancger schrieb:

    um zu prüfen
    kann daneben gehen, wenn die letzte Prüfung vor der nächsten zu ladenden Datei fertig ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Chance diese Lücke zu treffen ist mMn gering.
    Ansonsten einfach nochmals prüfen, wenn true zurückgegeben wird, um auf Nummer sicher zu gehen.

    Oder in Kombination mit der Stückanzahl (z.B. 6 Downloads).

    @Rootbob91
    Wäre auch mal interessant zu wissen, was für ein Programm diese "Dokumente" herunterlädt.
    Dann könnte man das Programm darauf spezialisieren.
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    Dancger schrieb:

    ist mMn gering
    aber real existent.
    Festplattenoperationen dauern halt Zeit.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Aktuell hatte ichs gestern so gelöst, dass ich im 5 Sekunden Takt teste, ob die Größe sich verändert hat seit der letzten Prüfung.

    An sich klappt das eigentlich sehr gut, ist zwar gegen meine Denkweise (Polling), aber was bleibt schon anderes übrig :/.

    Hatte den Intervall erst auf 2 Sekunden, aber wenn die Leitung mal hängt, bzw der Server, dann sagt das Programm, dass die Datei fertig ist obwohls nicht so ist.

    Soweit klappts.

    Muss mal dann deine obige Methode probieren.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    @Rootbob91
    Eventuell hilft Dir der FileSystemWatcher weiter. Der löst ein Event aus, wenn Dateien erstellt/verändert/umbenannt/gelöscht werden.
    Ein Hinweis: Die Events werden in einem anderen Thread ausgeführt. Du musst also Invoke verwenden, wenn Du z.B. die GUI aktualisieren willst.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Oh okay, ich benutze den FileSystemWatcher bereits. Wenn eine Datei hinzugefügt oder gelöscht wurde, dann aktualisiere ich das Verzeichnis an vorhandenen Dateien, aber ich habe das so verstanden, dass das Changed beide Ereignisse beinhaltet, aber nicht Größenveränderung :0!

    Hmm, da muss ich dann mal schauen wie es funktioniert.

    EDIT: Habs ausprobiert, geht wohl doch nur mit pollen, der FilesystemWatcher schaut nur beim Erstellen etc. oder bei Namensänderungen, allerdings nicht sowas wie FilesizeChanged, oder zumindest ähnliches.

    Ich meine gut, wenn der echt jedes mal Feuern würde wenn sich die Größe ändert, dann würde das ja echt n Haufen Messages geben, aber irgendwie muss das doch besser gehen. :/
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

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

    Der Filesystemwatcher hat 4 Events, das Change-Event müsste dann so lange überwacht werden, bis es halt nicht mehr kommt, es sei denn, es kommt tatsächlich erst nach Fertigstellung des Downloads, müsste mal getestet werden.
    Bilder
    • WatcherEvents.png

      7,36 kB, 329×211, 112 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jo hab die Filter gesetzt die ich benötigte, also Size etc..

    Aber ich denke das hängt auch damit zusammen, dass der Filewatcher sich nicht einklinken kann in die Datei, denn die ist "durch einen anderen Prozess" gesperrt.

    Die Überwachung vom Hinzufügen und Löschen von Dateien ist möglich, nur die Size will nicht.

    Wenn ich Change überwache, kommt es nur ganz am Anfang 2-3 mal und danach passiert nichts mehr, auch nicht wenn die Datei fertig ist.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Grundidee:
    Solange die Datei geschrieben wird, hat ein Prozess ein Handle darauf offen.

    Lösungsprinzip:
    Die Ausgabe von handle.exe nach dem Dateinamen durchsuchen.
    Nicht gefunden -> Download fertig.
    Wenn du zufällig weißt, wie der Download-Prozess heißt, erleichtert das das Verfahren.

    Du möchtest keinen anderen Prozess aufrufen und alles innerhalb deines Programms abdecken?
    Welchen Code Mark Russinovich intern verwendet, weiß ich nicht (und möchte es lieber gar nicht wissen).
    Falls du das mit VB:Net nachprogrammieren willst, wünsche ich dir viel Spaß. ;)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich hätte damit kein Problem, die Datei zu benutzen, habe auch schon ein anderweitiges zusatz-Tool einbinden müssen, da tut das auch nicht weh^^...

    Ich schau mir das mal an, danke sehr!!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

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

    Rootbob91 schrieb:

    Die Überwachung vom Hinzufügen und Löschen von Dateien ist möglich, nur die Size will nicht.
    soweit ich weiß, kann man auch Size-Anderungen überwachen - man musses nur entsprechend konfigurieren.
    vlt. guckst du dir FileSystemWatcher mal im ObjectBrowser an, vlt. sogar Bildchen posten?

    also was ich da jdfs. fund, sah recht vielversprechend aus - nur meine Tests damit sind urs lange her.
    Hab hier nochmal was gebastelt, mein voriger Fehler (dessen Ausmerung es aber auch nicht besser machte) war das ich dem FileSystemWatche die zu überwachende Datei gegeben habe, er möchte aber scheinbar nur Verzeichnisse haben.

    Nunja, hab das auf Verzeichnis halt geändert.. Ab und zu kommt mal ne Nachricht a la "wurd geändert" durch, aber nicht so das es brauchbar wäre.

    Ich hängs mal an.
    Dateien
    • FSW Test.rar

      (72,08 kB, 95 mal heruntergeladen, zuletzt: )
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Rootbob91 schrieb:

    Ich weiß nicht was du genau möchtest
    Wie verschaffe ich mir Informationen über die Klassen, Strukturen, Prozeduren, ... mit denen ich arbeite?
    1. ObjectBrowser. Rechte Maustaste -> Gehe zu Definition.
    2. MSDN. Draufklicken, F1 drücken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!