node.js fs.writeFile Nicht Vollständig Datei Überschreiben

Ich habe eine Datei, die der Länge X und es wird überschrieben, indem ein string der Länge X-Y Problem ist, dass die Datei, und behalten Sie die Informationen, die letzten X-Y, so dass es ist, solange die erste längere Datei. So, hier ist meine test-Ausgabe, die mir passt:

Datei gestartet wie:

{
    "sOption1": "String",
    "nOption2": 23.5,
    "sOption3": "String",
    "bOption3B": true,
    "anOption4": [
        5,
        6,
        7
    ],
    "sNewString": "FruitSalad",
    "bNewBoolean": false,
    "iNewNumber": 14.2,
    "anNewArray": [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
    ],
    "oNewObject": {
        "bToBeOrNotToBe": true,
        "sFinishQuote": "That is the question"
    }
}

Verändert die Daten, die geschrieben werden, um die folgenden:

{
    "sOption1": "String",
    "nOption2": 23.5,
    "sOption3": "String",
    "bOption3B": true,
    "anOption4": [
        5,
        6,
        7
    ],
    "sNewString": "YummyYummy",
    "bNewBoolean": true,
    "iNewNumber": 2.14,
    "anNewArray": [
        10,
        9
    ],
    "oNewObject": {
        "bToBeOrNotToBe": false,
        "sNewQuote": "To die, to sleep, no more"
    }
}

Danach die Datei ist jetzt:

{
    "sOption1": "String",
    "nOption2": 23.5,
    "sOption3": "String",
    "bOption3B": true,
    "anOption4": [
        5,
        6,
        7
    ],
    "sNewString": "YummyYummy",
    "bNewBoolean": true,
    "iNewNumber": 2.14,
    "anNewArray": [
        10,
        9
    ],
    "oNewObject": {
        "bToBeOrNotToBe": false,
        "sNewQuote": "To die, to sleep, no more"
    }
}       "bToBeOrNotToBe": true,
        "sFinishQuote": "That is the question"
    }
}}

Sehen, die Müll auf die Ende des Objekts? Es ist übrig von der vorherigen Datei, obwohl ich schrieb es mit dem folgenden code:

DeviceConfiguration.prototype.SetPersistentUserOption = function(sNewOptionName, NewOption)
{
    var sNewFile = "";
    var fs = require('fs');

    //if one of the primitive types, it's simple, just add it to object
    if(typeof(NewOption) == "string" || typeof(NewOption) == "number" || typeof(NewOption) == "boolean")
    {
        this.oPersistentUserOptions[sNewOptionName] = NewOption;
    }
    else if(NewOption instanceof Array)
    {
        //blank out array if it was there already
        this.oPersistentUserOptions[sNewOptionName] = [];   

        //now go back and copy each element over one at a time
        for(var nIndex = 0; nIndex < NewOption.length; nIndex++)
        {   this.oPersistentUserOptions[sNewOptionName][nIndex] = NewOption[nIndex];    }
    }
    else if(NewOption instanceof Object)
    {
        //blank out object if it was there already
        this.oPersistentUserOptions[sNewOptionName] = {};   

        //now go back and copy each element over one at a time
        for(Member in NewOption)
        {   this.oPersistentUserOptions[sNewOptionName][Member] = NewOption[Member];    
        }
    }

    //stringify the object, and make it pretty with options null, 4
    sNewFile = JSON.stringify(this.oPersistentUserOptions, null, 4);

    //write to the file, parameter is immediately in object memory though
    fs.writeFile(PERSISTENT_USER_SELECTED_OPTIONS_FILENAME, sNewFile, function(err){console.log(err);});
    //fs.writeFileSync(PERSISTENT_USER_SELECTED_OPTIONS_FILENAME, sNewFile);

    console.log(sNewFile.length);
    console.log(sNewFile);
};

Ich habe überprüft, um sicherzustellen, dass die sNewFile variable ist die richtige Länge, und es ist. Ich habe auch pausiert, solange 6 Sekunden zwischen nachfolgenden Schreibvorgänge auf die Festplatte, so kann ich nicht sehen, wie das könnte ein timing-Problem.

Wenn ich writeFileSync das problem geht Weg, aber ich wirklich don ' T haben die Möglichkeit, synchrone schreibt für diese Anwendung, da ich das timing kritisch und wollen nicht zu verlangsamen, um auf die Festplatte schreiben.

Bin ich auf node.js 0.8.21, aber es sieht nicht aus wie die Oberfläche hat sich geändert, jeder für fs zwischen dieser und der aktuellen version.

Jemand anderes trifft so etwas zu? Dies gibt mir passt. . .

  • Welches OS ist das? Es klingt wie es ist, säumige an der öffnung in der r+ - Modus, das würde nicht viel Sinn ergeben.
  • Ich bin auf Ubuntu 12.04
  • funktioniert mein code für Sie arbeiten unter ubuntu?
  • Es funktioniert, nur lief es. Ich habe ein paar einfache tests, die ähnlich wie vor dem posten und konnte es nicht zu scheitern.
  • testen Sie es auf 0.10 oder zu hacken, um es durch das entfernen der Datei, wenn es vorhanden ist, bevor Sie schreiben, die neue Inhalte.
  • Ich habe gerade aktualisiert die Frage, mit der gesamten Funktion, die tut, zu schreiben. Ich wirklich nicht wollen, zu aktualisieren 0.10 jetzt. Haben Sie Anregungen, wie Sie zu entfernen, bevor Sie die Datei schreiben? Ich habe versucht, daran herum zu hacken durch die Verwendung von fs.abschneiden, aber ich bin natürlich etwas fehlt in der Dokumentation, da ich nicht bekommen kann es zu beenden abstürzt: fs.truncate(PERSISTENT_USER_SELECTED_OPTIONS_FILENAME, 0, function(err){});
  • Wie liest du die Datei, um zu sehen, was drin ist?

InformationsquelleAutor Brian | 2013-09-11
Schreibe einen Kommentar