writeFile未完全覆盖文件

writeFile未完全覆盖文件

本文介绍了node.js fs.writeFile未完全覆盖文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个长度为X的文件,它被一个长度为X-Y的字符串覆盖。问题是,文件仍然保留超过X-Y的信息,因此它与第一个较长的文件一样长。所以这是我的测试输出给我适合:

I have a file that is of length X and it is being overwritten by a string that is of length X-Y. Problem is, that the file is still retaining the information past X-Y so that it is as long as the first longer file. So here is my test output that is giving me fits:

文件开头为:

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

此后,文件现在是:

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

我已经检查过以确保sNewFile变量的长度正确,并且确实如此。在后续写入磁盘之间我也暂停了6秒钟,所以我看不出这可能是一个时间问题。

I have checked to make sure that the sNewFile variable is the correct length, and it is. 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.

如果我使用writeFileSync问题消失了,但我真的没有为这个应用程序做同步写操作的选项,因为我的计时关键时刻并且不想放慢速度来写入磁盘。

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.

我在node.js 0.8.21上,但看起来接口没有改变任何fs和最新版本之间的fs。

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.

还有其他人打过这样的东西吗?这给了我适合。 。 。

Anyone else hit anything like this? This is giving me fits. . .

推荐答案

我刚刚在0.8.21(linux)上对此进行了测试,这可以正常工作。

I've just tested this on 0.8.21 ( linux ) and this works as expected.

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

这篇关于node.js fs.writeFile未完全覆盖文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-28 07:55