简体   繁体   English

node.js fs.writeFile未完全覆盖文件

[英]node.js fs.writeFile Not Completely Overwriting File

I have a file that is of length X and it is being overwritten by a string that is of length XY. 我有一个长度为X的文件,它被一个长度为XY的字符串覆盖。 Problem is, that the file is still retaining the information past XY so that it is as long as the first longer file. 问题是,文件仍然保留过去XY的信息,因此它与第一个较长的文件一样长。 So here is my test output that is giving me fits: 所以这是我的测试输出,让我适合:

File started as: 文件开头为:

{
    "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"
    }
}

Changed the data being written to the following: 将正在写入的数据更改为以下内容:

{
    "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"
    }
}

After this, the file is now: 在此之后,文件现在是:

{
    "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"
    }
}}

See the garbage on the end of the object? 看到对象末端的垃圾? It's left over from the previous file, even though I wrote it out with the following 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);
};

I have checked to make sure that the sNewFile variable is the correct length, and it is. 我已经检查过以确保sNewFile变量的长度是正确的,它是。 I also have paused as long as 6 seconds between subsequent writes out to disk, so I can't see how this could be a timing issue. 在后续写入磁盘之间我也暂停了6秒,所以我看不出这可能是一个时间问题。

If I use writeFileSync the problem goes away, but I really don't have the option to do synchronous writes for this application as I'm timing critical and don't want to have to slow down to write to the disk. 如果我使用writeFileSync,问题就会消失,但我真的没有为这个应用程序做同步写操作的选项,因为我的计时关键并且不想放慢速度来写入磁盘。

I'm on node.js 0.8.21, but it doesn't look like the interface has changed any for fs between that and the up to date version. 我在node.js 0.8.21上,但看起来接口没有更改任何fs和最新版本之间的fs。

Anyone else hit anything like this? 有人打过这样的东西吗? This is giving me fits. 这给了我适合。 . .

I've just tested this on 0.8.21 ( linux ) and this works as expected. 我刚刚在0.8.21(linux)上测试了这个,这可以按预期工作。

var fs = require('fs')

var str1 = "aaaaaaaaaa"
var str2 = "bbbbbb"
var str3 = "bbbbbbaaaa"

fs.writeFile('test',str1,function(){
  fs.writeFile('test',str2,function(){
    fs.readFile('test','utf8',function(err,buff){
      console.log(buff === str2)
      console.log(buff === str3)
    })
  })
})

output
> node test.js
true
false

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM