Ich versuche, eine XML-Datei in den Speicher zu lesen, einen Knoten hinzuzufügen und dann über die ursprüngliche Datei zu schreiben.
Der folgende Code funktioniert einwandfrei (löscht die Datei und schreibt dann die neuen Bytes über den Anfang):
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();
Wenn ich versuche, einen Lesevorgang auszuführen, nachdem die Datei geöffnet wurde, funktionieren die Positions- / Abschneide-Aufrufe jedoch nicht:
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();
Hat jemand irgendwelche Ideen, warum das nicht funktioniert?
Wenn Sie den Stream im ersten Code untersuchen,Nach dem Aufruf von truncate () wird die Eigenschaft bytesAvailable 0 lesen. Im zweiten Code ändert sich die Anzahl der BytesAvailable nicht (es wird die aktuelle Dateigröße angezeigt).
Antworten:
1 für die Antwort № 1Schließen Sie den Stream nach dem truncate () und öffnen Sie ihn erneut. ODER verwenden Sie stattdessen 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();
ODER
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();