2009-04-21 5 views
0

Я пытаюсь прочитать xml-файл в памяти, добавить узел, а затем записать поверх исходного файла.FileStream.truncate() не работает после вызова FileStream.readUTFBytes() (Adobe AIR)

Следующий код работает нормально (она очищает файл, а затем записывает новые байтов сверху):

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

Однако, если я пытаюсь выполнить чтение после того, как файл открыт, то положение/truncate calls не работают:

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

закрыть поток после усечения(), а затем снова открыть его. ИЛИ вместо этого используйте 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();