Linuchs: Kann Javascript das Änderungsdatum einer **lokalen** Datei ermitteln?

Moin,

Mein lokales Liederbuch hat eine HTML-Übersicht mit Links zu den HTML-Liedtexten in Unterverzeichnissen, also auch lokal.

In der Übersicht möchte ich das Änderungsdatum der Link-Ziele angeben.

Vorher muss ich noch prüfen, ob das Linkziel vorhanden ist, sonst gibt es einen Fehler.

Habe recherchiert, aber die Antworten setzen einen Server voraus, lokal habe ich nur den Browser.

Das eigene Datum ermittelt Javascript so:

const lastMod = new Date(document.lastModified);
console.log("lastModified=[" +lastMod.toLocaleDateString("de-DE") +"]");

Nun dachte ich, ich könnte "document" durch den Link ersetzen, also

var ziel = "29 aber_dich_gibts_nur_einmal/index.htm";
const lastMod = new Date(ziel.lastModified);
console.log("lastModified=[" +lastMod.toLocaleDateString("de-DE") +"]");

=> Invalid Date - der Link funktioniert aber, also Datei vorhanden

Danke schon mal für gute Tipps.

Gruß, Linuchs

  1. Moin Linuchs,

    Moin,

    Mein lokales Liederbuch hat eine HTML-Übersicht mit Links zu den HTML-Liedtexten in Unterverzeichnissen, also auch lokal.

    In der Übersicht möchte ich das Änderungsdatum der Link-Ziele angeben.

    Vorher muss ich noch prüfen, ob das Linkziel vorhanden ist, sonst gibt es einen Fehler.

    Habe recherchiert, aber die Antworten setzen einen Server voraus, lokal habe ich nur den Browser.

    Na ja, oder wenigstens eine Runtime wie Node.js (damit du fs.stats nutzen kannst).

    Das eigene Datum ermittelt Javascript so:

    const lastMod = new Date(document.lastModified);
    console.log("lastModified=[" +lastMod.toLocaleDateString("de-DE") +"]");
    

    Nun dachte ich, ich könnte "document" durch den Link ersetzen, also

    var ziel = "29 aber_dich_gibts_nur_einmal/index.htm";
    const lastMod = new Date(ziel.lastModified);
    console.log("lastModified=[" +lastMod.toLocaleDateString("de-DE") +"]");
    

    => Invalid Date - der Link funktioniert aber, also Datei vorhanden

    Für JavaScript ist ziel ein String. Diese haben keine Eigenschaft lastModified. Du müsstest also das Dokument erst abrufen. Nur: via file:-Protokoll dürfte dir da der Browser dazwischen grätschen. Vielleicht geht es ja mit einem iframe? (Muss nicht zwingend im DOM gehängt werden?). Wie rufst du das Dokument auf? Womit fängt die URL in der Leiste an? (http oder file?)

    Gruß,

    --
    a.k.a. André
    1. Moin André

      Womit fängt die URL in der Leiste an? (http oder file?)

      Aha, das hatte ich nicht davor. Aber jetzt: file:///home/kalle/musik/kalle/29%20aber_dich_gibts_nur_einmal/index.htm?nr=29 lastModified=[Invalid Date]

      Der Link funktioniert, die Datumsabfrage aber nicht.

      var ziel  = "file:///home/kalle/musik/kalle/29%20aber_dich_gibts_nur_einmal/index.htm?nr=29";
      lastMod   = new Date(ziel.lastModified);
      console.log(ziel +" lastModified=[" +lastMod.toLocaleDateString("de-DE") +"]");
      

      Gruß, Linuchs

      1. Moin Linuchs,

        Moin André

        Womit fängt die URL in der Leiste an? (http oder file?)

        Aha, das hatte ich nicht davor. Aber jetzt: file:///home/kalle/musik/kalle/29%20aber_dich_gibts_nur_einmal/index.htm?nr=29 lastModified=[Invalid Date]

        Das sieht mir nach einem Linux aus. Kannst du einen Python-Web-Server im Terminal starten?

        cd ~/musik/kalle/29%20aber_dich_gibts_nur_einmal # in den Ordner wechseln
        python3 -m http.server & # einen Web-Server starten
        firefox http://localhost:8000/ # Die index.html im Web-Browser betrachten
        

        Der Link funktioniert, die Datumsabfrage aber nicht.

        Aus genannten Gründen (ein String besitzt diese Eigenschaft nicht)

        var ziel  = "file:///home/kalle/musik/kalle/29%20aber_dich_gibts_nur_einmal/index.htm?nr=29";
        lastMod   = new Date(ziel.lastModified);
        console.log(ziel +" lastModified=[" +lastMod.toLocaleDateString("de-DE") +"]");
        

        Gruß,

        --
        a.k.a. André
  2. Hallo Linuchs,

    var ziel = "29 aber_dich_gibts_nur_einmal/index.htm";
    const lastMod = new Date(ziel.lastModified);

    dafür, was Du schon so alles auf die Beine gestellt hast, machst Du doch gelegentlich sehr merkwürdige Fehler. Dass JavaScript nicht wissen kann, dass dein String einen Dateinamen enthält und schon deshalb keine Datei-Infos haben kann, sollte Dir klar sein.

    Dass der Browser Dich mit Zähnen und Klauen vom lokalen System fernhält, sollte für Dich ebenfalls keine Neuigkeit sein. Der letzte Browser, der das erlaubte, hieß Internet Explorer, worin Du mit new ActiveXObject("Scripting.FileSystemObject"); die Abrißbirne für das lokale System in die Hand bekommen konntest.

    Mein lokales Liederbuch hat eine HTML-Übersicht mit Links zu den HTML-Liedtexten in Unterverzeichnissen, also auch lokal.

    In der Übersicht möchte ich das Änderungsdatum der Link-Ziele angeben.

    Wo kommt das lokale Liederbuch denn her? Und vor allem: wo kommt die Indexseite her? Pflegst Du die von Hand oder erstellst Du sie mit Hilfe eines Scripts?

    Wenn von Hand: Stopp, schreib ein Script (bspw. in PHP), das sie auf dem Computer erzeugt, wo das Image für das lokale Liederbuch gepflegt wird.

    Dieses Script wäre der geeignete Ort, um das Dateidatum zu ermitteln und in die Indexseite zu schreiben. Vom Browser aus geht es nur, wenn Du für das lokale Liederbuch einen lokalen Webserver mitlieferst. Das ist prinzipiell möglich, aber lästiger Aaufwand, vor allem, wenn das Liederbuch auf einem Tablet laufen soll.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Moin Rolf,

      Dass der Browser Dich mit Zähnen und Klauen vom lokalen System fernhält, sollte für Dich ebenfalls keine Neuigkeit sein. Der letzte Browser, der das erlaubte, hieß Internet Explorer, worin Du mit new ActiveXObject("Scripting.FileSystemObject"); die Abrißbirne für das lokale System in die Hand bekommen konntest.

      Nunja … mit einem HTML Input oder der File and Directory Entries API ginge da schon etwas in ausgewählten Browsern …

      Wenn von Hand: Stopp, schreib ein Script (bspw. in PHP), das sie auf dem Computer erzeugt, wo das Image für das lokale Liederbuch gepflegt wird.

      Dieses Script wäre der geeignete Ort, um das Dateidatum zu ermitteln und in die Indexseite zu schreiben. Vom Browser aus geht es nur, wenn Du für das lokale Liederbuch einen lokalen Webserver mitlieferst. Das ist prinzipiell möglich, aber lästiger Aaufwand, vor allem, wenn das Liederbuch auf einem Tablet laufen soll.

      Kann im Prinzip ja auch auf irgendeinem Single Board Computer (Arduino, Raspberry Pi o.Ä.) laufen, der dann in einer Ecke verstaubt …

      Ein Script wäre aber aus Wartungs-Sicht zu empfehlen, ja.

      Gruß,

      --
      a.k.a. André
      1. Moin André,

        Ein Script wäre aber aus Wartungs-Sicht zu empfehlen, ja.

        Die Daten sind ja nicht auf einem Server. Dann müsste ich dass Lied-Dokument unnötigerweise dorthin hochladen und die Übersicht wieder runterladen.

        Da ist es einfacher, einen Hand-Eintrag in der Übersicht vorzunehmen.

        Gruß, Linuchs

        1. Hallo Linuchs,

          Die Daten sind ja nicht auf einem Server.

          Die Daten sind aber sicherlich auf irgendeinem Master-Device, wo Du auch die Indexdatei pflegst. Von dort kopierst Du das Liederbuch auf diverse Anwendergeräte. Tablets, Notebooks, was auch immer.

          Aber letztlich ist das Datum ja nur eine von vielen Meta-Informationen, und bei neuen Liedern musst Du diese ohnehin bereitstellen und den Index pflegen.

          Frage wäre dann, ob "Aktualisiere das Datum für ein existierendes Lied" ein häufiger Usecase ist oder eher die Ausnahme. Ist es die Ausnahme, würde ich darauf keine Zeit verwenden. Auf dem Anwendergerät kommst Du an die Info jedenfalls nicht mehr heran. Auch nicht mit dem File System Access API - damit kannst Du zwar einen lokalen Ordner öffnen (unter Kontrolle des Anwenders), aber bekommst nur die Dateinamen, soweit ich das sehe.

          Rolf

          --
          sumpsi - posui - obstruxi
    2. Hallo Rolf,

      vor allem, wenn das Liederbuch auf einem Tablet laufen soll.

      Ja, auf einem Tablet zum Mitnehmen auch.

      wo kommt die Indexseite her? Pflegst Du die von Hand

      von Hand.

      Vom Browser aus geht es nur, wenn Du für das lokale Liederbuch einen lokalen Webserver mitlieferst.

      Okay, das wäre dann das AUS für die Idee mit dem Datum, danke.

      Dann kann Javascript auch keine Auskunft geben, ob eine Datei im Unterverzeichnis vorhanden ist?

      Gruß, Linuchs

      1. Guten Abend!

        Dann kann Javascript auch keine Auskunft geben, ob eine Datei im Unterverzeichnis vorhanden ist?

        JavaScript/Tutorials/Sicherheitskonzepte

        Dort Kap. 1: Sandbox-Prinzip

        Das ist noch von molily - das müsste hinsichtlich Node.js, was hier aber keine Rolle spielt, ergänzt werden.

        Schönes Wochenende!
        Matthias Scharwies

  3. Lieber Linuchs,

    Mein lokales Liederbuch hat eine HTML-Übersicht mit Links zu den HTML-Liedtexten in Unterverzeichnissen, also auch lokal.

    dieses HTML-Dokument (aka HTML-Übersicht) hast Du also von Hand erstellt. Warum hast Du von Hand dann nicht auch das Datum der letzten Änderung eingetragen?

    In der Übersicht möchte ich das Änderungsdatum der Link-Ziele angeben.

    Warum? Gibt es da etwas wie eine Versionierung von Inhalten?

    Habe recherchiert, aber die Antworten setzen einen Server voraus, lokal habe ich nur den Browser.

    Du bist doch nun wirklich nicht erst seit gestern hier. Beschreibe doch mal bitte den gesamten Gedanken zu Deinem Anwendungsfall und nicht nur ein sehr spezielles technisches Problem! Vielleicht ist Deine Herangehensweise ja grundsätzlich nicht dafür geeignet, was Du wirklich erreichen möchtest!

    Liebe Grüße

    Felix Riesterer

    1. Lieber Felix,

      die Lied-Übersicht kann ein Jahr oder mehr unverändert sein, aber die einzelnen Titel werden oft ergänzt / geändert.

      Warum hast Du von Hand dann nicht auch das Datum der letzten Änderung eingetragen?

      Da dieses Liederbuch in verschiedene Systeme (Tablet, NAS, anderer Laptop) kopiert wird, möchte ich in der Übersicht sehen können, ob die einzelnen Titel

      • vorhanden
      • und aktuell sind

      Das Änderungdatum der Übersicht ermittle ich dank der Hilfe hier per JS, die Datümer der einzelnen Lieder habe ich von Hand eingetragen:

      Gruß, Linuchs

  4. Hi there,

    Mein lokales Liederbuch hat eine HTML-Übersicht mit Links zu den HTML-Liedtexten in Unterverzeichnissen, also auch lokal.

    In der Übersicht möchte ich das Änderungsdatum der Link-Ziele angeben.

    Ich weiß ja nicht, ob das für Dein Vorhaben praktikabel ist, aber was spricht dagegen, den Zeitstempel einfach an den Dateinamen anzuhängen?

    Vorher muss ich noch prüfen, ob das Linkziel vorhanden ist, sonst gibt es einen Fehler.

    Für alle Browser scheint mir das nicht möglich zu sein. Für einen eventuellen Workaround müsste man wissen, was genau Du vorhast und auf welche Ressourcen Du zugreifen kannst...

    1. Mein lokales Liederbuch hat eine HTML-Übersicht mit Links zu den HTML-Liedtexten in Unterverzeichnissen, also auch lokal.

      In der Übersicht möchte ich das Änderungsdatum der Link-Ziele angeben.

      Ich weiß ja nicht, ob das für Dein Vorhaben praktikabel ist, aber was spricht dagegen, den Zeitstempel einfach an den Dateinamen anzuhängen?

      Sorry, vergiss mein Posting, da waren meine Finger schneller als meine Gedanken, das ist natürlich völliger Unfug...

  5. Hallo Linuchs,

    du kannst das Datum mit

    ${new Date(file.lastModified)}
    

    ermitteln. file kommt aus der File API

    Gruß
    Jürgen

    1. Hallo Jürgen,

      die Challenge: ohne Benutzermithilfe ein File-Objekt bekommen!

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Moin Rolf,

        die Challenge: ohne Benutzermithilfe ein File-Objekt bekommen!

        Wieso jetzt mit einem Mal ohne Benutzermithilfe?

        Das File-API wurde ja schon verlinkt. Auf <input type="file" /> wird ein Event-Listener für „change” registriert. Von da aus kannst dich dann weiterhangeln.

        Gruß,

        --
        a.k.a. André
        1. Hi,

          die Challenge: ohne Benutzermithilfe ein File-Objekt bekommen!

          Wieso jetzt mit einem Mal ohne Benutzermithilfe?

          so wie ich Linuchs verstanden habe, hat er ein Verzeichnis mit Dateien, und würde jetzt gerne eine Auflistung der Files anzeigen und bei jedem File das Änderungsdatum dazu.

          cu,
          Andreas a/k/a MudGuard

          1. Hallo,

            ich glaube, jetzt sollte Linuchs mal sagen, was er will.

            Gruß
            Jürgen

            1. Hallo Jürgen,

              ich glaube, jetzt sollte Linuchs mal sagen, was er will.

              heute 09.09.: https://forum.selfhtml.org/self/2025/sep/05/kann-javascript-das-anderungsdatum-einer-lokalen-datei-ermitteln/1821678#m1821678

              Rolf B: Linkfix. Entweder [Text](URL) oder <URL>, bitte

      2. Hallo Rolf,

        die Challenge: ohne Benutzermithilfe ein File-Objekt bekommen!

        ohne Benutzermithilfe geht das natürlich nicht. Aber der Musiker muss ja das lokale Liederbuch auswählen, und dann gibt es das File-Objekt.

        Gruß
        Jürgen

        1. Hallo Jürgen und auch André,

          Mein lokales Liederbuch hat eine HTML-Übersicht mit Links zu den HTML-Liedtexten in Unterverzeichnissen, also auch lokal.

          In der Übersicht möchte ich das Änderungsdatum der Link-Ziele angeben.

          Das ist natürlich nur eine Annahme von mir, aber ich gehe davon aus, dass es keine Liederbuchauswahl gibt, sondern dass Linuchs möchte, dass die Seite aufgeht und die vordefinierte Liederbuchauswahl. Es geht ja um Leute, die musik- aber nicht IT-affin sind und er

          Mit einer manüllen Auswahl des Liederbuchordners käme man weiter, aber dann nicht mit File API, das liefert nur eine Datei. Es müsste schon das Filesystem Access API sein, denke ich, das Filehandles liefert. Und da habe ich lastModified nicht entdeckt. Ich sitze allerdings auch gerade in einem Alpendorf vor meinem Tablet und kann nicht experimentieren.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Hallo Rolf,

            lastModified kommt mit dem Fileobjekt aus der File-API, für den Inhalt braucht man dann die File-Reader-API.

            Gruß
            Jürgen

          2. Hallo Rolf,

            Ich sitze allerdings auch gerade in einem Alpendorf vor meinem Tablet und kann nicht experimentieren.

            du liebe Güte, wieso wurdest du denn dorthin abgeschoben? 🤭

            Einen schönen Tag noch
             Martin

            --
            Manchmal kann man gar nicht so viel fühlen, wie man denkt.
            Und manchmal fühlt man so viel, dass man gar nicht denken kann.
            1. Hallo Martin,

              das passiert denen, die zu wenig im Wiki mitarbeiten 😟

              Rolf

              --
              sumpsi - posui - obstruxi
          3. Hallo Rolf,

            Ich sitze allerdings auch gerade in einem Alpendorf vor meinem Tablet und kann nicht experimentieren.

            da wünsche ich dir einen schönen Urlaub.

            Gruß
            Jürgen