Videodatei überprüfen, ob diese gerade erstellt wird

  • Hallo Community,
    ich schreibe mir gerade ein kleines Tool welches mir den Ausgangspfad meiner DVB-T Software (für Aufzeichnungen) überwacht. Sobald sich eine Videodatei in dem Ornder befindet soll diese überprüft werden, ob momentan in ihr geschrieben wird.
    Leider sind alle Versuche welche ich anstellte ins Leere gelaufen... Ich habe es mit

    Code
    FileGetAttrib(), FileGetSize(), FileOpen($sFile, 1)

    versucht, aber alle Funktionen geben mir nicht erfolgreich zurück ob diese gerade erstellt werden - und so werden diese von meinem Script zur Konvertierung erfasst obwohl diese noch garnicht fertig aufgenommen wurden! Das sorgt natürlich für Probleme...

    Scriptfunktionen:
    1. Überwachung von DVB-T Ordner
    2. Erfassung von fertiggestellten Dateien <- Hier liegt das Problem...
    3. Videokonvertierung durch Super v2014
    4. Sortierung der Aktuellen Videos

    Ich Denke das die Lösung auf dem Fuße liegt, komme aber einfach nicht drauf...

    Grüsse!

    P.S:
    Alles läuft zuverlässig, nur die Erfassung macht probleme! Das Script will ich zu dem Zweck nutzen alle Walking Dead Folgen von RTL2, LIVE, in ein Format welches meine HD-Glotze lesen kann zu konvertieren.

  • Wie wäre der Weg mit FileGetSize() so lange die Größe immer mal wieder zu prüfen bis diese sich für einen Zeitraum von X nicht mehr geändert hat.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Also immer die finale Endgröße?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Schonmal mit FileGetTime mit option 0 oder 2 probiert?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Windows besitzt ein integriertes Tool namens openfiles.exe.
    Zunächst muss man die Überprüfung lokaler Dateien durch openfiles /local on einschalten.
    Nach einem Neustart kann man sich dann mit dem Befehl openfiles alle derzeit geöffneten Dateien ausgeben lassen. Wenn ich das bei mir in eine Textdatei schreiben lasse, sind das so ~50 KB.
    In dieser Auflistung sind enthalten:

    • Eine Kennung (nicht das Handle)
    • Prozessname
    • Dateipfad und -name

    Du solltest dann diese Liste nach dem Prozessnamen deines DVB-T-Programmes filtern lassen können, dann solltest du alle offenen Dateien haben. Schau dir den Output am besten vorher mal in der CMD an. ^^

    Ach ja, ganz wichtig: openfiles benötigt immer Administratorrechte!

  • chip: Jap, alle Optionen...
    Openfiles.exe habe ich noch nie gehört... Ich habe ja den Videonamen incl. Pfad, kann ich diesen in der Ausgabe irgendwie Suchen also mit StringInStr oder so?
    Werd ich jedenfalls testen!

    Einmal editiert, zuletzt von Techmix (15. Oktober 2014 um 17:14)

  • Wenn ich versuche über ComSpec openfiles.exe auszuführen, gibt es eine Fehlermeldung. Jedoch funktioniert es über die CMD - seltsamm...

    [autoit]

    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_UseX64=n
    #RequireAdmin
    $hCMD = Run(@ComSpec & " /c " & 'openfiles.exe', @SystemDir, @SW_HIDE, $STDOUT_CHILD)
    While 1
    $sList &= StdoutRead($hCMD)
    If @error Then ExitLoop
    WEnd
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sList = ' & $sList & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ;~ FEHLER: Auf dem Zielsystem muss ein 32-Bit-Betriebssystem ausgeführt werden.

    [/autoit]


    Auch wenn ich es kompiliere, gibt es eine leere $sList.
    Ach, ich verwende Win7 x64 wie man anhand der Fehlermeldung erahnen kann...

    Grüsse!

    P.S:
    Da ist noch ein Fehler in der Codeanzeige...

  • @Shadow: Nein, eben nicht...

    Hab´s jetzt hinbekommen :D

    [autoit]


    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_UseX64=n
    #RequireAdmin
    Global _
    $s_User = "Admin", _
    $s_Pass = "xxx", _
    $hCMD, $sList

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

    $hCMD = RunAs($s_User, @ComputerName, $s_Pass, 0, @ComSpec & " /c C:\Windows\System32\openfiles.exe /Query /V", @SystemDir, @SW_HIDE, $STDOUT_CHILD)
    While 1
    $sList &= StdoutRead($hCMD)
    If @error Then ExitLoop
    WEnd
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sList = ' & $sList & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit]


    Wenn ich nur "openfiles.exe" bei @ComSpec angebe kommt wieder der gleiche Fehler! Auch MUSS der Account ein Passwort haben, ein "" wirft auch Probleme aus. Das "/Query /V" benötige weil ich sonst verkürzte Dateien erhalte.

    Welche Formatierung/Codierung ist das hier: "E:\Videos\DVB-T\Grey's Anatomy - Die jungen Žrzte20141015-204357.ts" und "INFO: Keine freigegebenen, geffneten Dateien gefunden."??? Jetzt kann ich die zugehörigen Zeilen filtern, aber der Dateiname stimmt durch die Formatierung nicht überein 8? Innerhalb der CMD werden diese Zeichen richtig ausgegeben..
    Hab schon hiermit rumgespielt, gibt aber auch nicht die gewünschten Ergebnisse...

    ASCIIArray Test
    [autoit]


    Global _
    $sTest, $aTest, _
    $i, $j ; ...für die Puristen unter uns ;)

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

    for $i = 0 to 2
    $sTest = "E:\Videos\DVB-T\Grey's Anatomy - Die jungen Žrzte20141015-204357.ts"
    $aTest = StringToASCIIArray($sTest, 0, StringLen($sTest), $i)
    for $j = 0 to 2
    $sTest = StringFromASCIIArray($aTest, 0, UBound($sTest)-1, $j)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sTest = ' & $sTest & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    Next
    Next

    [/autoit]

    Grüsse!

    • Offizieller Beitrag

    Um mal eine andere Möglichkeit vorzuschlagen:
    Schau Dir mal das Beispiel zu "_WinAPI_ShellChangeNotifyRegister" an (neue AutoIt-Version).
    Damit kannst Du das Verzeichnis überwachen und bekommst eine Meldung, sobald sich etwas ändert (mit der entsprechenden Datei).

  • Schon mal versucht die Datei mit FileMove umzubennen? Sollte diese im Zugriff sein sollte die Funktion dann 0 als Return liefern. Das alles in einer Schleife bis FileMove eine 1 liefert.
    Sollte der Dateiname für dich wichtig sein könnte man nachdem das erste FileMove erfolgreich der Datei den Originalen Namen zurück geben.

    :thumbup:

  • bobekos: FileMove scheint zu funktionieren!!! SUPER!

    Oscar : Das Beispiel "_WinAPI_ShellChangeNotifyRegister" läuft bei mir nicht richtig?!? Es startet zwar, es passiert aber nichts... Oder ich mache es falsch :D Wie verwende ich diese Funktion richtig??

    @All: Ja, ja... Da sieht man mal was dabei rum kommt, wenn man einfach zu kompliziert Denkt. Eine einfache FileMove prüfung hätte mir 3 Tage Kopfzerbrechen erspart :D

    Gelöste Grüsse ;)

  • Auch wenn eine Lösung gefunden worden ist... Mit ein wenig Kodierungswechselei funktioniert auch der openfiles-Ansatz:

    Spoiler anzeigen
    [autoit]


    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_UseX64=n

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

    #include <Constants.au3>
    #RequireAdmin

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

    Global _
    $s_User = "Admin", _
    $s_Pass = "xxx", _
    $hCMD, $sList, $sTemp

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

    ;chcp 65001 setzt die Codepage der CMD auf Unicode
    $hCMD = RunAs($s_User, @ComputerName, $s_Pass, 0, @ComSpec & " /c chcp 65001 & C:\Windows\System32\openfiles.exe /Query /V", @SystemDir, @SW_HIDE, $STDOUT_CHILD)
    While 1
    $sTemp = StdoutRead($hCMD)
    If @error Then ExitLoop
    ;cmd.exe liefert trotzdem ASCII/ANSI-Output, daher konvertieren wir zu Unicode
    $sList &= BinaryToString(StringToBinary($sTemp, 1), 4)
    WEnd

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

    MsgBox(64, "", $sList)

    [/autoit]


    Lesbare Variante

    Gruß!

  • Verdammt meine DVB-T Software hat heute Nacht versagt, hat mir 2 Folgen mit 0Kb aufgenommen... Nutze momentan SmartDVB, diese scheint aber nicht so zuverlässig zu sein!
    Nutzt ihr auch DVB, und wenn welche Software verwendet ihr??

    P.S: Das Script läuft jetzt wunderbar, hab es extra gestern nicht laufen lassen weil ich mir nicht sicher war mit der DVB Software - als hätte ich es geahnt...

    [Edit]
    Zweiter Aufnahmetag, diesmal nicht als Einzelfolgen programmiert sondern als einzel Aufnahme. Auch das hat versagt! Nach 3.6GB war schuss und die DVB Software hat sich aufgehängt. Grummel....

    [Edit2]
    Dritter Tag, SuperDVB hat erneut versagt! Hatte 6 Folgen zu 3 Doppelfolgen programmiert wobei nur die erste erfolgreich erstellt wurde. Die beiden anderen wurden wieder nur als 0Kb Dateien abgelegt.... Dieses verdammte DVB Programm!

    2 Mal editiert, zuletzt von Techmix (19. Oktober 2014 um 10:46)