Bri*_*ian 5 javascript file-io node.js
我有一个长度为X的文件,它被一个长度为XY的字符串覆盖.问题是,文件仍然保留过去XY的信息,因此它与第一个较长的文件一样长.所以这是我的测试输出,让我适合:
文件开头为:
{
"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"
}
}
Run Code Online (Sandbox Code Playgroud)
将正在写入的数据更改为以下内容:
{
"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"
}
}
Run Code Online (Sandbox Code Playgroud)
在此之后,文件现在是:
{
"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"
}
}}
Run Code Online (Sandbox Code Playgroud)
看到对象末端的垃圾?它是从前一个文件遗留下来的,即使我用以下代码写出来:
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);
};
Run Code Online (Sandbox Code Playgroud)
我已经检查过以确保sNewFile变量的长度是正确的,它是.在后续写入磁盘之间我也暂停了6秒,所以我看不出这可能是一个时间问题.
如果我使用writeFileSync,问题就会消失,但我真的没有为这个应用程序做同步写操作的选项,因为我的计时关键并且不想放慢写入磁盘的速度.
我在node.js 0.8.21上,但看起来接口没有改变任何fs和最新版本之间的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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9449 次 |
| 最近记录: |