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 に答える