Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Ordner auf neue Dateien überwachen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.3k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

Ordner auf neue Dateien überwachen

Scheduled Pinned Locked Moved JavaScript
37 Posts 8 Posters 5.8k Views 7 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • AlCalzoneA Offline
    AlCalzoneA Offline
    AlCalzone
    Developer
    wrote on last edited by
    #19

    Wenn es wirklich nur um neue Dateien (neuer Name, nicht überschrieben) geht, kann man im JS Skript auch lediglich mtime des Verzeichnisses prüfen und muss nicht erst alle Dateien enumerieren und deren Zeitstempel prüfen.

    Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

    T M 2 Replies Last reply
    0
    • AlCalzoneA AlCalzone

      Wenn es wirklich nur um neue Dateien (neuer Name, nicht überschrieben) geht, kann man im JS Skript auch lediglich mtime des Verzeichnisses prüfen und muss nicht erst alle Dateien enumerieren und deren Zeitstempel prüfen.

      T Offline
      T Offline
      tomily
      wrote on last edited by
      #20

      Hallo zusammen,

      erst mal einen herzlichen und fetten Dank an @ente34 für den geilen Support.
      Ich habe das letzte Script noch etwas für mich angepasst und nun tut es EXAKT das was ich mir vorgestellt habe... Juhuuu :-)

      Danke auch an @mickym. Es ist immer interessant mehrere Wege zu testen. Somit lerne ich beide Systeme. Werde den NodeRed-Flow morgen früh gleich mal ausprobieren. Einfach aus Neugierde.

      Ich mache viel mit NodeRed. In dem Fall wollte ich das Backup-Prüfscript aber absichtlich in einem anderen System betreiben. Es macht nie Sinn eine Datensicherung vom gleichen System zu prüfen, das es auch erstellt.

      Spinnt das System, erhält man gar keine Infos mehr. Deshalb arbeite ich mit mehreren Instanzen und Servern.

      Ich prüfe somit mehrere Verzeichnisse auf neue Sicherungen ab. Ganz egal, wie diese erstellt wurden. Manche kommen vom ioBroker direkt. Manche liefert das ESXi-Serverbackup und manche kopiere ich von Hand rein und werde somit nach einer Gewissen Zeit erinnert es wieder zu tun :-)

      Das einzige, das nicht funktioniert ist, wenn die Sicherungen in Unterverzeichnissen liegen. Das wäre dann die nächste Hürde :-)

      mickymM 1 Reply Last reply
      0
      • T tomily

        Hallo zusammen,

        erst mal einen herzlichen und fetten Dank an @ente34 für den geilen Support.
        Ich habe das letzte Script noch etwas für mich angepasst und nun tut es EXAKT das was ich mir vorgestellt habe... Juhuuu :-)

        Danke auch an @mickym. Es ist immer interessant mehrere Wege zu testen. Somit lerne ich beide Systeme. Werde den NodeRed-Flow morgen früh gleich mal ausprobieren. Einfach aus Neugierde.

        Ich mache viel mit NodeRed. In dem Fall wollte ich das Backup-Prüfscript aber absichtlich in einem anderen System betreiben. Es macht nie Sinn eine Datensicherung vom gleichen System zu prüfen, das es auch erstellt.

        Spinnt das System, erhält man gar keine Infos mehr. Deshalb arbeite ich mit mehreren Instanzen und Servern.

        Ich prüfe somit mehrere Verzeichnisse auf neue Sicherungen ab. Ganz egal, wie diese erstellt wurden. Manche kommen vom ioBroker direkt. Manche liefert das ESXi-Serverbackup und manche kopiere ich von Hand rein und werde somit nach einer Gewissen Zeit erinnert es wieder zu tun :-)

        Das einzige, das nicht funktioniert ist, wenn die Sicherungen in Unterverzeichnissen liegen. Das wäre dann die nächste Hürde :-)

        mickymM Offline
        mickymM Offline
        mickym
        Most Active
        wrote on last edited by mickym
        #21

        @tomily
        Ich hab mir nun aber mal das Skript von @ente34 genauer angeschaut und da wird das Verzeichnis ja zum Überprüfungszeitpunkt gemountet, analysiert und dann wieder unmounted.
        Der flow geht aber einen ganz anderen Ansatz - der permanenten Überprüfung!
        Deshalb dürfte der Flow für Dich doch nicht geeignet sein. Der Flow geht ja davon aus, dass Du eine permanente Verbindung zur Überwachung hälst (gemountete Verzeinchisse) und nicht nur zu einem bestimmten Zeitpunkt, wie das ja das Script macht. Also insofern vergiss einfach den Flow. ;)

        Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

        T 2 Replies Last reply
        0
        • mickymM mickym

          @tomily
          Ich hab mir nun aber mal das Skript von @ente34 genauer angeschaut und da wird das Verzeichnis ja zum Überprüfungszeitpunkt gemountet, analysiert und dann wieder unmounted.
          Der flow geht aber einen ganz anderen Ansatz - der permanenten Überprüfung!
          Deshalb dürfte der Flow für Dich doch nicht geeignet sein. Der Flow geht ja davon aus, dass Du eine permanente Verbindung zur Überwachung hälst (gemountete Verzeinchisse) und nicht nur zu einem bestimmten Zeitpunkt, wie das ja das Script macht. Also insofern vergiss einfach den Flow. ;)

          T Offline
          T Offline
          tomily
          wrote on last edited by
          #22

          @mickym
          Ich danke Dir für den input. Für mich sind trotzdem beide Varianten sehr interessant.

          Der Ursprüngliche Zweck war ja zu erkennen, wenn keine neue Dateien mehr kommen. Der permanente Überwachung wäre sicherlich auch in einigen Situationen sinnvoll.

          Zur NOT könnte ich das Verzeichnis dauerhaft mounten. Aber egtl muss und soll das nicht sein.

          Die Prüfung würde mir 1-2x am Tag reichen. Weiss nicht, ob die „Dauerprüfung“ evtl traffic oder performance Probleme verursacht?

          @ente34
          Könnte ich mit dem Skript evtl. Auch zusätlich rekursiv in Unteeverzeichnissen suchen?
          War zwar keine ursprüngliche Anforderung von mir, aber nachdem ich meine ganzen Check-Jobs eingerichtet habe, bin ich noch darauf gestossen.

          E 1 Reply Last reply
          0
          • mickymM mickym

            @tomily
            Ich hab mir nun aber mal das Skript von @ente34 genauer angeschaut und da wird das Verzeichnis ja zum Überprüfungszeitpunkt gemountet, analysiert und dann wieder unmounted.
            Der flow geht aber einen ganz anderen Ansatz - der permanenten Überprüfung!
            Deshalb dürfte der Flow für Dich doch nicht geeignet sein. Der Flow geht ja davon aus, dass Du eine permanente Verbindung zur Überwachung hälst (gemountete Verzeinchisse) und nicht nur zu einem bestimmten Zeitpunkt, wie das ja das Script macht. Also insofern vergiss einfach den Flow. ;)

            T Offline
            T Offline
            tomily
            wrote on last edited by
            #23

            @mickym hast du den Flow wieder rausgenommen?
            Darf ich ihn mir trotzdem anschauen? Wäre total super, möchte diese Option nicht ausser Acht lassen.

            mickymM 1 Reply Last reply
            0
            • T tomily

              @mickym hast du den Flow wieder rausgenommen?
              Darf ich ihn mir trotzdem anschauen? Wäre total super, möchte diese Option nicht ausser Acht lassen.

              mickymM Offline
              mickymM Offline
              mickym
              Most Active
              wrote on last edited by
              #24

              @tomily Hängt dran.

              Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

              1 Reply Last reply
              0
              • T tomily

                @mickym
                Ich danke Dir für den input. Für mich sind trotzdem beide Varianten sehr interessant.

                Der Ursprüngliche Zweck war ja zu erkennen, wenn keine neue Dateien mehr kommen. Der permanente Überwachung wäre sicherlich auch in einigen Situationen sinnvoll.

                Zur NOT könnte ich das Verzeichnis dauerhaft mounten. Aber egtl muss und soll das nicht sein.

                Die Prüfung würde mir 1-2x am Tag reichen. Weiss nicht, ob die „Dauerprüfung“ evtl traffic oder performance Probleme verursacht?

                @ente34
                Könnte ich mit dem Skript evtl. Auch zusätlich rekursiv in Unteeverzeichnissen suchen?
                War zwar keine ursprüngliche Anforderung von mir, aber nachdem ich meine ganzen Check-Jobs eingerichtet habe, bin ich noch darauf gestossen.

                E Offline
                E Offline
                ente34
                wrote on last edited by
                #25

                @tomily sagte in Ordner auf neue Dateien überwachen:

                Könnte ich mit dem Skript evtl. Auch zusätlich rekursiv in Unteeverzeichnissen suchen?

                Man muss das Script nur ein wenig umstellen:

                const fs = require('fs');
                const util = require('util');
                const readdir = util.promisify(fs.readdir);
                const stat = util.promisify(fs.stat);
                const lstat = util.promisify(fs.lstat);
                
                const mountDir = '/home/pi/mount';
                const nasDir = '//nas02/backup/raspi-iobroker';
                const mountCmd = `sudo mount -t cifs -o username=...,password=...,vers=3.0 ${nasDir} ${mountDir}`;
                const umountCmd = `sudo umount ${nasDir}`;
                
                const warnSeconds = 5 * 86400;
                
                async function NewestFile(dir) {
                    let newestFileAge = 0;
                    let newestFile = '';
                    //console.log('### '+dir);
                    try {
                        let files = [];
                        files = await readdir(dir);
                
                
                        for (let file of files) {
                            let fullpath = dir + '/' + file;
                            const s = await lstat(fullpath);
                            if (s.isFile()) {
                                const stats = await stat(fullpath);
                                if (stats.mtimeMs > newestFileAge) {
                                    newestFileAge = stats.mtimeMs;
                                    newestFile = file;
                                }
                            } else {
                                let values = await NewestFile(fullpath);
                                if (values.age > newestFileAge) {
                                    newestFileAge = values.age;
                                    newestFile = values.file;
                                }
                            }
                        }
                    } catch (e) {
                        console.log(e);
                    } finally {
                        return { file: newestFile,  age:newestFileAge };
                    }
                }
                
                /**
                 * Executes a shell command and return it as a Promise.
                 * @param cmd {string}
                 * @return {Promise<string>}
                 */
                function execShellCommand(cmd) {
                    const exec = require('child_process').exec;
                    return new Promise((resolve, reject) => {
                        exec(cmd, (error, stdout, stderr) => {
                            if (error) {
                                console.warn(error);
                            }
                            resolve(stdout ? stdout : stderr);
                        });
                    });
                }
                
                async function checkBackup() {
                    try {
                        //hier mount-Kommando
                        await execShellCommand(mountCmd);
                
                        let result = await NewestFile(mountDir);
                        let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
                        if (seconds > warnSeconds) {
                            console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                            // Mail abschicken
                            console.log('Send Mail');
                        }
                
                        //hier umount-Kommando
                        await execShellCommand(umountCmd);
                    } catch (e) {
                        console.warn(e);
                    }
                }
                
                // 22:30
                schedule('30 22 * * *', () => {
                    checkBackup();
                });
                T 1 Reply Last reply
                0
                • E ente34

                  @tomily sagte in Ordner auf neue Dateien überwachen:

                  Könnte ich mit dem Skript evtl. Auch zusätlich rekursiv in Unteeverzeichnissen suchen?

                  Man muss das Script nur ein wenig umstellen:

                  const fs = require('fs');
                  const util = require('util');
                  const readdir = util.promisify(fs.readdir);
                  const stat = util.promisify(fs.stat);
                  const lstat = util.promisify(fs.lstat);
                  
                  const mountDir = '/home/pi/mount';
                  const nasDir = '//nas02/backup/raspi-iobroker';
                  const mountCmd = `sudo mount -t cifs -o username=...,password=...,vers=3.0 ${nasDir} ${mountDir}`;
                  const umountCmd = `sudo umount ${nasDir}`;
                  
                  const warnSeconds = 5 * 86400;
                  
                  async function NewestFile(dir) {
                      let newestFileAge = 0;
                      let newestFile = '';
                      //console.log('### '+dir);
                      try {
                          let files = [];
                          files = await readdir(dir);
                  
                  
                          for (let file of files) {
                              let fullpath = dir + '/' + file;
                              const s = await lstat(fullpath);
                              if (s.isFile()) {
                                  const stats = await stat(fullpath);
                                  if (stats.mtimeMs > newestFileAge) {
                                      newestFileAge = stats.mtimeMs;
                                      newestFile = file;
                                  }
                              } else {
                                  let values = await NewestFile(fullpath);
                                  if (values.age > newestFileAge) {
                                      newestFileAge = values.age;
                                      newestFile = values.file;
                                  }
                              }
                          }
                      } catch (e) {
                          console.log(e);
                      } finally {
                          return { file: newestFile,  age:newestFileAge };
                      }
                  }
                  
                  /**
                   * Executes a shell command and return it as a Promise.
                   * @param cmd {string}
                   * @return {Promise<string>}
                   */
                  function execShellCommand(cmd) {
                      const exec = require('child_process').exec;
                      return new Promise((resolve, reject) => {
                          exec(cmd, (error, stdout, stderr) => {
                              if (error) {
                                  console.warn(error);
                              }
                              resolve(stdout ? stdout : stderr);
                          });
                      });
                  }
                  
                  async function checkBackup() {
                      try {
                          //hier mount-Kommando
                          await execShellCommand(mountCmd);
                  
                          let result = await NewestFile(mountDir);
                          let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
                          if (seconds > warnSeconds) {
                              console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                              // Mail abschicken
                              console.log('Send Mail');
                          }
                  
                          //hier umount-Kommando
                          await execShellCommand(umountCmd);
                      } catch (e) {
                          console.warn(e);
                      }
                  }
                  
                  // 22:30
                  schedule('30 22 * * *', () => {
                      checkBackup();
                  });
                  T Offline
                  T Offline
                  tomily
                  wrote on last edited by
                  #26

                  @ente34
                  Bitte entschuldigt die erneute späte Antwort. Ich bin wirklich schlimm! :)

                  Habe mir das erste Skript schon etwas auf meine Bedürfnisse angepasst. Das gleiche musste ich mit dem zweiten nun auch tun und es FUNKTIONIERT TADELLOS :-)

                  Ich habe mir nun für mehrere Ordner und Dateien unterschiedliche Skripte zusammengebaut, die ich hinterinander laufen lasse.

                  Das passt für mich nun hervorragend.

                  An der Stelle möchte ich mich recht herzlich für eure konstruktive Vorschläge bedanken. Auch Dir @ente34 herzlichen Dank für die Mühe und Zeit.

                  Bin sehr happy über das Ergebnis :)

                  T 1 Reply Last reply
                  0
                  • T tomily

                    @ente34
                    Bitte entschuldigt die erneute späte Antwort. Ich bin wirklich schlimm! :)

                    Habe mir das erste Skript schon etwas auf meine Bedürfnisse angepasst. Das gleiche musste ich mit dem zweiten nun auch tun und es FUNKTIONIERT TADELLOS :-)

                    Ich habe mir nun für mehrere Ordner und Dateien unterschiedliche Skripte zusammengebaut, die ich hinterinander laufen lasse.

                    Das passt für mich nun hervorragend.

                    An der Stelle möchte ich mich recht herzlich für eure konstruktive Vorschläge bedanken. Auch Dir @ente34 herzlichen Dank für die Mühe und Zeit.

                    Bin sehr happy über das Ergebnis :)

                    T Offline
                    T Offline
                    tomily
                    wrote on last edited by
                    #27

                    @tomily
                    Hey zusammen,

                    habe die Skripte nun einige Zeit am laufen. Funktioniert super und hab mich schon mehrmals auf nicht mehr funktionierende Backups hingewiesen :-)

                    ZIEL ERREICHT =)

                    Eine Frage bzw. weitere Idee habe ich noch:

                    Kann ich das Skript auch "umdrehen", sodass auf NEUE DATEIEN geprüft wird?
                    Also: Verzeichniss sollte immer leer sein und sobald eine oder mehrer Dateien drin liegen, wird ausgelöst?

                    Muss ich nur die Abfrage nach Zeit umdrehen?

                    Beste Grüße
                    Tom

                    E 1 Reply Last reply
                    0
                    • T tomily

                      @tomily
                      Hey zusammen,

                      habe die Skripte nun einige Zeit am laufen. Funktioniert super und hab mich schon mehrmals auf nicht mehr funktionierende Backups hingewiesen :-)

                      ZIEL ERREICHT =)

                      Eine Frage bzw. weitere Idee habe ich noch:

                      Kann ich das Skript auch "umdrehen", sodass auf NEUE DATEIEN geprüft wird?
                      Also: Verzeichniss sollte immer leer sein und sobald eine oder mehrer Dateien drin liegen, wird ausgelöst?

                      Muss ich nur die Abfrage nach Zeit umdrehen?

                      Beste Grüße
                      Tom

                      E Offline
                      E Offline
                      ente34
                      wrote on last edited by
                      #28

                      @tomily
                      Das geht leider nicht. Ich habe das Script mal erweitert,
                      Du musst chkDirNotEmpty() oder chkDirTreeNotEmpty() benutzen, je nachdem, ob Du ein einzelnes Directory oder rekursiv den ganzen Baum absuchen willst

                      const fs = require('fs');
                      const util = require('util');
                      const readdir = util.promisify(fs.readdir);
                      const stat = util.promisify(fs.stat);
                      const lstat = util.promisify(fs.lstat);
                      
                      const mountDir = '/home/pi/mount';
                      const nasDir = '//nas02/backup/raspi-iobroker/backitup';
                      const mountCmd = `sudo mount -t cifs -o username=rsync,password=...,vers=3.0 ${nasDir} ${mountDir}`;
                      const umountCmd = `sudo umount ${nasDir}`;
                      
                      const warnSeconds = 5 * 86400;
                      
                      async function NewestFile(dir) {
                          let newestFileAge = 0;
                          let newestFile = '';
                          //console.log('### '+dir);
                          try {
                              let files = [];
                              files = await readdir(dir);
                      
                      
                              for (let file of files) {
                                  let fullpath = dir + '/' + file;
                                  const s = await lstat(fullpath);
                                  if (s.isFile()) {
                                      const stats = await stat(fullpath);
                                      if (stats.mtimeMs > newestFileAge) {
                                          newestFileAge = stats.mtimeMs;
                                          newestFile = file;
                                      }
                                  } else {
                                      let values = await NewestFile(fullpath);
                                      if (values.age > newestFileAge) {
                                          newestFileAge = values.age;
                                          newestFile = values.file;
                                      }
                                  }
                              }
                      
                          } catch (e) {
                              console.log(e);
                          } finally {
                              return { file: newestFile,  age:newestFileAge };
                          }
                      }
                      
                      async function chkDirNotEmpty(dir) {
                          let files = await readdir(dir); 
                          if ( files.length ){
                              return files[0];
                          }
                          return "";
                      }
                      
                      async function chkDirTreeNotEmpty(dir) {
                          let foundFile = '';
                          try {
                              let files = [];
                              files = await readdir(dir);
                      
                              for (let file of files) {
                                  let fullpath = dir + '/' + file;
                                  const s = await lstat(fullpath);
                                  if (s.isFile()) {
                                      foundFile = fullpath;
                                      break;
                                  } else {
                                      let rc = await chkDirTreeNotEmpty(fullpath);
                                      if (rc != "") {
                                          foundFile = rc;
                                          break;
                                      }
                                  }
                              }
                      
                          } catch (e) {
                              console.log(e);
                          } finally {
                              return foundFile;
                          }
                      }
                      
                      /**
                       * Executes a shell command and return it as a Promise.
                       * @param cmd {string}
                       * @return {Promise<string>}
                       */
                      function execShellCommand(cmd) {
                          const exec = require('child_process').exec;
                          return new Promise((resolve, reject) => {
                              exec(cmd, (error, stdout, stderr) => {
                                  if (error) {
                                      console.warn(error);
                                  }
                                  resolve(stdout ? stdout : stderr);
                              });
                          });
                      }
                      
                      async function checkBackup() {
                          try {
                              //hier mount-Kommando
                              await execShellCommand(mountCmd);
                              
                              //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                              let file = await chkDirNotEmpty(mountDir);
                              
                              //Nach Files im Directory-Tree suchen (rekursiv)
                              //file = await chkDirTreeNotEmpty(mountDir);
                              if (file != "") {
                                  console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                                  // Mail abschicken
                                  console.log('Send Mail');
                      
                              }
                             
                              let result = await NewestFile(mountDir);
                              let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
                              if (seconds > warnSeconds) {
                                  console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                                  // Mail abschicken
                                  console.log('Send Mail');
                              }
                      
                              //hier umount-Kommando
                              await execShellCommand(umountCmd);
                          } catch (e) {
                              console.warn(e);
                          }
                      }
                      
                      // 22:30
                      schedule('30 22 * * *', () => {
                          checkBackup();
                      });
                      checkBackup();
                      
                      
                      T 1 Reply Last reply
                      0
                      • T tomily

                        Hallo zusammen,

                        hat jemand eine Idee, wie ich folgendes realisieren kann?

                        Ich möchte diverse Unterordner meiner NAS auf neue Dateien überprüfen.
                        In den Ordnern liegen unterschiedlich viele Dateien und unterschiedliche Dateitypen.

                        Ziel ist es, eine Email auszulösen, wenn die neueste Datei im Verzeichnis älter ist, als X-Tage.

                        Damit möchte ich erreichen, dass mir zukünftig auffällt, wenn Datensicherungen nicht mehr erstellt werden.

                        Hat jemand eine Idee oder zufällig schon ein fertiges Skript für diesen Monitoring-Zweck?

                        Grüße

                        OliverIOO Offline
                        OliverIOO Offline
                        OliverIO
                        wrote on last edited by
                        #29

                        @tomily sagte in Ordner auf neue Dateien überwachen:

                        Hallo zusammen,

                        hat jemand eine Idee, wie ich folgendes realisieren kann?

                        Ich möchte diverse Unterordner meiner NAS auf neue Dateien überprüfen.
                        In den Ordnern liegen unterschiedlich viele Dateien und unterschiedliche Dateitypen.

                        Ziel ist es, eine Email auszulösen, wenn die neueste Datei im Verzeichnis älter ist, als X-Tage.

                        Damit möchte ich erreichen, dass mir zukünftig auffällt, wenn Datensicherungen nicht mehr erstellt werden.

                        Hat jemand eine Idee oder zufällig schon ein fertiges Skript für diesen Monitoring-Zweck?

                        Grüße

                        Warum nimmst du nicht eine Standard Bibliothek von Node?
                        Diese hat Cross Platform Support und funktioniert also für win linux und macos
                        35 mio downloads pro Woche können nicht irren
                        https://www.npmjs.com/package/chokidar

                        Meine Adapter und Widgets
                        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                        Links im Profil

                        1 Reply Last reply
                        0
                        • E ente34

                          @tomily
                          Das geht leider nicht. Ich habe das Script mal erweitert,
                          Du musst chkDirNotEmpty() oder chkDirTreeNotEmpty() benutzen, je nachdem, ob Du ein einzelnes Directory oder rekursiv den ganzen Baum absuchen willst

                          const fs = require('fs');
                          const util = require('util');
                          const readdir = util.promisify(fs.readdir);
                          const stat = util.promisify(fs.stat);
                          const lstat = util.promisify(fs.lstat);
                          
                          const mountDir = '/home/pi/mount';
                          const nasDir = '//nas02/backup/raspi-iobroker/backitup';
                          const mountCmd = `sudo mount -t cifs -o username=rsync,password=...,vers=3.0 ${nasDir} ${mountDir}`;
                          const umountCmd = `sudo umount ${nasDir}`;
                          
                          const warnSeconds = 5 * 86400;
                          
                          async function NewestFile(dir) {
                              let newestFileAge = 0;
                              let newestFile = '';
                              //console.log('### '+dir);
                              try {
                                  let files = [];
                                  files = await readdir(dir);
                          
                          
                                  for (let file of files) {
                                      let fullpath = dir + '/' + file;
                                      const s = await lstat(fullpath);
                                      if (s.isFile()) {
                                          const stats = await stat(fullpath);
                                          if (stats.mtimeMs > newestFileAge) {
                                              newestFileAge = stats.mtimeMs;
                                              newestFile = file;
                                          }
                                      } else {
                                          let values = await NewestFile(fullpath);
                                          if (values.age > newestFileAge) {
                                              newestFileAge = values.age;
                                              newestFile = values.file;
                                          }
                                      }
                                  }
                          
                              } catch (e) {
                                  console.log(e);
                              } finally {
                                  return { file: newestFile,  age:newestFileAge };
                              }
                          }
                          
                          async function chkDirNotEmpty(dir) {
                              let files = await readdir(dir); 
                              if ( files.length ){
                                  return files[0];
                              }
                              return "";
                          }
                          
                          async function chkDirTreeNotEmpty(dir) {
                              let foundFile = '';
                              try {
                                  let files = [];
                                  files = await readdir(dir);
                          
                                  for (let file of files) {
                                      let fullpath = dir + '/' + file;
                                      const s = await lstat(fullpath);
                                      if (s.isFile()) {
                                          foundFile = fullpath;
                                          break;
                                      } else {
                                          let rc = await chkDirTreeNotEmpty(fullpath);
                                          if (rc != "") {
                                              foundFile = rc;
                                              break;
                                          }
                                      }
                                  }
                          
                              } catch (e) {
                                  console.log(e);
                              } finally {
                                  return foundFile;
                              }
                          }
                          
                          /**
                           * Executes a shell command and return it as a Promise.
                           * @param cmd {string}
                           * @return {Promise<string>}
                           */
                          function execShellCommand(cmd) {
                              const exec = require('child_process').exec;
                              return new Promise((resolve, reject) => {
                                  exec(cmd, (error, stdout, stderr) => {
                                      if (error) {
                                          console.warn(error);
                                      }
                                      resolve(stdout ? stdout : stderr);
                                  });
                              });
                          }
                          
                          async function checkBackup() {
                              try {
                                  //hier mount-Kommando
                                  await execShellCommand(mountCmd);
                                  
                                  //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                                  let file = await chkDirNotEmpty(mountDir);
                                  
                                  //Nach Files im Directory-Tree suchen (rekursiv)
                                  //file = await chkDirTreeNotEmpty(mountDir);
                                  if (file != "") {
                                      console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                                      // Mail abschicken
                                      console.log('Send Mail');
                          
                                  }
                                 
                                  let result = await NewestFile(mountDir);
                                  let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
                                  if (seconds > warnSeconds) {
                                      console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                                      // Mail abschicken
                                      console.log('Send Mail');
                                  }
                          
                                  //hier umount-Kommando
                                  await execShellCommand(umountCmd);
                              } catch (e) {
                                  console.warn(e);
                              }
                          }
                          
                          // 22:30
                          schedule('30 22 * * *', () => {
                              checkBackup();
                          });
                          checkBackup();
                          
                          
                          T Offline
                          T Offline
                          tomily
                          wrote on last edited by
                          #30

                          @ente34 Servus,
                          ich danke Dir für deine Mühe und bitte herzlichst um Entschuldigung für meine späte Rückmeldung. Bin in den letzten Tagen umgezogen und war leider komplett offline.

                          Hatte die vorgehenden Scripte etwas umgebaut, damit ich die Email auf meine Bedürfnisse anpassen kann. Du wirst schnell sehen, dass ich überhaupt kein guter Skripter bin, aber es hat funktioniert.

                          Bei der neuen Variante bekomme ich die Email, auch wenn KEINE Datei im Ordner ist.

                          Die Prüfung auf das Dateialter wäre mir dem Fall egal. Kann ich das dann einfach raus nehmen?
                          Ich möchte nur prüfen, OB Dateien da sind oder Nicht. Das Alter der Dateien spielt für mich keine Rolle, deshalb habe ich es auf 0 gesetzt.

                          Habe ich nun selbst einen Fehler eingebaut, oder wieso kommt die Mail jedes mal? :face_palm: :dog:

                          // Skript zur Überprüfung von LEEREN bzw. NICHT-LEEREN VERZEICHNISSEN
                          
                          //Threshold - Dauer in Tagen
                          var thresholdDays = 0;
                          // Variable für Dateialter in Tagen. Wird weiter unten benutzt.
                          var fileageDays = 0;
                          // Variable für Dateinamen. Wird weiter unten benutzt.
                          var newestFileName = 0;
                          // Variable für "Jobname"
                          var jobname = "VerzeichnissPruefung";
                          
                          const fs = require('fs');
                          const util = require('util');
                          const readdir = util.promisify(fs.readdir);
                          const stat = util.promisify(fs.stat);
                          const lstat = util.promisify(fs.lstat);
                          
                          
                          // Mountbefehl zusammensetzen
                          const mountDir = '/mnt/backupchecktemp';
                          const nasDir = '//IP/PFAD'
                          const mountCmd = `sudo mount -t cifs -o username=USERNAME,password=PASSWORT,vers=1.0 ${nasDir} ${mountDir}`;
                          const umountCmd = `sudo umount ${nasDir}`;
                          
                          const warnSeconds = thresholdDays * 86400;
                          
                          async function NewestFile(dir) {
                              let newestFileAge = 0;
                              let newestFile = '';
                              //console.log('### '+dir);
                              try {
                                  let files = [];
                                  files = await readdir(dir);
                           
                          
                                  for (let file of files) {
                                      let fullpath = dir + '/' + file;
                                      const s = await lstat(fullpath);
                                      if (s.isFile()) {
                                          const stats = await stat(fullpath);
                                          if (stats.mtimeMs > newestFileAge) {
                                              newestFileAge = stats.mtimeMs;
                                              newestFile = file;
                                          }
                                      } else {
                                          let values = await NewestFile(fullpath);
                                          if (values.age > newestFileAge) {
                                              newestFileAge = values.age;
                                              newestFile = values.file;
                                          }
                                      }
                                  }
                           
                          
                              } catch (e) {
                                  console.log(e);
                              } finally {
                                  return { file: newestFile,  age:newestFileAge };
                              }
                          }
                           
                          
                          async function chkDirNotEmpty(dir) {
                              let files = await readdir(dir); 
                              if ( files.length ){
                                  return files[0];
                              }
                              return "";
                          }
                           
                          
                          async function chkDirTreeNotEmpty(dir) {
                              let foundFile = '';
                              try {
                                  let files = [];
                                  files = await readdir(dir);
                           
                          
                                  for (let file of files) {
                                      let fullpath = dir + '/' + file;
                                      const s = await lstat(fullpath);
                                      if (s.isFile()) {
                                          foundFile = fullpath;
                                          break;
                                      } else {
                                          let rc = await chkDirTreeNotEmpty(fullpath);
                                          if (rc != "") {
                                              foundFile = rc;
                                              break;
                                          }
                                      }
                                  }
                           
                          
                              } catch (e) {
                                  console.log(e);
                              } finally {
                                  return foundFile;
                              }
                          }
                          
                          
                          
                          /**
                           * Executes a shell command and return it as a Promise.
                           * @param cmd {string}
                           * @return {Promise<string>}
                           */
                          
                          function execShellCommand(cmd) {
                              const exec = require('child_process').exec;
                              return new Promise((resolve, reject) => {
                                  exec(cmd, (error, stdout, stderr) => {
                                      if (error) {
                                          console.warn(error);
                                      }
                                      resolve(stdout ? stdout : stderr);
                                  });
                              });
                          }
                           
                          
                          async function checkBackup() {
                              try {
                                  //hier mount-Kommando
                                  await execShellCommand(mountCmd);
                                
                                  //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                                  //let file = await chkDirNotEmpty(mountDir);
                             
                                  //Nach Files im Directory-Tree suchen (rekursiv)
                                  //file = await chkDirTreeNotEmpty(mountDir);
                                  //if (file != "") {
                                  //    console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                                      // Mail abschicken
                                  //    console.log('Send Mail');
                                  //}
                          
                          
                                  let result = await NewestFile(mountDir);
                                  let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
                          		// Dateialter in Tagen ausrechnen und in Variable übergeben
                                  (fileageDays = (seconds / 86400))
                                  newestFileName = result.file
                          		if (seconds > warnSeconds) {
                                      console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                                      // Mail abschicken
                          			console.log('Send Mail');
                          			sendTo("email.0", "send", {
                          				text: "Directorycheck: " + jobname + "\nLetzte Datei: " + newestFileName + " \nAlter der Datei: " + fileageDays.toFixed(1) + " Tage \nThreshold: " + thresholdDays + " Tage" + "\nVerzeichnis: " + nasDir,
                          				to: 'monitoring@tomkeierleber.de',
                          				subject: 'Monitoring // Neue Dateien gefunden: ' + jobname
                          				});
                          						
                                  }
                          
                          
                                  //hier umount-Kommando
                                  await execShellCommand(umountCmd);
                              } catch (e) {
                                  console.warn(e);
                              }
                          }
                          
                          // Time scheduler
                          schedule('05 16 * * *', () => {
                              checkBackup();
                          });
                          checkBackup();
                          
                           
                          
                          
                          E 1 Reply Last reply
                          0
                          • T tomily

                            @ente34 Servus,
                            ich danke Dir für deine Mühe und bitte herzlichst um Entschuldigung für meine späte Rückmeldung. Bin in den letzten Tagen umgezogen und war leider komplett offline.

                            Hatte die vorgehenden Scripte etwas umgebaut, damit ich die Email auf meine Bedürfnisse anpassen kann. Du wirst schnell sehen, dass ich überhaupt kein guter Skripter bin, aber es hat funktioniert.

                            Bei der neuen Variante bekomme ich die Email, auch wenn KEINE Datei im Ordner ist.

                            Die Prüfung auf das Dateialter wäre mir dem Fall egal. Kann ich das dann einfach raus nehmen?
                            Ich möchte nur prüfen, OB Dateien da sind oder Nicht. Das Alter der Dateien spielt für mich keine Rolle, deshalb habe ich es auf 0 gesetzt.

                            Habe ich nun selbst einen Fehler eingebaut, oder wieso kommt die Mail jedes mal? :face_palm: :dog:

                            // Skript zur Überprüfung von LEEREN bzw. NICHT-LEEREN VERZEICHNISSEN
                            
                            //Threshold - Dauer in Tagen
                            var thresholdDays = 0;
                            // Variable für Dateialter in Tagen. Wird weiter unten benutzt.
                            var fileageDays = 0;
                            // Variable für Dateinamen. Wird weiter unten benutzt.
                            var newestFileName = 0;
                            // Variable für "Jobname"
                            var jobname = "VerzeichnissPruefung";
                            
                            const fs = require('fs');
                            const util = require('util');
                            const readdir = util.promisify(fs.readdir);
                            const stat = util.promisify(fs.stat);
                            const lstat = util.promisify(fs.lstat);
                            
                            
                            // Mountbefehl zusammensetzen
                            const mountDir = '/mnt/backupchecktemp';
                            const nasDir = '//IP/PFAD'
                            const mountCmd = `sudo mount -t cifs -o username=USERNAME,password=PASSWORT,vers=1.0 ${nasDir} ${mountDir}`;
                            const umountCmd = `sudo umount ${nasDir}`;
                            
                            const warnSeconds = thresholdDays * 86400;
                            
                            async function NewestFile(dir) {
                                let newestFileAge = 0;
                                let newestFile = '';
                                //console.log('### '+dir);
                                try {
                                    let files = [];
                                    files = await readdir(dir);
                             
                            
                                    for (let file of files) {
                                        let fullpath = dir + '/' + file;
                                        const s = await lstat(fullpath);
                                        if (s.isFile()) {
                                            const stats = await stat(fullpath);
                                            if (stats.mtimeMs > newestFileAge) {
                                                newestFileAge = stats.mtimeMs;
                                                newestFile = file;
                                            }
                                        } else {
                                            let values = await NewestFile(fullpath);
                                            if (values.age > newestFileAge) {
                                                newestFileAge = values.age;
                                                newestFile = values.file;
                                            }
                                        }
                                    }
                             
                            
                                } catch (e) {
                                    console.log(e);
                                } finally {
                                    return { file: newestFile,  age:newestFileAge };
                                }
                            }
                             
                            
                            async function chkDirNotEmpty(dir) {
                                let files = await readdir(dir); 
                                if ( files.length ){
                                    return files[0];
                                }
                                return "";
                            }
                             
                            
                            async function chkDirTreeNotEmpty(dir) {
                                let foundFile = '';
                                try {
                                    let files = [];
                                    files = await readdir(dir);
                             
                            
                                    for (let file of files) {
                                        let fullpath = dir + '/' + file;
                                        const s = await lstat(fullpath);
                                        if (s.isFile()) {
                                            foundFile = fullpath;
                                            break;
                                        } else {
                                            let rc = await chkDirTreeNotEmpty(fullpath);
                                            if (rc != "") {
                                                foundFile = rc;
                                                break;
                                            }
                                        }
                                    }
                             
                            
                                } catch (e) {
                                    console.log(e);
                                } finally {
                                    return foundFile;
                                }
                            }
                            
                            
                            
                            /**
                             * Executes a shell command and return it as a Promise.
                             * @param cmd {string}
                             * @return {Promise<string>}
                             */
                            
                            function execShellCommand(cmd) {
                                const exec = require('child_process').exec;
                                return new Promise((resolve, reject) => {
                                    exec(cmd, (error, stdout, stderr) => {
                                        if (error) {
                                            console.warn(error);
                                        }
                                        resolve(stdout ? stdout : stderr);
                                    });
                                });
                            }
                             
                            
                            async function checkBackup() {
                                try {
                                    //hier mount-Kommando
                                    await execShellCommand(mountCmd);
                                  
                                    //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                                    //let file = await chkDirNotEmpty(mountDir);
                               
                                    //Nach Files im Directory-Tree suchen (rekursiv)
                                    //file = await chkDirTreeNotEmpty(mountDir);
                                    //if (file != "") {
                                    //    console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                                        // Mail abschicken
                                    //    console.log('Send Mail');
                                    //}
                            
                            
                                    let result = await NewestFile(mountDir);
                                    let seconds = (new Date().getTime() - new Date(result.age).getTime()) / 1000;
                            		// Dateialter in Tagen ausrechnen und in Variable übergeben
                                    (fileageDays = (seconds / 86400))
                                    newestFileName = result.file
                            		if (seconds > warnSeconds) {
                                        console.log(`newest file "${result.file}" created before ${seconds} seconds`);
                                        // Mail abschicken
                            			console.log('Send Mail');
                            			sendTo("email.0", "send", {
                            				text: "Directorycheck: " + jobname + "\nLetzte Datei: " + newestFileName + " \nAlter der Datei: " + fileageDays.toFixed(1) + " Tage \nThreshold: " + thresholdDays + " Tage" + "\nVerzeichnis: " + nasDir,
                            				to: 'monitoring@tomkeierleber.de',
                            				subject: 'Monitoring // Neue Dateien gefunden: ' + jobname
                            				});
                            						
                                    }
                            
                            
                                    //hier umount-Kommando
                                    await execShellCommand(umountCmd);
                                } catch (e) {
                                    console.warn(e);
                                }
                            }
                            
                            // Time scheduler
                            schedule('05 16 * * *', () => {
                                checkBackup();
                            });
                            checkBackup();
                            
                             
                            
                            
                            E Offline
                            E Offline
                            ente34
                            wrote on last edited by
                            #31

                            @tomily
                            Ich muss noch einmal nachfragen, wann möchtest Du bei der neuen Variante eine Nachricht bekommen?
                            Willst Du beide Varianten für verschiedene Directories gleichzeitig benutzen?

                            T 1 Reply Last reply
                            0
                            • E ente34

                              @tomily
                              Ich muss noch einmal nachfragen, wann möchtest Du bei der neuen Variante eine Nachricht bekommen?
                              Willst Du beide Varianten für verschiedene Directories gleichzeitig benutzen?

                              T Offline
                              T Offline
                              tomily
                              wrote on last edited by
                              #32

                              @ente34 Dieser Anwendungsfall wäre:

                              Benachrichtigung, wenn Ordner NICHT Leer ist.

                              Es handelt sich also beispielsweise um ein Verzeichnis, das immer leer sein sollte. Sobald es nicht mehr leer ist (Inhalt y >= 1 Datei), dann wird die Benachrichtigung ausgelöst.

                              Keine Sorge, die anderen Skripte waren nicht um sonst und sind beide fleißig im Einsatz.
                              Beim Einsetzen und anpassen ist mir diese Anwendungsart noch eingefallen und wäre sehr hilfreich.

                              Grüße

                              E 1 Reply Last reply
                              0
                              • T tomily

                                @ente34 Dieser Anwendungsfall wäre:

                                Benachrichtigung, wenn Ordner NICHT Leer ist.

                                Es handelt sich also beispielsweise um ein Verzeichnis, das immer leer sein sollte. Sobald es nicht mehr leer ist (Inhalt y >= 1 Datei), dann wird die Benachrichtigung ausgelöst.

                                Keine Sorge, die anderen Skripte waren nicht um sonst und sind beide fleißig im Einsatz.
                                Beim Einsetzen und anpassen ist mir diese Anwendungsart noch eingefallen und wäre sehr hilfreich.

                                Grüße

                                E Offline
                                E Offline
                                ente34
                                wrote on last edited by
                                #33

                                @tomily
                                Du musst nur folgendes einkommentieren (ev. anderen Pfad statt mountDir benutzen)

                                        //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                                        let file = await chkDirNotEmpty(mountDir);
                                        if (file != "") {
                                            console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                                            // Mail abschicken
                                            console.log('Send Mail');
                                        }
                                
                                
                                T 1 Reply Last reply
                                0
                                • E ente34

                                  @tomily
                                  Du musst nur folgendes einkommentieren (ev. anderen Pfad statt mountDir benutzen)

                                          //Nach leeren Directory suchen (nicht rekursiv, gefunden werden Files oder Directories)
                                          let file = await chkDirNotEmpty(mountDir);
                                          if (file != "") {
                                              console.log(`directory tree ${mountDir} not empty, found file "${file}" `);
                                              // Mail abschicken
                                              console.log('Send Mail');
                                          }
                                  
                                  
                                  T Offline
                                  T Offline
                                  tomily
                                  wrote on last edited by
                                  #34

                                  @ente34
                                  GEIL!

                                  GEIL! :-)

                                  Es ist manchmal so einfach. Habe den falschen Bereich auskommentiert, weil ich den Code nicht 100%ig verstanden hab.
                                  Durch deine erneute und geduldige Hilfe bin ich erneut am Ziel :-)

                                  Mega cool....auch das funktioniert nun genau wie gewünscht =)

                                  Grüße
                                  Tomily

                                  1 Reply Last reply
                                  0
                                  • AlCalzoneA AlCalzone

                                    Wenn es wirklich nur um neue Dateien (neuer Name, nicht überschrieben) geht, kann man im JS Skript auch lediglich mtime des Verzeichnisses prüfen und muss nicht erst alle Dateien enumerieren und deren Zeitstempel prüfen.

                                    M Online
                                    M Online
                                    michihorn
                                    wrote on last edited by
                                    #35

                                    @alcalzone sagte in Ordner auf neue Dateien überwachen:

                                    Wenn es wirklich nur um neue Dateien (neuer Name, nicht überschrieben) geht, kann man im JS Skript auch lediglich mtime des Verzeichnisses prüfen und muss nicht erst alle Dateien enumerieren und deren Zeitstempel prüfen.

                                    Hast du ein Beispiel dazu, ich möchte gerne ein Verzeichnis auf meiner Fritzbox.NAS lesen können
                                    Gruß
                                    Michael

                                    AlCalzoneA 1 Reply Last reply
                                    0
                                    • M michihorn

                                      @alcalzone sagte in Ordner auf neue Dateien überwachen:

                                      Wenn es wirklich nur um neue Dateien (neuer Name, nicht überschrieben) geht, kann man im JS Skript auch lediglich mtime des Verzeichnisses prüfen und muss nicht erst alle Dateien enumerieren und deren Zeitstempel prüfen.

                                      Hast du ein Beispiel dazu, ich möchte gerne ein Verzeichnis auf meiner Fritzbox.NAS lesen können
                                      Gruß
                                      Michael

                                      AlCalzoneA Offline
                                      AlCalzoneA Offline
                                      AlCalzone
                                      Developer
                                      wrote on last edited by
                                      #36

                                      @michihorn Öhh...

                                      const fs = require("fs");
                                      const mtime = fs.statSync("/pfad/des/verzeichnisses").mtime;
                                      
                                      if (mtime > /* Zeitstempel */) {
                                        // reagieren
                                      }
                                      

                                      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                                      1 Reply Last reply
                                      0
                                      • E ente34

                                        @tomily

                                        Ungefähr so
                                        Du benötigst aber den neuesten javascript-Adapter 4.11.0

                                        const fs = require('fs');
                                        const util = require('util');
                                        const readdir = util.promisify(fs.readdir);
                                        const stat = util.promisify(fs.stat);
                                        const lstat = util.promisify(fs.lstat);
                                        
                                        async function checkDir(dir) {
                                            let files = [];
                                            try {
                                                files = await readdir(dir);
                                               
                                                let newestFileAge = 0;
                                                let newestFile = '';
                                        
                                                for (let file of files) {
                                                    let fullpath = dir + '/' + file;
                                                    const s = await lstat(fullpath);
                                                    if (s.isFile()) {
                                                        const stats = await stat(fullpath);
                                                        if (stats.mtimeMs > newestFileAge) {
                                                            newestFileAge = stats.mtimeMs;
                                                            newestFile = file;
                                                        }
                                                    }
                                                }
                                        
                                                let seconds = (new Date().getTime() - new Date(newestFileAge).getTime()) / 1000;
                                                console.log(`newest file "${newestFile}" created before ${seconds} seconds`);
                                            } catch (e) {
                                                console.log(e);
                                            }
                                        }
                                        
                                        checkDir('c:/temp');
                                        
                                        
                                        A Offline
                                        A Offline
                                        abuzze
                                        wrote on last edited by
                                        #37

                                        @ente34 sagte in Ordner auf neue Dateien überwachen:

                                        @tomily

                                        Ungefähr so
                                        Du benötigst aber den neuesten javascript-Adapter 4.11.0

                                        const fs = require('fs');
                                        const util = require('util');
                                        const readdir = util.promisify(fs.readdir);
                                        const stat = util.promisify(fs.stat);
                                        const lstat = util.promisify(fs.lstat);
                                        
                                        async function checkDir(dir) {
                                            let files = [];
                                            try {
                                                files = await readdir(dir);
                                               
                                                let newestFileAge = 0;
                                                let newestFile = '';
                                        
                                                for (let file of files) {
                                                    let fullpath = dir + '/' + file;
                                                    const s = await lstat(fullpath);
                                                    if (s.isFile()) {
                                                        const stats = await stat(fullpath);
                                                        if (stats.mtimeMs > newestFileAge) {
                                                            newestFileAge = stats.mtimeMs;
                                                            newestFile = file;
                                                        }
                                                    }
                                                }
                                        
                                                let seconds = (new Date().getTime() - new Date(newestFileAge).getTime()) / 1000;
                                                console.log(`newest file "${newestFile}" created before ${seconds} seconds`);
                                            } catch (e) {
                                                console.log(e);
                                            }
                                        }
                                        
                                        checkDir('c:/temp');
                                        
                                        

                                        Hallo in die Runde.
                                        Ist schon ein bisschen älter das Thema aber ich habe dazu noch eine Frage.
                                        Was muss ich an diesem Code ändern, damit ich auch Unterverzeichnisse auf neuste Dateien prüfen kann ?
                                        Danke

                                        1 Reply Last reply
                                        0
                                        Reply
                                        • Reply as topic
                                        Log in to reply
                                        • Oldest to Newest
                                        • Newest to Oldest
                                        • Most Votes


                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        657

                                        Online

                                        32.7k

                                        Users

                                        82.3k

                                        Topics

                                        1.3m

                                        Posts
                                        Community
                                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                        ioBroker Community 2014-2025
                                        logo
                                        • Login

                                        • Don't have an account? Register

                                        • Login or register to search.
                                        • First post
                                          Last post
                                        0
                                        • Home
                                        • Recent
                                        • Tags
                                        • Unread 0
                                        • Categories
                                        • Unreplied
                                        • Popular
                                        • GitHub
                                        • Docu
                                        • Hilfe