Verzeichnis überwachen, Dateien entpacken und wieder packen

  • Hallo zusammen,


    ich möchte ein Verzeichnis überwachen und jedesmal wenn eine neue Datei(WinRaR)
    in dem Verzeichnis abgelegt wird, diese entpacken und dann mit WinRaR mit neuen Optionen packen.


    Das Programm müßte also ständig laufen und immer das Verzeichnis überwachen.


    Wie würdet Ihr da vorgehen?


    Wäre toll, wenn Ihr mir da mal ein paar Tipps geben könntet.

  • Als erstes würde ich alle Datein die im Verzeichnis liegen namentlich in ein Array speichern.

    Dann alle 10 Sekunden überprüfen ob was dazu gekommen ist. Wenn ja dann eine Funktion ausführen (in der sollte dann das ganze mit dem entpacken etc. stehen)

    Und zum schluss die neuen Datein in das Array aufnehmen :P


    Und wenn du willst, dass das Programm bei PC start ebenfalls automatisch startet, dann pack einfach eine Verknüpfung zu dein Programm in den Autorun Ordner :o
    Um jetzt ein Beispiel zu schreiben ist es mir viel zu spät x.x |>

  • Spontan würde ich auch sagen das man in einer Endlosschleife in einem gewissen Zeitintervall immer überprüft ob neue Dateien dazugekommen sind.
    Das hat dann aber einige Nachteile: Z.B. ruht das Skript nicht wirklich sondern wird intervallweise angeschoben. Desweiteren findet, wenn sich das Dateisystem die Informationen nicht aus dem Cache holt, permanent ein Festplattenzugriff statt.
    Die Festplatte kann sich in dem Fall nie abschalten.

    Die viel elegantere Lösung wäre daher die Events des FileSystems abzufangen und das Skript nur dann informieren zu lassen wenn in dem gewünschten Ordner eine Änderung stattfand.
    Ein fast fertiges Konstrukt für diesen Anwendungsfall wäre folgendes:

    Abfangen von FileSystem-Events
    [autoit]

    #AutoIt3Wrapper_UseX64=n
    #include <WinAPI.au3>

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

    Opt("TrayMenuMode", 1)
    Opt("TrayOnEventMode", 1)

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

    Global Const $SHCNE_RENAMEITEM = 0x0001 ; Änderung von Dateinamen
    Global Const $SHCNE_CREATE = 0x0002 ; Erstellung von Dateien
    Global Const $SHCNE_DELETE = 0x0004 ; Löschen von Dateien
    Global Const $SHCNE_MKDIR = 0x0008 ; Erstellung von Ordnern
    Global Const $SHCNE_RMDIR = 0x0010 ; Löschen von Ordnern
    Global Const $SHCNE_UPDATEDIR = 0x1000
    Global Const $SHCNE_UPDATEITEM = 0x2000
    Global Const $SHCNE_UPDATEIMAGE = 0x8000
    Global Const $SHCNE_RENAMEFOLDER = 0x20000
    Global Const $SHCNE_ALLEVENTS = 0x7FFFFFFF

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

    OnAutoItExitRegister("Raus")
    TrayCreateItem("Beenden")
    TrayItemSetOnEvent(-1, "Beenden")

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

    Global $h_Shell32DLL = DllOpen("shell32.dll")
    Global Const $s_Path = FileGetLongName(@UserProfileDir & "\Downloads") ; hier den zu prüfenden Pfad eintragen
    If Not FileExists($s_Path) Then Exit MsgBox(48, "Fehler", "Pfad " & $s_Path & " existiert nicht!")

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

    ; Registriert ein FileSystemEvent mit einer AutoIt-Callback-Funktion
    Global $SHRegister = RegisterFSEvent($s_Path, $SHCNE_CREATE, "CheckOfNewFiles", False)

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

    Do
    Sleep(500)
    Until 0

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

    ; Funktion die aufgerufen wird wenn ein Event auftritt:
    Func CheckOfNewFiles(Const $hWndGUI, Const $MsgID, Const $wParam, Const $lParam)
    If $lParam = $SHCNE_CREATE Then ; Wenn neue Datei erstellt wurde
    Local $h_pidl = DllStructCreate("PTR; PTR", $wParam)
    Local $a_Ret = DllCall($h_Shell32DLL, "BOOLEAN", "SHGetPathFromIDListW", "ptr", DllStructGetData($h_pidl, 1), "wstr", "")
    Local $s_Path = $a_Ret[2]

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

    If StringTrimLeft($s_Path, StringInStr($s_Path, ".", 2, -1)) = "rar" Then
    MsgBox(0, "Neue Rar-Datei gefunden", $s_Path)
    EndIf
    EndIf
    EndFunc ;==>CheckOfNewFiles

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

    ; registriert ein FileSystemEvent eines Pfades mit einer Funktion
    Func RegisterFSEvent(Const $s_Path, Const $d_Events, Const $s_CallBackFunc, Const $bRecursive = True)
    Local $h_MyWinMsg = _WinAPI_RegisterWindowMessage("irgendwas")
    Local $h_GUI = GUICreate("")
    GUIRegisterMsg($h_MyWinMsg, $s_CallBackFunc)

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

    Local $h_PIDLIST = DllCall($h_Shell32DLL, "PTR", "ILCreateFromPathW", "WSTR", $s_Path)
    Local $strct_SHChangeNotifyEntry = DllStructCreate("PTR pidl; BOOLEAN fRecursive")
    DllStructSetData($strct_SHChangeNotifyEntry, 1, $h_PIDLIST[0])
    DllStructSetData($strct_SHChangeNotifyEntry, 2, $bRecursive)

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

    Local $SHRegister = DllCall($h_Shell32DLL, "int", "SHChangeNotifyRegister", _
    "HWND", $h_GUI, _
    "INT", 0x0003, _
    "LONG", $d_Events, _
    "UINT", $h_MyWinMsg, _
    "INT", 1, _
    "ptr", DllStructGetPtr($strct_SHChangeNotifyEntry))
    DllCall("ole32.dll", "none", "CoTaskMemFree", "ptr", $h_PIDLIST[0])
    Return $SHRegister
    EndFunc ;==>RegisterFSEvent

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

    Func Beenden()
    Exit
    EndFunc ;==>Beenden

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

    Func Raus()
    $ret = DllCall($h_Shell32DLL, "BOOLEAN", "SHChangeNotifyDeregister", "ULONG", $SHRegister[0])
    DllClose($h_Shell32DLL)
    EndFunc ;==>Raus

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (7. September 2012 um 09:25)