2009-04-21 6 views
0

J'essaie de lire un fichier XML en mémoire, d'ajouter un nœud, puis d'écraser le fichier d'origine.FileStream.truncate() ne fonctionne pas après avoir appelé FileStream.readUTFBytes() (Adobe AIR)

Le code suivant fonctionne très bien (il efface le fichier, puis écrit les nouveaux octets sur le dessus):

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

Cependant, si je tente d'effectuer une lecture après que le fichier est ouvert, la position/tronquent appels ne fonctionnent pas:

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

Est-ce que quelqu'un a des idées pourquoi cela ne fonctionne pas? Si vous examinez le flux, dans le premier code, après l'appel à truncate(), la propriété bytesAvailable affichera 0. Mais dans le second code, bytesAvailable ne changera pas (il affichera la taille actuelle du fichier).

Répondre

1

Fermez le flux après le truncate(), puis rouvrez-le. OU utilisez openAsync à la place.

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

OU

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