WebCam Bilder nach Uhrzeit

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Hary
    antwortet
    Fehlermeldung seit Umstellung auf PHP5.6

    $filepath, /// str(path:local)
    Zuletzt geändert von Hary; 13.11.2016, 09:08.

    Einen Kommentar schreiben:


  • Hary
    antwortet
    Vielen Dank an fireweasel

    Das Problem hat mich schon viele Stunden beschäftigt.
    Hab den Code auf meiner Synology eingefügt und hat auf Anhieb funktioniert.
    Nochmals ein großes Lob an Dich fireweasel.
    Gruß
    Hary

    Einen Kommentar schreiben:


  • fireweasel
    antwortet
    Zitat von Hary Beitrag anzeigen
    Hallo, bräuchte Hilfe.
    WebCam Bilder sind auf externer Festplatte gespeichert,Abfrage über Filemtime.
    Möchte jetzt alle Bilder (ca.1000Stk.Zeitraum ca.1Monat) die zwischen 22:00Uhr bis 05:00Uhr morgens gespeichert wurden von Ordner1 in Ordner2 kopieren. Bekomme es einfach nicht hin, wer kann helfen.
    Wollte ein vorgegebenes Script von Nico umstricken.
    Ich weiß nicht, wer Nico ist. Sein Script taugt jedenfalls nicht für deine Aufgabenstellung. Es löscht Dateien und kopiert sie nicht.

    Gehen wir die Aufgabe mal Schritt für Schritt an: Zuerst brauchen wir eine Funktion, die schaut, ob eine Datei im gewünschten Zeitfenster verändert wurde.

    PHP-Code:
    /// check if given filesystem entry got modificated (in) between $min_hour and $max_hour
    /// return bool() success
    function within_mtime_hours(
        
    $filepath/// str(path:local)
        
    $min_hour 22/// int(0...23)
        
    $max_hour 5  /// int(0...23)
    ) {
        
    $mtime_hour idate('H'filemtime($filepath));
        return 
    $mtime_hour >= $min_hour || $mtime_hour <= $max_hour;

    Dann möchtest du diese Datei kopieren. Mein Vorposter hat schon angedeutet, dass es mehrere Arten des Kopierens gibt: Mit rename() verschiebst du eine Datei. Mit copy() erzeugst du eine weitere Datei in einem anderen Verzeichnis. Das ist vor allem fürs Testen wichtig, denn die Original-Datei bleibt dabei unverändert. Wir bauen uns deshalb eine Kopierfunktion, die beides kann.

    PHP-Code:
    /// copy source file to destination directory path
    /// return bool() success
    function copy_file(
        
    $src_filepath/// str(path:local) path to source file
        
    $dst_dirpath null/// str(path:local) path to destination directory
        
    $move false /// bool() whether to move (copy + delete src file) or copy only
    ) {
        if (!
    is_dir($dst_dirpath) || !is_file($src_filepath)) {
            throw new 
    InvalidArgumentException();
        }
        
    $dst_filepath $dst_dirpath DIRECTORY_SEPARATOR basename($src_filepath);
        if (
    true === $move) {
            return 
    rename($src_filepath$dst_filepath);
        }

        if (!
    copy($src_filepath$dst_filepath)) {
            return 
    false;
        }
        
    // restore mtime of source file
        
    touch($dst_filepathfilemtime($src_filepath));
        return 
    true;

    Jetzt müssen das gewünschte Verzeichnis einlesen, dort die passenden Dateien finden und kopieren. Da du mit Verzeichnis- und CallbackFilter-Iteratoren vermutlich wenig am Hut hast, bleiben wir beim herkömmlichen opendir()-readdir()-closedir(). Für jede Datei im Verzeichnis, die readdir() liefert, schaut $filter(), ob sie ins gewünschte Muster passt, und $process() verarbeitet sie dann.

    PHP-Code:
    /// return int(0...) number of processed files | null() if directory scanning failed
    function filter_and_process_files_in_dir(
        
    $dirpath/// str(path:local) path to directory
        
    Callable $filter,
        Callable 
    $process
    ) {
        
    $pwd getcwd();
        if (!
    chdir($dirpath)) {
            return 
    null;
        }
        if (!
    is_resource($dir opendir($dirpath))) {
            return 
    null;
        }

        for (
    $processed 0is_string($entry readdir($dir)); ) {
            if (
    is_dir($entry)) {
                continue;
            }
            
    // only files here
            
    if ($filter(realpath($entry))) {
                if (
    $process(realpath($entry))) {
                    ++
    $processed;
                }
            }
        }
        
    closedir($dir);
        
    chdir($pwd); 
        return 
    $processed;

    Jetzt können wir filter_and_process_files_in_dir() das Ausgangsverzeichnis, unsere Zeit-Rahmen-Prüffunktion und eine (modifizierte) Kopierfunktion übergeben:

    PHP-Code:
    $src_dirpath 'path_to_source_dir'// Ausgangsverzeichnis; anpassen!

    $my_copy_func = function ($src_filepath) {
        return 
    copy_file(
            
    $src_filepath
            
    'path_to_destination_dir'// Zielverzeichnis; anpassen! 
            
    false // false: kopieren; true: verschieben
        
    );
    };

    $num_files_processed filter_and_process_files_in_dir(
        
    $src_dirpath
        
    'within_mtime_hours'
        
    $my_copy_func
    );

    var_dump($num_files_processed);
    // INTEGER >= 0 wenn alles gut lief 
    // oder NULL, wenn Verzeichnis nicht eingelesen werden konnte 
    Anmerkung zu filemtime(): Eigentlich wolltest du die Dateien an Hand der "creation time" auswählen. Mit PHP-Bordmitteln kann man diese aber nicht verlässlich auslesen. Deswegen habe ich filemtime() benutzt. Das funktioniert, wenn die Dateien nach der Erstellung nicht mehr verändert wurden. Du solltest aber einen Probelauf machen (Kopieren, nicht Verschieben).
    Zuletzt geändert von fireweasel; 13.03.2015, 11:54. Grund: typo

    Einen Kommentar schreiben:


  • chorn
    antwortet
    Ich sehe da kein rename() um die Datei zu verschieben. Und wo genau versuchst du die Stunde zu ermitteln? Das geht ja mit date(). Wo ist die Abfrage nach "zwischen 22 und 5 Uhr"?

    Einen Kommentar schreiben:


  • Hary
    hat ein Thema erstellt WebCam Bilder nach Uhrzeit.

    WebCam Bilder nach Uhrzeit

    echo "Fertig";
    $folder->close();
    exit;
    Zuletzt geändert von Hary; 13.11.2016, 09:07.
Lädt...
X