0

xmlファイルをメモリに読み込み、ノードを追加してから、元のファイルに上書きしようとしています。

次のコードは問題なく機能します(ファイルをクリアしてから、新しいバイトを先頭に書き込みます)。

var stream:FileStream = new FileStream();
stream.open(file, FileMode.UPDATE);
stream.position = 0;
stream.truncate();
stream.writeUTFBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
stream.writeUTFBytes(File.lineEnding);
stream.writeUTFBytes(xml.toXMLString());
stream.close();

ただし、ファイルを開いた後に読み取りを実行しようとすると、位置/切り捨ての呼び出しが機能しません。

var stream:FileStream = new FileStream();
stream.open(file, FileMode.UPDATE);

var xml:XML = XML(stream.readUTFBytes(stream.bytesAvailable));

// Modify xml here

stream.position = 0;
stream.truncate();
stream.writeUTFBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
stream.writeUTFBytes(File.lineEnding);
stream.writeUTFBytes(xml.toXMLString());
stream.close();

なぜこれが機能しないのか誰かが何か考えを持っていますか?

ストリームを調べると、最初のコードで、truncate()を呼び出した後、bytesAvailableプロパティは0になります。ただし、2番目のコードでは、bytesAvailableは変更されません(現在のファイルサイズが表示されます)。

4

1 に答える 1

1

truncate()の後でストリームを閉じてから、もう一度開きます。または、代わりにopenAsyncを使用してください。

stream.position = 0;
stream.truncate();
stream.close();
stream.open(file, FileMode.UPDATE);
stream.writeUTFBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
stream.writeUTFBytes(File.lineEnding);
stream.writeUTFBytes(xml.toXMLString());
stream.close();

また

var stream:FileStream = new FileStream();
stream.openAsync(file, FileMode.UPDATE);
stream.position = 0;
stream.truncate();
stream.writeUTFBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
stream.writeUTFBytes(File.lineEnding);
stream.writeUTFBytes(xml.toXMLString());
stream.close();
于 2009-09-29T18:12:01.500 に答える