effel: Öffnen und Schließen einer Datei in node/javascript

Hallo,

Ich arbeite mit node. In meinem Programm muß ich mehrfach eine Textdatei öffnen und schließen:


fs.open('DR_DAT1.txt', 'r+', function (err, fd) {
console.log("fd ",fd)  
fd_DR_DAT1=fd
console.log("fd_DR_DAT1A ",fd_DR_DAT1)
  if (err) throw err;
  console.log('DR_DAT1.txt opened');
});
console.log("fd_DR_DAT1B ",fd_DR_DAT1)


console.log("fd_DR_DAT1 ",fd_DR_DAT1)
fs.close(fd_DR_DAT1, function (err){
   if (err) {
   console.log(err);
    }else{
console.log("DR_DAT1 erfolgreich geschlossen")
    }
   })

Ich habe festgestellt, daß das Öffnen verzögert abläuft, während das Programm weiterläuft.

Nach "open" muß also immer etwas Zeit vergehen, ehe gelesen oder geschrieben wird.

Frage:

Kann man "open" syncron ablaufen lassen - also erst, wenn "open" erledigt, dann weiter?

Gibt es in node ein "timeout"?

oder gibt es noch andere Lösungen ?

Danke für Eure Hilfe Effel

  1. Lieber effel,

    Ich habe festgestellt, daß das Öffnen verzögert abläuft, während das Programm weiterläuft.

    Nach "open" muß also immer etwas Zeit vergehen, ehe gelesen oder geschrieben wird.

    deswegen übergibst Du fs.open() als drittem Parameter auch eine Funktion, die genau dann ausgeführt wird, wenn open() fertig ist. Es ist die in JS übliche ereignisbasierte Programmierung.

    Frage:

    Kann man "open" syncron ablaufen lassen - also erst, wenn "open" erledigt, dann weiter?

    Arbeite mit Promises. Das ist das Konzept, das diese Asynchronität umsetzt.

    Gibt es in node ein "timeout"?

    Sagt man wirklich „das“ Timeout? Für mich ist das ein Fehlerfall, also eher „der“ Timeout. Hmm.

    Wenn fs.open() ein ein solches problem rennt, dann kann Deine anonyme Funktion diesen in der Fehlermeldung err entgegen nehmen.

    oder gibt es noch andere Lösungen ?

    Lösungen gibt es sicher noch andere, aber Du willst davon ja die sinnvollste und am besten überprüfbare haben. Also beschäftigst Du Dich besser mit dem Konzept von Promises.

    Liebe Grüße

    Felix Riesterer

    1. Danke Felix Riesterer

      So klappt es: Die funktion benutzen !!

      Effel

  2. Hallo effel,

    Kann man "open" syncron ablaufen lassen - also erst, wenn "open" erledigt, dann weiter?

    Synchron, ja. Verwende das synchrone API. Damit blockiert der Rest von Node und auch die weitere Programmausführung, bis der open fertig ist. Du bekommst ein FileHandle Objekt und kannst damit die weiteren Dateioperationen durchführen.

    Aber das mache nur, wenn Du ein reines Kommandozeilentool schreibst. Wenn Du einen HTTP Eventlistener betreibst, sind blockierende Operationen tödlich. Dann bleib beim Callback API, oder verwende das Promise-API.

    Leider ist die node.js Doku da sehr arm an Beispielen. Und die Beispiele, die da sind, verwenden await. Das ist Syntaxzucker für Promises, und du musst beachten, dass await nur in einer async-Funktion funktioniert ODER in einem ECMAScript-Modul (die Dinger, die mit import geladen werden).

    Damit dein Hauptprogramm ein ECMAScript-Modul ist, muss in der package.json der Eintrag

      "type": "module",
    

    stehen. Ist nicht so ganz einfach, die richtigen Stellschräubchen zu drehen...

    Rolf

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

      Gute Erklärung! Danke!

      Ich habe erfolgreich (ansync) open und close eingesetzt und auch fs.Readsync(..) und fs.appendSync(..) Frage: Wie gibt fs.ReadSync fs.appendSync die Fehlermeldung aus? mit Callback oder anders.

      frd Grüsse Effel

      1. Hallo effel,

        Wie gibt fs.ReadSync fs.appendSync die Fehlermeldung aus?

        Es wirft einen Error. D. h. du musst try/catch drumherum legen.

        Guckst Du hier - da sind Beispiele für alle 3 API Typen (für den unlink-Aufruf, aber das Konzept bleibt ja gleich).

        Rolf

        --
        sumpsi - posui - obstruxi