WebCam Bilder nach Uhrzeit

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

  • WebCam Bilder nach Uhrzeit

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

  • #2
    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"?

    Kommentar


    • #3
      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
      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

      Kommentar


      • #4
        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

        Kommentar


        • #5
          Fehlermeldung seit Umstellung auf PHP5.6

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

          Kommentar

          Lädt...
          X