FileStream.truncate () не работает после вызова FileStream.readUTFBytes () (Adobe AIR) - PullRequest
0 голосов
/ 22 апреля 2009

Я пытаюсь прочитать файл 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. Но во втором коде bytesAvailable не изменится (он покажет текущий размер файла) .

1 Ответ

1 голос
/ 29 сентября 2009

закройте поток после 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();

OR

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();
...