0

由于大量不同的错误,我一直把头撞在墙上。这是我尝试使用的代码:

fs.readFile("balance.txt", function (err, data) //At the beginning of the script (checked, it works)
{
  if (err) throw err;
  balance=JSON.parse(data);;
});
fs.readFile("pick.txt", function (err, data)
{
  if (err) throw err;
  pick=JSON.parse(data);;
});

/*....
.... balance and pick are modified
....*/

if (shutdown)
{
        fs.writeFile("balance2.txt", JSON.stringify(balance));
        fs.writeFile("pick2.txt", JSON.stringify(pick));
        process.exit(0);
}

在脚本结束时,文件没有被丝毫修改。然后我在这个网站上发现文件同时被打开了 2 次,或者类似的东西,所以我尝试了这个:

var balance, pick;
var stream = fs.createReadStream("balance.txt");
stream.on("readable", function()
{
    balance = JSON.parse(stream.read());
});
var stream2 = fs.createReadStream("pick.txt");
stream2.on("readable", function()
{
    pick = JSON.parse(stream2.read());
});

/****
****/

fs.unlink("pick.txt");
            fs.unlink("balance.txt");
            var stream = fs.createWriteStream("balance.txt", {flags: 'w'});
            var stream2 = fs.createWriteStream("pick.txt", {flags: 'w'});
            stream.write(JSON.stringify(balance));
            stream2.write(JSON.stringify(pick));
            process.exit(0);

但是,这一次,两个文件都是空的......我知道我应该捕获错误,但我只是看不出问题出在哪里。我不介意将 2 个对象存储在同一个文件中,如果有帮助的话。除此之外,我在昨天之前从未做过任何 javascript,所以,如果您知道这里失败的原因,请给我一个简单的解释。

4

1 回答 1

1

我认为您想要做的是使用 readFileSync 而不是使用 readFile 来读取您的文件,因为您需要在程序中执行任何其他操作之前读取它们(http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_options)。

这将确保您在执行任何其余代码之前已阅读这两个文件。

让你喜欢的代码这样做:

try
{
    balance = JSON.parse(fs.readFileSync("balance.txt"));
    pick = JSON.parse(fs.readFileSync("pick.txt"));
}
catch(err)
{    throw err;    }

我认为您将通过这样做获得您正在寻找的功能。

请注意,您将无法像使用 readFile 一样检查错误。相反,您需要在每次操作之前将每个调用包装在 try catch 或使用 existsSync 以确保您没有尝试读取不存在的文件。

如何为 fs.readFileSync() 捕获没有文件?

此外,您在写入时遇到了同样的问题。您正在启动异步写入,然后立即调用 process.exit(0)。更好的方法是异步顺序写入它们然后退出,或者同步顺序写入它们然后退出。

异步选项:

if (shutdown)
{
    fs.writeFile("balance2.txt", JSON.stringify(balance), function(err){
        fs.writeFile("pick2.txt", JSON.stringify(pick), function(err){
            process.exit(0);
        });
    });
}

同步选项:

if (shutdown)
{
    fs.writeFileSync("balance2.txt", JSON.stringify(balance));
    fs.writeFileSync("pick2.txt", JSON.stringify(pick));
    process.exit(0);
}
于 2013-08-20T17:13:40.580 回答