Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js fs.writeFile未完全覆盖文件_Javascript_Node.js_File Io - Fatal编程技术网

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

Javascript node.js fs.writeFile未完全覆盖文件,javascript,node.js,file-io,Javascript,Node.js,File Io,我有一个长度为X的文件,它被一个长度为X-Y的字符串覆盖。问题是,该文件仍然保留X-Y之后的信息,因此它与第一个较长的文件一样长。下面是我的测试输出,它为我提供了拟合: 文件启动为: { "sOption1": "String", "nOption2": 23.5, "sOption3": "String", "bOption3B": true, "anOption4": [ 5, 6, 7 ],

我有一个长度为X的文件,它被一个长度为X-Y的字符串覆盖。问题是,该文件仍然保留X-Y之后的信息,因此它与第一个较长的文件一样长。下面是我的测试输出,它为我提供了拟合:

文件启动为:

{
    "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"
    }
}
将正在写入的数据更改为以下内容:

{
    "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"
    }
}}
看到物体末端的垃圾了吗?它是上一个文件的遗留文件,尽管我用以下代码编写了它:

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);
};
DeviceConfiguration.prototype.SetPersistentUserOption=函数(sNewOptionName,NewOption)
{
var sNewFile=“”;
var fs=需要('fs');
//如果其中一个基本类型很简单,只需将其添加到对象
if(typeof(NewOption)=“string”| | typeof(NewOption)=“number”| | typeof(NewOption)=“boolean”)
{
this.operInsistentUserOptions[sNewOptionName]=NewOption;
}
else if(数组的新选项实例)
{
//如果数组已经存在,请将其清空
this.operInsistentUserOptions[sNewOptionName]=[];
//现在返回并一次复制一个元素
对于(var nIndex=0;nIndex
我已检查以确保sNewFile变量的长度正确,并且是。我也在后续写入磁盘之间暂停了长达6秒的时间,所以我看不出这可能是一个时间问题

如果我使用writeFileSync,问题就不会出现了,但我真的没有为这个应用程序执行同步写入的选项,因为我的时间非常关键,不希望必须放慢速度才能写入磁盘

我使用的是node.js 0.8.21,但从这一版本到最新版本,fs的界面似乎没有任何变化


还有人打过这样的球吗?这让我很不舒服

我刚刚在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

这是什么操作系统?这听起来像是默认在
r+
模式下打开,这没有多大意义。我的代码在ubuntu上对你有用吗?是的,只是运行它。在发布之前,我做了两个类似的简单测试,不能让它失败。在0.10上测试它,或者在你编写新内容之前,通过删除文件(如果存在)来破解它。我只是用正在编写的整个函数更新了问题。我现在真的不想更新0.10。你对如何在写之前删除文件有什么建议吗?我尝试使用fs.truncate进行黑客攻击,但我显然在文档中遗漏了一些东西,因为我无法让它停止崩溃:fs.truncate(持久的用户选择的选项文件名,0,函数(错误){});我刚刚更新了这个问题,以显示我正在写什么,在写调用之后,数据直接从控制台出来。发现我的问题,writeFile正常工作。非常感谢你的帮助。我的问题是,在我的上游代码中,我连续6次写入文件,没有暂停。这导致了一个非常重复的比赛条件,看起来它不是时间。我找错地方了。